0

在下面的例子http://jsfiddle.net/anu4nits/449d5j8e/如何从onchange事件处理程序停止click事件的执行

<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事件和其他的就是点击按钮事件。如果我在文本框中写入某些内容并点击按钮,则应该分别执行change事件的处理程序和click事件的处理程序。但是,当我在变化事件的处理程序中调用模态对话框时,单击事件的处理程序没有得到执行,因为模态对话框不允许任何后台活动。但是这只与Chrome和Mozilla有关。在IE处理程序中,两个事件都得到执行。

我希望所有浏览器的一致行为,最好我不想在IE中执行点击处理程序。我也不想在全球范围内设置一些标志来进行状态检查。此外,我不能从按钮中分离事件,因为在我的应用程序按钮ID和它的处理程序在运行时生成。 是否有任何其他方式可以停止执行change事件处理程序中的click事件。

回答

0

点击和改变都是独立的事件,他们有自己的堆栈。所以你不能阻止另一个的传播,因为它们的目标元素也不同。 你可以做的是在他们的共同父母上附加事件,以便你有一个共同的处理程序。在那里你可以设置标志并执行你想要的。

0

使用stopPropagation,但更简单的方法是去同一个标志

$('#in').change(function(e) { 
    console.log('change event'); 
    dialog.dialog("open"); 
    e.stopPropagation(); 
}); 
+0

点击和更改都是单独的事件你不能停止从另一个这样的传播。您的代码将停止传播只有在dom树 – Ninja 2014-11-06 09:59:10

+0

尝试该脚本中的change事件。它会阻止触发点击事件,因为首先发生更改事件 – shaN 2014-11-06 10:12:30

+0

在哪个浏览器中执行此操作? – Ninja 2014-11-06 10:17:43

0

我需要在同一onchange定义的下一个函数的立即执行,例如:

<input onchange="Dont(this);Work()">link</input> 

在这里,我需要的不要()有条件地停止所有进一步的功能,如工作()来防止。我只是抛出了一个例外,因为其他的东西都不起作用。

function Dont(button){ 
    if($(button).data("somecondition")){ 
     throw "NeedToStopEveryFurtherCodeExecution!"; 
    } 
} 

event.stopImmediatePropagation();没有帮助。我不知道为什么,但我认为使用外部.js文件时存在问题。

我认为这比使用onchange中可能传递的每个函数中的条件解决此问题更简单。我希望这不是一个非常糟糕/不赞成的方式。