2012-07-13 71 views
2

假設我正在編寫一個web應用程序,並且我希望在某個函數已經在多個位置聲明之後添加某些行爲,而不會覆蓋該函數的舊行爲。在JavaScript中爲函數添加行爲?

下面是一些簡單的代碼(注意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定義將是否有一種標準的方式來實現windows.onmousedown將保留兩種行爲的行爲?

+0

是,不要使用直列事件*。請參閱'addEventListener'和(對於IE)'attachEvent',或者,更容易.. jQuery [或您選擇的框架] :) – 2012-07-13 22:13:16

回答

2

使用addEventListener()添加您的事件。它允許您註冊事件的多個事件處理程序一個元素。忘記您在示例中使用的舊事件模型。對於IE8及更高版本,您將不得不使用attachEvent()

Advanced event registration models on Quirksmode

+0

謝謝!這絕對是我的知識上的一個缺口,我將從現在開始使用事件監聽器。你知道是否有觸摸設備的「點擊」事件?現在我必須使用menu.ontouchstart = doStuff() - 這被認爲是不好的做法? – tborenst 2012-07-13 23:02:32

+0

'touchstart'應該沒問題,afaik - 只需附加高級事件模型即可。像jQuery這樣的庫可以幫助很多人附加和管理事件處理程序,因爲它隱藏了瀏覽器差異。 (我相信你的意思是簡單的'doStuff'沒有括號) – kapa 2012-07-14 09:31:35

2

這不是最好的做法,但你可以做這樣的事情:

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(); 

但是,你應該使用addEventListener()attachEvent()bažmegakapa's answer

相關問題