2016-09-30 97 views
-1

我不確定如果我真的瞭解它,也許它在第三個參數中,[選項]設置我沒有完全理解,但我會變直到代碼。刪除事件偵聽器仍然會觸發另一個元素被徘徊

在構建文檔時,我想添加事件偵聽器來處理keyup和keydowns。我有這一切工作,它很好。

window.addEventListener('keydown', keyinputhandler, false); 
window.addEventListener('keyup', keyinputhandler, false); 
function keyinputhandler(e) { 
//doing stuff with it here 
} 

問題在於當我使用jquery的懸停方法做某些事情時。

var someotherelement = $('#someotherelement'); 
someotherelement.hover(function(){ 
    window.removeEventListener('keydown', keyinputhandler, false); 
    window.removeEventListener('keyup', keyinputhandler, false); 
    //for some reason, the events in keyinputhandler keep firing here, why? 
    }, function() { 
    window.addEventListener('keydown', keyinputhandler, false); 
    window.addEventListener('keyup', keyinputhandler, false); 
    } 
); 

在我上面的代碼中,我包含了我想要實現的註釋區域。當我懸停一個特定的元素時,我不希望其他事件處理程序觸發。當某個元素被佔用時,如何禁用keyinputhandler的行爲?

+1

是否有可能創建小提琴或類似的問題?它使得人們更容易幫助。 – Keith

+0

會給你一個,給你幾分鐘。 – simon

+1

正如我可以測試它,您的代碼按預期工作。檢查是否由於某種原因,如果你沒有在這個元素上觸發mouseleave事件。 –

回答

-1

你能確保第一個回調正在執行嗎? jQuery「懸停」功能將第一個回調作爲偵聽器附加到「mouseenter」事件。

也許這有助於(從http://api.jquery.com/mouseenter/):

MouseEnter事件從鼠標懸停在不同它處理事件冒泡的方式。如果在此示例中使用了mouseover,那麼當鼠標指針移到Inner元素上時,處理程序將被觸發。這通常是不受歡迎的行爲。另一方面,mouseenter事件只在鼠標進入它綁定的元素時觸發其處理程序,而不是後代。所以在這個例子中,當鼠標進入Outer元素而不是Inner元素時,觸發器被觸發。

您將偵聽器附加到窗口對象。然後,您將另一個偵聽器附加到內部元素。我認爲這是問題,因爲鼠標起泡行爲。

你可以試試嗎?

$("#someotherelement") 
    .mouseover(function() { 
     window.removeEventListener('keydown', keyinputhandler, false); 
     window.removeEventListener('keyup', keyinputhandler, false); 
    }) 
    .mouseout(function() { 
     window.addEventListener('keydown', keyinputhandler, false); 
     window.addEventListener('keyup', keyinputhandler, false); 
}); 
+1

這應該留作評論,而不是答案。你可以評論當你贏得足夠的代表。在此之前,請不要使用與OP進行對話的答案。 – 2016-09-30 15:03:40

+0

我做了澄清。 – Codeicus

+0

這與我上面的代碼具有相同的效果。沒有什麼區別(從我能看到的)。 – simon

相關問題