onChange事件在以编程方式加载后未正确触发



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

如何防止这种情况发生?我尝试避免使用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()本身调用,另一次由绑定到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实际上是关于声明性控件的。

相关内容

  • 没有找到相关文章

最新更新