使用循环绑定事件
Use loop to bind events
//I hava this tool function to bind event
var bindEvent = function($dom,events,data,_this){
for(var key in events){
$dom.bind(key,function(){
events[key].apply(_this,[data]);
});
}
};
//and use like this
var events = {
click:function(){
alert("click");
},
dblclick:function(){
alert("dblclick");
}
};
var $btn = $("#btn");
bindEvent($btn,events,"mydata",$btn);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="btn">MYBtn</button>
当我单击按钮时,dblclick 事件始终被触发。
我知道,这个问题的原因。
绑定事件时有一个闭包,用于"for"循环。循环终止后,内存中的最后一个对象(有 dbclick 回调函数(。
因此,当触发click
事件时,它会alert("dblclick")
运行。
我想知道是否有解决这个问题的好方法。或者有一个很好的方法来实现绑定事件的工具功能。
谢谢。
在循环
for-in
创建一个closure
(同时附加event
(,inner-function
将记住创建它的环境!
var bindEvent = function($dom, events, data, _this) {
for (var key in events) {
$dom.bind(key, (function(key) {
return function() {
events[key].apply(_this, [data]);
}
})(key));
}
};
var events = {
click: function() {
console.log("click");
},
dblclick: function() {
console.log("dblclick");
}
};
var $btn = $("#btn");
bindEvent($btn, events, "mydata", $btn);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="btn">MYBtn</button>
注意:由于click
事件被调用alert
,dblclick
阻止了该事件,请使用console.log
而不是alert
并进行测试!
我不知道
为什么你需要data
,但一般来说,你不需要循环来添加多个事件。您可以将对象传递给bind
或on
。而且由于在事件中this
始终是元素,因此无需设置上下文。
$("#btn").on({
click: function() {
console.log("click");
},
dblclick: function() {
console.log("dblclick");
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="btn">MYBtn</button>
或者作为带有包装器函数的长版本:
var bindEvent = function($dom, events) {
$dom.bind(events);
};
var events = {
click: function(){
console.log("click");
},
dblclick: function(){
console.log("dblclick");
}
};
var $btn = $("#btn");
bindEvent($btn, events);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="btn">MYBtn</button>
这两个事件总是矛盾的,但您可以通过小时间间隔之间的计数器点击次数来实现这一点。
//I hava this tool function to bind event
var bindEvent = function($dom,events,data,_this){
$dom.on(events);
};
var dblckickinterval = 500, clicks = 0, timer = null;
//and use like this
var events = {
click:function(e){
clicks++; //count clicks
if(clicks === 1) {
timer = setTimeout(function() {
alert("click"); //perform single-click action
clicks = 0; //after action performed, reset counter
}, dblckickinterval);
} else {
clearTimeout(timer); //prevent single-click action
alert("dblclick"); //perform double-click action
clicks = 0; //after action performed, reset counter
}
},
dblclick:function(e){
e.preventDefault();
}
};
var $btn = $("#btn");
bindEvent($btn,events,"mydata",$btn);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="btn">MYBtn</button>
试试这个:
var eventBinder = function(obj, events) {
$.each(events, function(key, value) {
obj.on(key, function(e) {
events[key]();
});
});
}
var eventsData = {
click: function(e) {
console.log("click");
},
dblclick: function(e) {
console.log("dblclick");
}
};
eventBinder($("#btn"), eventsData);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="btn">MYBtn</button>
我不知道
确切的答案,但我试过了:
var bindEvent = function(dom,events,data,_this){
dom.bind(events,function(){
for(var key in events){
events[key].apply(_this,[data]);
}
});
}
相关文章:
- 在D3.js中,有没有任何方法可以将x和y方向上的滚动事件绑定到平移svg
- 如何在tinymce编辑器中将点击事件绑定到html标签
- 如何将事件绑定到从AJAX请求注入的HTML
- 将click事件绑定到AngularJS指令中的子元素
- Jquery将事件绑定到页面上的多个实例
- 事件绑定到动态创建的元素
- 使用jQuery进行事件绑定
- 如何将单击事件绑定到其他类
- 更改事件绑定's函数在页面加载时调用
- Jquery事件绑定获胜'当作为方法调用时不起作用,但当直接在控制台中调用时会起作用
- 动态创建的DOM元素上的jQuery事件绑定
- 我是否可以使用 Angular 将鼠标向上事件绑定到文档正文
- 将事件绑定到除 data-rel= BACK 之外的所有锚标记
- 将函数事件绑定到更改函数的复选框/标签
- 使用 Angular 和 UI-bootstrap 对模态事件绑定无法工作的指令
- 聚合物 - 将事件绑定到动态创建的元素
- 将事件绑定到其他UI组件's函数,在Kendo MVVM中
- jQuery Mobile——事件绑定
- JQuery无法将模糊事件绑定到所有<输入>页面中的元素
- 将点击事件绑定到新元素&使得ID'是独一无二的