2

假设我正在编写一个网络应用程序,并且我想在函数在多个位置声明后向函数添加某些行为,而不覆盖函数的旧行为。

这是一些简化的代码(注意window.onmousedown函数

var createMenu = function(){
    var menu = document.createElement('ul');
    /* add things to the menu */
    window.onmousedown = function(e){
         menu.style.background = "red";
    }
}

var createSidebar = function(){
    var sidebar = document.createElement('div');
    /* add things to the sidebar */
    window.onmousedown = function(e){
         sidebar.id = "clicked";
    }
}

var createMenu();
var createSidebar();

在这种情况下,window.onmousedown 不会做它本来应该做的两件事——它在 createSidebar 中的定义将覆盖它在 createMenu 中的定义。是否有一种标准的方法来实现一种行为,其中 windows.onmousedown 将保留这两种行为?

4

2 回答 2

2

使用addEventListener()添加您的事件。它允许您为元素上的事件注册多个事件处理程序。忘记您在示例中使用的旧事件模型。

对于 IE8 及更早版本,您必须使用attachEvent().

Quirksmode 上的高级事件注册模型

于 2012-07-13T22:13:02.493 回答
1

这不是最佳实践,但您可以执行以下操作:

var createMenu = function(){
    var menu = document.createElement('ul');
    /* add things to the menu */
    window.onmousedown = function(e){
         menu.style.background = "red";
    }
}

var createSidebar = function(){
    var sidebar = document.createElement('div');
    var oldonmousedown = window.onmousedown;
    /* add things to the sidebar */
    window.onmousedown = function(e){
         sidebar.id = "clicked";
         oldonmousedown()
    }
}

var createMenu();
var createSidebar();

但是您应该在bažmegakapa 的回答addEventListener()中使用或attachEvent()喜欢

于 2012-07-13T22:25:21.770 回答