javascript事件似乎混淆了

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

我正在做一个项目,为此我编写了一个快速而肮脏的dom操作框架。。或者说功能:

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)
仍然“有效”。-)