将 .on 事件与对象绑定
Binding .on events with an object
我试图在对象循环中使用 for 键绑定事件对象。
events = {
mouseup:function(data){console.log(data)},
mousedown:function(data){console.log(data)},
}
for (var key in events ) {
console.log('binding: ' + key) ;
$('body').on(key ,function(data){
console.log(key ,data);
})
}
但是,最后一个对象(鼠标按下)将绑定到这两个事件。谁能解释为什么?
查看小提琴的完整示例。
https://jsfiddle.net/2439rw4a/
是的 - 因为key
直到事件触发才被评估,到那时它已被覆盖并保持"鼠标按下"。
您需要在绑定事件时隔离 key
的当前值。您有两种选择:
1) 通过立即执行的函数闭包发送它。这将在事件回调范围内捕获key
的本地副本。
for (var key in events ) {
$('.box').on(key, (function(key) { return function(data){
console.log(key);
}; })(key));
2) 通过事件数据发送
for (var key in events ) {
$('.box').on(key, {key: key}, function(evt){
console.log(evt.data.key);
});
这是
这种错误类型的一个很好的例子。
你会得到这样的行为,因为console.log(key)
中的key
等于循环for
最后一个键。一切正常,只需更改控制台日志以显示事件类型,而不是key
:
events = {
mouseup:function(data){console.log(data)},
mousedown:function(data){console.log(data)},
}
for (var key in events ) {
console.log('binding: ' + key) ;
$('.box').on(key ,function(data){
console.log(event.type);
})
}
JSFIDDLE: https://jsfiddle.net/2439rw4a/
到事件触发时,key
的值是最后一个键。代码的执行类似于:
key = 'mouseup';
$('body').on(...);
key = 'mousedown';
$('body').on(...);
// By this time, key = 'mousedown'
// Mouse is clicked.
// When even fires, it looks for key which by now has the last key
考虑使用 Object.keys
和 array.forEach
。这样,您的处理程序就会将key
视为该迭代的值,而不是共享的key
变量。
Object.keys(events).forEach(function(key){
console.log('binding: ' + key) ;
$('body').on(key ,function(data){
console.log(key ,data);
})
});
相关文章:
- 值未与数组对象绑定
- Angular:将函数从子对象绑定到父对象
- 将 .on 事件与对象绑定
- 挖空选项对象绑定
- 对象绑定模式的rest属性应该是最后一个
- Knockout.js用单个json对象绑定一个可观察对象
- angular.js将jquery自动完成对象绑定到ng模型,将值输入到对象的属性
- Knockout:为许多数据对象绑定模板引导模式
- JavaScript 对象绑定
- 使用javascript将JSON对象绑定到asp.net gridview控件
- 如何将复杂对象绑定到剑道调度程序中的字段
- D3:如何有条件地将 SVG 对象绑定到数据
- Ko_selectize数组对象绑定未定义
- 在选择框中从任意 JavaScript 对象绑定选项值和选项文本
- 使用 jQuery 将对象绑定到一行
- 如何将当前对象绑定到文本输入
- AngularJS将javascript对象绑定到指令属性
- 子属性更改时重新评估对象绑定
- 将Angular Service对象绑定到控制器作用域并更新
- 将模型对象绑定到JavaScript数组时出现语法错误