如何从onchange事件处理程序停止执行click事件

时间:2014-11-06 09:34:54

标签: javascript jquery google-chrome internet-explorer javascript-events

在以下示例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事件。

3 个答案:

答案 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中传递的每个函数中的条件来解决这个问题更简单。我希望这不是一个非常糟糕/弃用的方式。