【发布时间】:2017-08-29 00:17:33
【问题描述】:
这可能是一个愚蠢的问题。我知道我有点绿。 我的任务是修改这个旧系统的导航。有两个导航栏。第二个只有搜索按钮。我被要求删除第二个导航栏,并将其替换为显示搜索功能的下拉菜单。由于该系统的年龄,我限制了我可以更改的内容。我能写的 JS 没有限制。他们在 Adobe ColdFusion 系统上运行 jQuery 1.11.1(两个月前他们从 1.3.2 升级)
首先:当目标被点击时,mouseenter和click事件都会触发。 mouseenter 首先触发。这会在敏锐的观众可见的桌面上导致问题,但在移动设备上,这会产生可怕的可用性问题。答:据我了解,鼠标事件不会发生在移动设备上,但会发生在我身上。而B:由于mouseenter事件先运行,所以在click事件处理之前激活closeDropDown函数。在 closeDropDown 运行的情况下,其.on('click', f(...eventstuff...)) 会听到旨在触发 openDropDown 功能的打开点击,因此下拉菜单不会打开。
这里是函数。 console.logs 用于检查什么时候运行。
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()
我已经阅读了一些帖子,希望得到一些帮助(例如 this 和 that
总的来说,我知道我需要压缩我的代码。我了解解决此问题的几种方法(添加if(... are we on a mobile device...) 或一些计数器/检查,以防止关闭下拉菜单时 closeDropDown 运行)
我真的很想了解事件侦听器的基本原理,以及为什么一个会先于其他东西运行。
虽然有关如何解决此问题的建议很棒,但我希望了解我做错了什么的基本原理。任何基本的指针都非常有用。
注意:我刚读到这个:.is(':visible') not working。我将在没有 .is('visible') 的情况下重写代码。
其他可能有帮助的事情: 当我的所有 console.log(s) 都处于活动状态时,这是 Chrome 开发工具控制台。 首先,页面加载后点击.... 下拉菜单打开并快速关闭。
谢谢!感谢您的所有帮助!
【问题讨论】:
标签: javascript jquery coldfusion