实际测试特定事件处理程序(函数)是否使用jQuery绑定到对象的事件

时间:2017-08-01 22:28:50

标签: javascript jquery

我一直在寻找专门测试某个处理程序(函数)是否绑定到特定事件上的特定对象的方法。

我想解决的问题是我想将一个处理程序绑定到一个对象卸载事件但是我想要一种方法来测试它是否已经绑定了所以我没有绑定它两次。

1 个答案:

答案 0 :(得分:1)

这是一个适合我的解决方案。我使用此stackoverflow答案(https://stackoverflow.com/a/2518441/2512022)来创建以下函数来测试对象是否具有绑定到特定事件的特定处理程序。

此函数将Object,Event Name和handler function name作为输入参数,如果函数绑定了传入对象的事件,则返回true / false。

function testHandler(obj, sEvent, sHandlerName)
{
    var retVal = false;

    // Get all events bound to object
    var windowEvents = jQ._data(obj, "events");

    // Get all handlers for a specific event
    var handlers = windowEvents[sEvent];

    jQ(handlers).each(function() {
        // Using passed name to see if there is a match
        if(this.handler.name === sHandlerName)
        {
            retVal = true;
            return;
        }
    });

    return retVal;
}

然后按如下方式调用该函数。

// Test if there is a beforeclose() handler bound to the window objects
// "beforeunload" event

testHandler(window, "beforeunload", "beforeclose");

您甚至可以测试附加到事件的匿名处理程序是否存在。在下面的调用中,“this”引用了一个按钮,我们正在测试是否有一个匿名hanlder附加到按钮点击事件

testHandler(this, "click", "anonymous");