在以下示例http://jsfiddle.net/anu4nits/449d5j8e/
中
<input type="text" id="in" />
<input type="button" value="click" id="button" />
$('#in').change(function () {
console.log('change event');
dialog.dialog("open");
});
$('#button').on('click', function (e) {
console.log('click event');
});
我附加了两个事件,一个是关于文本的onchange事件,另一个是按钮上的click事件。如果我在文本框中写入内容并单击按钮,则应分别执行change事件处理程序和click事件处理程序。但是当我在更改事件的处理程序中调用模态对话框时,单击事件的处理程序没有被执行,这是预期的,因为模态对话框不会允许任何后台活动。但这只适用于chrome和mozilla。在IE处理程序中,两个事件都被执行了。
我想要所有浏览器的一致行为,我最好不要在IE中单击处理程序执行。我也不想在全球范围内放置一些标志来进行状态检查。另外,我不能像在我的应用程序按钮ID中那样从按钮分离事件,并且它的处理程序在运行时生成。 还有其他方法可以阻止更改事件处理程序执行click事件。
答案 0 :(得分:0)
使用stopPropagation,但更简单的解决方案是使用标志
$('#in').change(function(e) {
console.log('change event');
dialog.dialog("open");
e.stopPropagation();
});
答案 1 :(得分:0)
单击和更改两者都是单独的事件,它们有自己的堆栈。因此,当它们的目标元素也不同时,您无法阻止彼此传播。 你可以做的是将事件附加到他们的公共父母,以便你有一个共同的处理程序。在那里你可以设置标志并执行你想要的。
答案 2 :(得分:0)
我需要阻止立即执行在同一onchange
中定义的下一个函数,例如:
<input onchange="Dont(this);Work()">link</input>
这里我需要Dont()来有条件地停止所有其他功能,比如Work()。我只是抛出一个例外,因为其他任何东西都不起作用。
function Dont(button){
if($(button).data("somecondition")){
throw "NeedToStopEveryFurtherCodeExecution!";
}
}
event.stopImmediatePropagation();没有帮助。我不确定为什么,但我认为使用外部.js文件时存在问题。
我认为这比使用可能在onchange中传递的每个函数中的条件来解决这个问题更简单。我希望这不是一个非常糟糕/弃用的方式。