javascript - 以编程方式加载后 onChange 事件错误触发

标签 javascript jquery event-handling jquery-events

我有一个 APEX 应用程序,其中有许多下拉项。我使用 jQuery 的 bind 函数将更改事件处理程序绑定(bind)到它们。 现在,当我使用 $('#ELEMENT').trigger('apexrefresh') 以编程方式加载下拉列表的内容时,下拉列表会重新加载,但会自动触发更改事件处理程序。

如何防止这种情况发生?我尝试避免使用 bind 绑定(bind)事件处理程序,而是将 onChange 属性添加到元素。不正确的行为仍然存在。

这是骨架代码:

$(document).ready(function()  
{  
   $('#P7021_MSG_DEF').bind('change', function(e)  
   {  
      console.log('bound function onChange() msg_def');  
      updateStartWord();  
   }  
   );  
});  

function updateMsgDef()  
{  
   console.log('function  updateMsgDef() ');  
  
      $('#P7021_MSG_DEF').one('apexafterrefresh', function()  
      {  
         if( $x('P7021_RESTORE_CHK').value == 'Y')  
         {  
            setdefault('P7021_MSG_DEF', vJson.msg_def);  
         }  
         updateStartWord();  
      }  
      ).trigger('apexrefresh');  
}  

在上面的代码中,当从另一个函数调用 updateMsgDef 时,函数 updateStartWord() 被调用两次 - 一次由 updateMsgDef() 调用> 本身,并再次通过绑定(bind)到 P7021_MSG_DEF 项的 onChange 处理程序。

有人可以帮忙吗?

最佳答案

调用 $('#ELEMENT').trigger('apexrefresh') 将触发更改事件。如果不完全回到绘图板,无论你做什么,解决方案都将是一个黑客。您可以研究(并且很可能破坏)Oracle 的 javascript。您可以编写自己的 AJAX 来填充选择列表。

最简单的方法可能是检查 onChange 事件中哪个元素当前具有焦点,例如:

onChange = "if($( document.activeElement).attr('id')=='YOUR_PAGE_ELEMENT') 
                { $( document.activeElement).trigger('apexrefresh'); };"

如果用户更改了选择列表,它仍应具有焦点。不能保证它适用于所有浏览器,但我认为在当前的 Chrome 和 IE 版本中应该没问题。

我遇到过与您类似的情况,并且已经开始接受这样的事实:如果页面逻辑太复杂而无法使用 DA 实现,那么无论发生什么,维护它都可能是一场噩梦。尽管我很喜欢“正确的”编程,但 Apex 确实是关于声明性控件的。

关于javascript - 以编程方式加载后 onChange 事件错误触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28364043/

相关文章:

javascript - 运行 AJAX 脚本

JavaScript:在放置之前检查 <div> 对象的宽度

python - JTables 和 Jython 事件

java - 按钮找不到 Listener 类

c# - 几个事件处理程序/委托(delegate) block - 如何停止处理?

Javascript 使用变量属性名称来赋值

javascript - Django + jQuery - 从数据库字段值创建占位符

javascript - 无法从回调 RefreshControl 启动刷新操作

jquery - 使用 jQuery 滚动顶部 +10

javascript - JQuery 和 PHP - 更改背景图片