javascript 事件从未触发?

gjmwrych  于 2023-02-18  发布在  Java
关注(0)|答案(2)|浏览(171)

我尝试向document添加一些事件侦听器,但由于某种原因,click事件似乎从未触发,因为从未调用回调:

function NotJquery(element) {
    this.element = element;

    return this;
}

NotJquery.prototype.eventFired = function(event, callback) {
    console.log('in NotJquery prototype');
    return function (event, callback) {
        element.addEventListener(event, callback, true);
    };
};
    
var $ = function(element) {
    return new NotJquery(element);
};

function Test() {
}
    
Test.prototype.addListener = function() {
    console.log('in Test prototype');
    $(document).eventFired('click', function() {
        console.log('click event fired');
    });
};

(function() {
    var test= new Test();
    test.addListener();
}());

两条消息:“in Test prototype”和“in NotJquery prototype”都记录在控制台中,但是当我单击文档中的某个地方时,控制台中没有输出消息“click event fired”。我看不出我的代码有什么问题。有人有办法让它工作吗?
http://jsfiddle.net/Nn3tZ/1/

ruyhziif

ruyhziif1#

您的客户端代码预期如下所示:

NotJquery.prototype.eventFired = function(event, callback) {
    this.element.addEventListener(event, callback, false);
};

工作演示:http://jsfiddle.net/Nn3tZ/2/

nlejzf6q

nlejzf6q2#

element没有在eventFired函数中定义(但这不是唯一的问题)。

NotJquery.prototype.eventFired = function(event, callback) {
    var self = this; // <== Change 1 of 2

    console.log('in NotJquery prototype');
    return function () {
        self.element.addEventListener(event, callback, true);
    //  ^-- Change 2 of 2
    };
};

与其他语言(Java、C#)不同,this在引用当前对象的属性时不是可选的,另外,您在eventFired中创建的函数将不具有正确的this,因此我将其存储为self,然后在生成的函数中使用self(这是一个 * 闭包 *)。
另外,您将eventcallback传递到eventFired,但随后 * 还 * 在生成的函数上声明它们(我根本不清楚您为什么要在那里生成函数),因此您传递到eventFired的那些函数永远不会被使用。
更多阅读 (在我的贫血博客上)

相关问题