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

时间:2015-02-06 10:48:59

标签: javascript jquery javascript-events event-handling

我有一个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()本身调用,再次由onChange处理程序调用被绑定到P7021_MSG_DEF项。

如果有人可以提供帮助吗?

此致

Arijit

1 个答案:

答案 0 :(得分:0)

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

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

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

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

我和你的情况类似,并且已经开始接受如果页面逻辑太复杂而无法使用DA实现,那么维护它可能会成为一场噩梦。就像我喜欢“正确”编程一样,Apex实际上就是声明性控制。