2011-02-01 65 views
0

我想爲2個不同的事件發射執行相同的動作。我遇到的問題是其中一個事件觸發另一個事件。我使用的是JavaScript和Mootools,事件也在td單元內的'input'元素上設置。Javascript double event firing unwanted

當元素失去焦點(onBlur)並且用戶按下'Enter'鍵(onKeypressed)時,我想要觸發操作'save'。問題來自於「保存」行爲本身就是'onBlur'事件。所以當我按下'enter'時,保存操作會被執行2次,並且會從腳本中創建一個不想要的行爲。

這裏的 '保存' 功能( '本' 是輸入端ELEM)

storeUpdt(this); this.getParent().appendText(this.value); this.getParent().addEvent(....); this.destroy();

所以,如果你有任何想法,謝謝!

回答

0

您可以隨時使用互斥鎖來阻止第二個事件處理程序。

function fireSave(event) { 
    if (this._saving) { 
    return; 
    } 
    try { 
    this._saving = true; 
    // do whatever stuff 
    } 
    finally { 
    this._saving = false; 
    } 
} 

function onKeyPressed(event) { 
    // make sure the pressed key is ENTER 
    fireSave(); 
} 

var input = document.getElementById('whatever_input_id'); 
input.addEventHandler('blur', fireSave, false); 
input.addEventHandler('keypressed', onKeyPressed, false); 
+0

不是最優雅但最有效率的! – Smithfield 2011-02-07 21:09:46

0

我知道,這顯然是過度設計,但我傾向於做的是剛剛1事件處理程序,然後使用其他調用第一個。

如:http://www.jsfiddle.net/dimitar/VaZGC/

var input = document.id("myinput"), output = document.id("output"), saveValues = function(what) { 
    output.set("html", what); 
}; 

input.addEvents({ 
    blur: function() { 
     saveValues(this.get("value")); 
    }, 
    keyup: function(e) { 
     if (e.key == "enter") { 
      this.blur(); // this will be just fine. 
     } 
    } 
}); 

,你也可以做.fireEvent("blur", event)但因爲雖然它會調用saveValues,也不會模糊,然後在模糊它會再次運行它,它不在這裏實用。

+0

不知道我是否以正確的方式寫下了它,但它不起作用?! – Smithfield 2011-02-07 21:09:13

0

其實我發現按鍵事件觸發有很多不同的行爲取決於瀏覽器!在我使用Chrome的時候,「進入按鍵火災模糊事件」這個竅門並沒有奏效,但對於Opera來說,它工作得很好。

所以我最終決定使用Mootools特定的按鍵事件管理器,它在任何瀏覽器(包括'Tab'事件! 希望它會幫助!