我有一个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
答案 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实际上就是声明性控制。