对象方法Javascript HTML DOM中的多个事件监听器
Multiple Event Listeners inside of Object Method Javascript HTML DOM
这里有一些答案和一些我通过谷歌发现的东西,几乎让我到达我想要的地方,但有些东西告诉我,我在这个问题上走错了,希望得到一些帮助。
我试图简化向同一元素添加多个事件侦听器。我认为我的问题只是在调用controller.listenz()函数时没有使用正确的作用域。如有任何帮助,我将不胜感激。
我目前得到的错误是在listenz()方法中抛出,并告诉我"fn不是一个函数"。我想这是有道理的,它是一个对象,但我如何修复它?
JSFIDDLE
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>
几个问题:
-
您的
listenz
函数的fn
参数实际上代表function
,等待回调。这里,在listenz
函数中,您传递的是this
,它是controller
对象。修改为this.handleEvent
-
h
变量将把默认事件参数覆盖为listenz
函数中o
参数中指定的参数(如果有的话)。正如现在所写的,如果没有指定o
参数,它将对回调函数应用一个空数组。你想要的是应用默认参数所以你应该把它改成var h = function() { fn.apply(this, o && o instanceof Array ? o : arguments); }
最后,您永远不会初始化控制器对象。
下面是一个工作片段:
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 : arguments);
};
//bind events
for (var i = 0; i < e.length; i ++) {
ele.addEventListener(e[i], h, c);
}
},
initz: function() {
this.listenz(document.getElementById("real"), ["change"], this.handleEvent, false);
this.listenz(document.getElementById("foi"), ["change"], this.handleEvent, false);
this.listenz(document.getElementById("sim"), ["change"], this.handleEvent, false);
this.listenz(document.getElementById("rev"), ["change"], this.handleEvent, false);
},
handleEvent: function(e) {
switch (e.target.id) {
case 'real':
alert('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;
}
}
};
controller.initz()
<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>
</body>
相关文章:
- 在下拉式javascript事件监听器中选择时触发事件
- 如何在音频元素上使用React媒体合成事件监听器
- Javascript事件监听器让我很困惑
- javascript的事件监听器将下拉列表转换为输入按钮
- 组合类和事件监听器:`this`关键字
- 将事件监听器添加到画布时出错
- 如何通过javascript触发事件监听器
- 通过事件监听器在circle的文本匹配id上修改circle元素
- 动态添加javascript事件监听器,做一些无法解释的事情
- 事件处理程序&事件监听器彼此独立
- 为什么我在谷歌闭包中编写的事件监听器不起作用
- 如何在JS中使用事件监听器
- 为什么jQuery选择事件监听器会多次触发
- 为什么不'我的手机上没有设备就绪的事件监听器
- 何时在 Cocos2d-js 3.2 中注销事件监听器和定时回调
- javaScript-我们如何将一个事件监听器设置为另一个事件监听器的从属
- 微信/微信JavaScript桥(WeixinJSBridge)使用微信JSBridgeReady事件监听器并函数作为参
- ExtJS拖拽事件监听器在Chrome和Firefox上的工作方式不同
- 在这段代码中,复制自雄辩javascript的ch15,keyup事件监听器做什么
- 向音频元素添加事件监听器;不起作用