我有一个有望在 iPad 上运行的 Web 应用程序。我不希望为导航创建一个“下拉”HTML 元素(即一个选择元素),因为我有很多空间。我想使用我现有的桌面样式“悬停然后选择”类型导航,但用点击替换悬停事件。
我只需要支持 iPad 的移动 Safari,尽管其他浏览器支持可能是一个加分项。
以下是导航的结构:
<nav id="main_navigation">
<ul>
<li>
<a id="nav_home" href="/index.jsp">home</a>
</li>
<li class="menuHasDrop" id="selected">
<a id="parent" href="/parent.jsp">parent</a>
<span class="navArrow"></span>
<ul>
<li><a id="foo" href="/foo.jsp">foo</a></li>
<li><a id="bar" href="/bar.jsp">bar</a></li>
</ul>
</li>
<li>
<a id="baz" href="baz.jsp">baz</a>
</li>
</ul>
</nav>
以下是我检测和启用触摸的方式:
fc.enableTouch = function() {
(function() {
try {
document.createEvent('TouchEvent');
fc.touchEnabled = true;
} catch(e) {}
})();
if (fc.touchEnabled) {
$(document).ready(function() {
// disable clicks on parents
var $menus = $('.menuHasDrop');
$menus.on('click', '>a', function(e){
return false;
})
// listen for clicks on others
$('#main_navigation').on('click', $menus, function(e) {
e.stopImmediatePropagation();
var $this = $(this);
if ($this.parent().children('ul').length > 0) {
$menus.find('ul').hide();
$this.toggleClass('expanded');
if($this.hasClass('expanded')) {
$this.find('ul').show();
}
}
});
});
} else {
// console.log('not detecting touch');
}
}();
“扩展”类只是一个标志。我可以用另一种方式设置标志,但这并不重要。
所以,这一切都“有效”......但有两件事困扰着我:
当我单击它时,在父导航上会有某种阴影闪烁。我确定这是一个操作系统“点击链接”指示器,但它不是由 CSS 或 JavaScript 明确提供的。如果有人见过这样的事情,你知道如何禁用它吗?
似乎时不时地,代表子菜单的 UL 似乎会出现,消失,然后再次出现。同样,我不认为逻辑本身会导致这种情况,所以它可能是特定于浏览器的。
其他有用的背景信息:总是有一个或多个内容区域通过 ajax 调用被刷新,但页面本身没有被刷新,并且导航区域在请求期间没有任何功能作用于它。
我想我要问的不仅仅是代码审查:“这些只是我必须忍受的 iOS 怪癖吗?” 和“是否有明确的更好的触摸启用下拉菜单的做法?” 其次,所有“我发现你的代码有问题”的建议都将受到欢迎和赞赏。:)