0

我正在尝试向 中添加一些事件侦听器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();
}());

两个消息:“在测试原型中”和“在 NotJquery 原型中”都记录在控制台中,但是当我单击文档中的某个位置时,控制台中不会输出消息“单击事件触发”。我看不出我的代码有什么问题。有人有想法让它工作吗?

http://jsfiddle.net/Nn3tZ/1/

4

2 回答 2

1

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没有 right this,所以这就是为什么我将它作为self然后self在生成的函数(这是一个闭包)中使用的原因。

另外,您正在传递eventcallback进入eventFired,但随后也在生成的函数上声明它们(我根本不清楚为什么要在那里生成函数),因此您传递的那些eventFired永远不会被使用。

更多阅读(在我贫血的博客上)

于 2012-11-03T14:03:14.223 回答
1

您的客户端代码需要这样的东西:

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

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

于 2012-11-03T14:04:21.340 回答