Javascript 传递到.on()函数中的变量始终是最后一个元素
我在模拟主干网的事件系统,对象如下:Javascript 传递到.on()函数中的变量始终是最后一个元素,javascript,jquery,Javascript,Jquery,我在模拟主干网的事件系统,对象如下: var events = { 'click .one': 'fnOne', 'click .two': 'fnTwo', 'click .three': 'fnThree' } 然后,要使用jquery设置事件侦听器,我将使用以下命令: var method, match, event_name, selector; var scope = { // Complex object literal
var events = {
'click .one': 'fnOne',
'click .two': 'fnTwo',
'click .three': 'fnThree'
}
然后,要使用jquery设置事件侦听器,我将使用以下命令:
var method,
match,
event_name,
selector;
var scope = {
// Complex object literal passed to the event's
// function for access...
};
var delegateEventSplitter = /^(\S+)\s*(.*)$/;
for (key in events) {
if (events.hasOwnProperty(key)) {
method = events[key];
match = key.match(delegateEventSplitter);
event_name = match[1];
selector = match[2];
$('#element').on(event_name,selector,function(event){
method(event,scope);
});
}
}
我遇到的问题是,它绑定正确,除了所有事件触发最后一个函数
fntree
只是一个闭包/循环问题。闭包只绑定词法名称,而不绑定当时的值
我最喜欢的获取值的方法之一是使用:
for (key in events) {
if (events.hasOwnProperty(key)) {
method = events[key];
match = key.match(delegateEventSplitter);
event_name = match[1];
selector = match[2];
with ({method:method})
{
$('#element').on(event_name,selector,function(event){
method(event,scope);
});
}
}
}
但这会导致Doug Crockford的一些助手死于心脏病发作,所以你也可以这样做:
(function(method) { $('#element').on(event_name,selector,function(event){
method(event,scope);
}); })(method);
我会让你决定你觉得哪个更可取。只是一个闭包/循环问题。闭包只绑定词法名称,而不绑定当时的值 我最喜欢的获取值的方法之一是使用:
for (key in events) {
if (events.hasOwnProperty(key)) {
method = events[key];
match = key.match(delegateEventSplitter);
event_name = match[1];
selector = match[2];
with ({method:method})
{
$('#element').on(event_name,selector,function(event){
method(event,scope);
});
}
}
}
但这会导致Doug Crockford的一些助手死于心脏病发作,所以你也可以这样做:
(function(method) { $('#element').on(event_name,selector,function(event){
method(event,scope);
}); })(method);
我会让你决定哪一个更可取。尝试使用$。each()
。它的函数参数在每次迭代时方便地形成一个闭包
$.each(events, function(key, method) {
var match = key.match(delegateEventSplitter);
$('#element').on(match[1], match[2], function(event){
method(event, scope);
});
});
尝试使用$.each()
。它的函数参数在每次迭代时方便地形成一个闭包
$.each(events, function(key, method) {
var match = key.match(delegateEventSplitter);
$('#element').on(match[1], match[2], function(event){
method(event, scope);
});
});
+1对于
with()
方法的非常好的用法。。。即使有些人认为它对我不利,也可以用{方法:事件[KEY] } /Cuff>做<代码>,使其更加简洁。与自调用闭包一样,您可以将事件[key]
作为参数传递。我使用IFFE,不想激怒Crock alytes:-)不想破坏聚会,但即使是Brendan Eich也说with
是JavaScript中的一个大错误。使用它将在严格模式下抛出错误。因此,不使用它不仅仅是“约定”的问题。当包装在具有未知词汇捕获的任意动态对象上时,使用在中赋值是一个问题。在with
上使用对象文字类似于使用ECMAScript Harmony即将推出的let
+1,以便更好地使用with()
方法。。。即使有些人认为它对我不利,也可以用{方法:事件[KEY] } /Cuff>做<代码>,使其更加简洁。与自调用闭包一样,您可以将事件[key]
作为参数传递。我使用IFFE,不想激怒Crock alytes:-)不想破坏聚会,但即使是Brendan Eich也说with
是JavaScript中的一个大错误。使用它将在严格模式下抛出错误。因此,不使用它不仅仅是“约定”的问题。当包装在具有未知词汇捕获的任意动态对象上时,使用
在中赋值是一个问题。在上使用对象文字与
类似于使用ECMAScript Harmony即将推出的let
。