javascript事件似乎混淆了
我正在做一个项目,为此我编写了一个快速而肮脏的dom操作框架。。或者说功能:javascript事件似乎混淆了,javascript,events,Javascript,Events,我正在做一个项目,为此我编写了一个快速而肮脏的dom操作框架。。或者说功能: var $ = function(e, properties){ var elem = document.getElementById(e) || false; if(!elem && properties){ elem = document.createElement('div'); elem.id = e; for(i in pro
var $ = function(e, properties){
var elem = document.getElementById(e) || false;
if(!elem && properties){
elem = document.createElement('div');
elem.id = e;
for(i in properties){
switch(i){
case 'parent':
properties.parent.appendChild(elem);
break;
case 'events':
for(j in properties.events){
elem.addEventListener(j, function(e){
e.preventDefault();
properties.events[j](e, elem);
});
}
break;
default :
elem[i] = properties[i];
break;
}
}
}
return elem;
};
只要我在整个项目中使用一个事件监听器,一切似乎都正常工作,但是,当我添加另一个元素时,事件会混淆,我会得到一个click事件,其中应该发出contextmenu事件,事情就会变得一团糟。它似乎想调用错误的函数
问题演示:变量“i”和“j”是全局的。它们应该在函数中用var
声明:
var i, j;
然而,这并不能解决问题。在您创建的事件侦听器函数中,仍然有对“j”的引用,这仍然是每个处理程序对同一个变量的引用。一个变量一次只能有一个值,该值将是分配最后一个处理程序时的“j”
您需要添加另一层函数调用,以便为每个处理程序创建唯一的作用域:
elem.addEventListener(j, function(jCopy) {
return function(e){
e.preventDefault();
properties.events[jCopy](e, elem);
};
}(j));
实现同样的目标还有其他方法,但它们或多或少都是相同的想法。有无数与Stackoverflow相关的问题。变量“i”和“j”是全局变量。它们应该在函数中用var
声明:
var i, j;
然而,这并不能解决问题。在您创建的事件侦听器函数中,仍然有对“j”的引用,这仍然是每个处理程序对同一个变量的引用。一个变量一次只能有一个值,该值将是分配最后一个处理程序时的“j”
您需要添加另一层函数调用,以便为每个处理程序创建唯一的作用域:
elem.addEventListener(j, function(jCopy) {
return function(e){
e.preventDefault();
properties.events[jCopy](e, elem);
};
}(j));
实现同样的目标还有其他方法,但它们或多或少都是相同的想法。有无数与Stackoverflow相关的问题。变量“i”和“j”是全局变量。它们应该在函数中用var
声明:
var i, j;
然而,这并不能解决问题。在您创建的事件侦听器函数中,仍然有对“j”的引用,这仍然是每个处理程序对同一个变量的引用。一个变量一次只能有一个值,该值将是分配最后一个处理程序时的“j”
您需要添加另一层函数调用,以便为每个处理程序创建唯一的作用域:
elem.addEventListener(j, function(jCopy) {
return function(e){
e.preventDefault();
properties.events[jCopy](e, elem);
};
}(j));
实现同样的目标还有其他方法,但它们或多或少都是相同的想法。有无数与Stackoverflow相关的问题。变量“i”和“j”是全局变量。它们应该在函数中用var
声明:
var i, j;
然而,这并不能解决问题。在您创建的事件侦听器函数中,仍然有对“j”的引用,这仍然是每个处理程序对同一个变量的引用。一个变量一次只能有一个值,该值将是分配最后一个处理程序时的“j”
您需要添加另一层函数调用,以便为每个处理程序创建唯一的作用域:
elem.addEventListener(j, function(jCopy) {
return function(e){
e.preventDefault();
properties.events[jCopy](e, elem);
};
}(j));
实现同样的目标还有其他方法,但它们或多或少都是相同的想法。关于Stackoverflow有无数相关的问题。您应该了解实例和
new
关键字是如何工作的!在document.getElementById(e)| | false
中,不需要| | false
。如果getElementById找不到元素,它将返回null,因此如果(!elem&&properties)
仍然“有效”。-)您应该了解实例和new
关键字是如何工作的!在document.getElementById(e)| | false
中,不需要| | false
。如果getElementById找不到元素,它将返回null,因此如果(!elem&&properties)
仍然“有效”。-)您应该了解实例和new
关键字是如何工作的!在document.getElementById(e)| | false
中,不需要| | false
。如果getElementById找不到元素,它将返回null,因此如果(!elem&&properties)
仍然“有效”。-)您应该了解实例和new
关键字是如何工作的!在document.getElementById(e)| | false
中,不需要| | false
。如果getElementById找不到元素,它将返回null,因此如果(!elem&&properties)
仍然“有效”。-)