這可能是一個愚蠢的問題。我知道我有點綠。 我的任務是修改這個舊的舊系統的導航。有兩個導航欄。第二個只有搜索按鈕。我被要求刪除第二個導航欄,並用顯示搜索功能的下拉菜單替換它。由於這個系統的時代,我受限於我可以改變的東西。我可以編寫的JS沒有任何限制。他們在Adobe ColdFusion系統上運行jQuery 1.11.1(兩個月前他們從1.3.2升級)多個同時發生的事件javascript
第一:當單擊目標時,mouseenter和click事件都會觸發。鼠標首先發射。這會在敏銳觀看者看到的桌面上產生問題,但在移動設備上會產生可怕的可用性問題。答:從我的理解中,鼠標事件不會發生在移動設備上,而是爲我執行。而B:由於mouseenter事件先運行,它會在處理click事件之前激活closeDropDown函數。在closeDropDown運行時,其.on('click', f(...eventstuff...))
會聽到用於觸發openDropDown函數的打開單擊,因此下拉不會打開。
以下是功能。 console.log
用於檢查什麼時候運行。
function openDropDown(){
$('div.dropdown').parent().on('click.open mouseenter', function(event){
$subject = $(this).find('.dropdown-menu')
// console.log(event.type, $subject, "first o");
if(!$subject.is(":visible")){
// console.log($subject, 'second o');
$subject.show()
}else {
if(event.type == 'click'){
// console.log('third o');
$subject.toggle()
}
}
closeDropDown($subject)
// console.log('open complete');
})
}
function closeDropDown($x){
// console.log('first c');
$(document).on("click.close",function(e){
// console.log("second c", e.type, "this type");
if(!$(e.target).closest(".dropdown-menu").parent().length){
// console.log("third c");
if($x.is(":visible")){
// console.log('forth c');
$x.hide()
}
}
$(document).off("click.close")
// console.log('complete close');
})
}
openDropDown()
onSearchClick()
總體而言,我知道我需要凝聚我的代碼。我知道一些方法來解決這個問題(添加if(... are we on a mobile device...)
或者一些計數器/檢查防止closeDropDown運行時,下拉關閉)
我真的想其他的東西之前持斧瞭解事件偵聽器的基本原理和原因。
雖然關於如何解決這個問題的建議很好,但我期待了解我做錯的基本原理。任何基本指針都非常有幫助。
值得注意的是:我剛纔讀到這個:.is(':visible') not working。我將用.is('visible')重寫代碼。
其他可能有所幫助的事情: 當我的所有console.log處於活動狀態時,這是Chrome開發工具控制檯。 首先,點擊頁面加載.... 下拉打開並快速關閉。
謝謝!所有的幫助表示讚賞!