点击' class'中的eventlistener引用同一个类中的函数是行不通的

时间:2014-06-29 10:07:33

标签: javascript

我无法弄清楚为什么这不起作用。 cThis.menuClick没有接收到该事件,但它确实被调用了。

// no event passed to cThis.menuClick
var Menu = new function() {
    var cThis           = this;
    // .....
    cThis.menuItems     = cThis.element.querySelectorAll('#menu-items a.menu-item');

    for(var i=0; i<cThis.menuItems.length; i++) {
        cThis.menuItems[i].addEventListener('click', cThis.menuClick, false);
    }

    cThis.menuClick = function(event, returning) {
        if (event) { event.preventDefault(); }
        // not prevented
    }

}

我用这种方式解决了这个问题:

// event passed, working!
var Menu = new function() {
    var cThis           = this;
    // .....
    cThis.menuItems     = cThis.element.querySelectorAll('#menu-items a.menu-item');

    for(var i=0; i<cThis.menuItems.length; i++) {
        cThis.menuItems[i].addEventListener('click', mC, false);
    }
    function mC(event) {
        cThis.menuClick.call(this, event);
    }

    cThis.menuClick = function(event, returning) {
        if (event) { event.preventDefault(); }
        // prevented
    }

}   

虽然这种解决方法有效,但我想知道为什么第一个代码不是? 代码包含在命名空间中:

var NS = new function() {
}

1 个答案:

答案 0 :(得分:0)

附加事件时未定义

menuClick。在将函数注册到事件监听器之前,只需将该函数分配给menuclick属性。

var Menu = new function() {
    var cThis           = this;
    // .....
    cThis.menuItems     = cThis.element.querySelectorAll('#menu-items a.menu-item');

    cThis.menuClick = function(event, returning) {
        if (event) { event.preventDefault(); }
        // not prevented
    }

    for(var i=0; i<cThis.menuItems.length; i++) {
        cThis.menuItems[i].addEventListener('click', cThis.menuClick, false);
    }

}