【发布时间】:2015-10-22 01:02:37
【问题描述】:
这里有一些答案以及我通过谷歌找到的一些东西,几乎可以让我到达我想去的地方,但有些东西告诉我我正在解决这个问题并希望得到一些帮助。
我正在尝试简化将多个事件侦听器添加到同一元素的过程。我认为我的问题只是在调用 controller.listenz() 函数时我没有使用正确的范围。任何帮助将不胜感激。
我目前遇到的错误是在 listenz() 方法中抛出的,并告诉我“fn 不是函数”。我猜这是有道理的,它是一个对象,但我该如何解决呢?
Javascript
var controller = {
realtime: true,
listenz: function(ele, e, fn, c, o) {
//validate
if (!(e instanceof Array)) {
throw 'Javascript Listener: Error 642';
}
var h = function() {
fn.apply(this, o && o instanceof Array ? o : []);
};
//bind events
for (var i = 0; i < e.length; i += 1) {
ele.addEventListener(e[i], h, c);
}
},
initz: function() {
this.listenz(document.getElementById("real"), ["change"], this, false);
this.listenz(document.getElementById("foi"), ["change"], this, false);
this.listenz(document.getElementById("sim"), ["change"], this, false);
this.listenz(document.getElementById("rev"), ["change"], this, false);
},
handleEvent: function(e) {
switch (e.target.id) {
case 'real':
console.log('real');
//this.realtime = e.target.checked ? true : false;
//this.realz();
//if (this.realtime) this.submitz();
break;
default:
console.log('default');
//if (this.realtime) this.submitz();
break;
}
}
};
HTML
<body>
<div class="wrapper">
<ul>
<li>
Real
<input type="checkbox" name="real" id="real">
</li>
<li>
Strip
<input type="checkbox" name="sim" id="sim">
</li>
<li>
Reverse
<input type="checkbox" name="rev" id="rev">
</li>
<li>
Foil
<input type="checkbox" name="foi" id="foi">
</li>
</ul>
</div>
<script>
controller.initz();
</script>
</body>
【问题讨论】:
-
c应该是回调函数,这里传递this。显然,this不是一个函数。在你的initz函数中,我想你想要this.listenz(yourElement, ["change"], handleEvent, false); -
@Kaiido 如果我使用 this.handleEvent,它会告诉我事件未定义,特别是“无法读取未定义的属性‘目标’”。有什么想法吗?
-
知道为什么我的小提琴不起作用吗? jsfiddle.net/incept0/rn7rx6fr/2
-
您的控制器从未启动过,h 应该是
h: function(){fn.apply(this, o && o instanceof Array ? o : arguments); };。 updated fiddle -
@Kaiido 您能否修改小提琴以反映您的意思。当前在 listenz 函数中的 h 函数。您是说将其取出并使其成为控制器对象的方法吗?我怎么称呼它?
标签: javascript html dom javascript-objects addeventlistener