我无法弄清楚为什么这不起作用。 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() {
}
答案 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);
}
}