我有一个 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/