2015-02-23 40 views
1

例如,如果您有下面的代碼,那麼mousedown沒有發生時mousemovemouseup事件會被破壞嗎?當父事件結束時,子監聽器是否被破壞?

var el = document.getElementById('mydiv'); 
el.addEvenListener('mousedown', function(event){ 
    initializeStuff(); 

    document.onmousemove = function(event) { 
    event = event || window.event; 
    showDragAnimation(); 
    }; 

    doucment.onmouseup = function() { 
    showFinalPosition(); 
    }; 

}, false); 
+0

不,他們不是,你已經刪除它們的代碼。 – Teemu 2015-02-23 19:18:31

+0

否。除非文件被銷燬,否則這些事件將起作用。 – 2015-02-23 19:19:09

+0

@Teemu或@jsve,這意味着'mouseup'會隨時觸發?或者只有在「mousedown」發生時纔會啓動? – ayjay 2015-02-23 19:23:04

回答

2

不,它們不會被破壞 - mousedown不知道是「沒有發生」。由於JS不能同時運行,所以這無意義。

如果您的代碼確實使用了addEventListener,那麼它將會嚴重地泄漏事件處理程序,並且您的應用程序會變得非常噁心(每次點擊的次數會更多)。只有您使用覆蓋以前聽衆的舊on…屬性才能使您免於這種命運。

你將要使用

function onmousedown(event) { 
    this.addEventListener("mousemove", onmousemove, false); 
    this.addEventListener("mouseup", onmouseup, false); 
    initializeStuff(); 
} 
function onmousemove(event) { 
    showDragAnimation(); 
} 
function onmouseup(event) { 
    this.removeEventListener("mousemove", onmousemove); 
    this.removeEventListener("mouseup", onmouseup); 
    showFinalPosition(); 
} 

document.getElementById('mydiv').addEvenListener('mousedown', onmousedown, false); 
+0

請注意,當瀏覽器視圖外部發生時,有時會在文檔上觸發'onmouseup'。這可能會產生奇怪的體驗,您可能需要採取一些防範措施。 – Bergi 2015-02-23 19:32:04

+0

謝謝。我更喜歡你的格式。此外,關於將相同的EventListener添加到您之前指出的元素中: *「如果多個相同的EventListener在同一個EventTarget上使用相同的參數註冊,則會丟棄重複的實例,它們不會導致EventListener成爲調用兩次,並且由於重複項被丟棄,所以不需要使用removeEventListener方法手動刪除它們。「* [MDN source](https://developer.mozilla.org/en-US/docs/Web/ API/EventTarget/addEventListener#Multiple_identical_event_listeners) – ayjay 2015-02-23 19:36:07

+0

@ayjay:是的,但是在你原來的代碼中,你已經使用了函數表達式,這將導致不同的功能:-) – Bergi 2015-02-23 19:38:08