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

How to stop execution of click event from onchange event handler

本文关键字:执行 click 事件 程序 onchange 事件处理      更新时间:2023-09-26

在以下示例中https://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事件,另一个是按钮上的点击事件。如果我在文本框中写了一些东西并单击按钮,那么应该分别执行更改事件的处理程序和单击事件的处理。但是,当我在change事件的处理程序中调用模态对话框时,click事件的处理过程没有被执行,这是预期的,因为模态对话框不允许任何后台活动。但这只适用于Chrome和Mozilla。在IE处理程序中,正在执行这两个事件。

我希望所有浏览器的行为保持一致,最好不要在IE中执行点击处理程序。我也不想在全局级别设置一些用于条件检查的标志。此外,我无法将事件与按钮分离,因为在我的应用程序中,按钮ID及其处理程序是在运行时生成的有没有其他方法可以从change事件的处理程序中停止执行click事件

Click和Change都是独立的事件,它们有自己的堆栈。因此,你无法阻止一个元素与另一个元素的传播,因为它们的目标元素也不同。您可以做的是将事件附加到它们的公共父级,以便为它们提供一个公共处理程序。在那里你们可以设置标志并执行你们想要的操作。

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

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

在这里,我需要Dont()来有条件地停止所有进一步的函数,如Work()。我只是抛出了一个异常,因为其他任何操作都不起作用。

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

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

我认为这比在onchange中传递的每个函数中使用条件来解决这个问题更简单。我希望这不是一种非常糟糕/不受欢迎的方式。

使用stopPropagation,但更简单的解决方案是使用标志

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