如何在未直接触发的情况下停止事件

How to stop an event if not triggered directly?

本文关键字:情况下 事件 接触      更新时间:2023-09-26

假设存在textboxbutton。点击按钮时,执行一个功能,在文本框的focusout上,点击按钮。我想知道的是,有没有一种方法,我可以确定用户clicked的按钮,是由textboxfocusout事件触发的,这样我就可以在的click事件中做一些自定义工作,如果它是由文本框的focusout触发的?

我可以写一些代码,但我甚至不知道从哪里开始,我知道jQuery eventevent.which属性,但我想知道它/它们在这种情况下是否有用?

您可以使用event.target来确定哪个DOM元素启动了事件,然后您可以检查这是按钮还是文本框。

查看此以了解更多信息:http://api.jquery.com/event.target/

来自文档:

event.target

目标属性可以是为事件注册的元素或其后代。将event.target与这是为了确定事件是否由于事件而被处理起泡。当事件泡沫。

这取决于您如何从textarea blur事件触发函数,如果您只是使用以下方法触发click事件:

$('#btn').click(
    function(e){
        buttonActivation(e);
    });
$('#txt').blur(
    function(e){
        $('#btn').click();
    });

然后,我建议评估originalEvent对象以查看原始事件是什么(如果没有originalEvent,则函数由程序化的click事件使用jQuery调用;而如果originalEvent.type评估为click,则按钮必须已单击。

function buttonActivation(e) {
    if (!e) {
        return false;
    }
    else {
        var oEvent = e.originalEvent;
        if (oEvent === undefined) {
            console.log('Programmatic event');
        }
        else if (oEvent.type == 'click') {
            console.log('User-initiated event');
        }
    }
}

JS Fiddle演示。

然而,如果您正在使用类似以下的东西(只是从不同的地方调用相同的函数):

$('#btn').click(
    function(e){
        buttonActivation(e);
    });
$('#txt').blur(
    function(e){
        buttonActivation(e);
    });

那么我建议直接评估e.targete.type:

function buttonActivation(e) {
    if (!e) {
        return false;
    }
    else {
        var oEvent = e.type;
        if (oEvent === 'blur') {
            console.log('Programmatically-triggered event, on ' + oEvent);
        }
        else if (oEvent == 'click') {
            console.log('User-initiated ' + oEvent + ' event');
        }
    }
}

JS Fiddle演示。

您可以使用event.target。默认情况下,jquery将事件提供给处理程序函数。下面是一个例子:jsfiddle

您可以在触发事件时传递额外的参数,并在事件处理程序中检查它们。

所以如果你写

button$.trigger('click', 'hello');

然后你可以像一样编写处理程序

button$.on('click', function(e, someStr) {
    console.log(someStr || 'Nothing passed');
    // Obviously if someStr is undefined, the user clicked the button,
    // otherwise the $.trigger() method has been called.
});