我正在尝试获取一个下拉菜单以在基于触摸的设备上正确工作。单击时,菜单打开正常,但是由于父元素也是链接,因此在选择下拉列表之前将用户带到链接。
是否有办法进行操作,以便(仅在触摸设备上)父元素的第一个点击打开下拉列表,第二次点击将您带到链接?
我对HTML和CSS有很好的了解,但实际上没有JavaScript,因此,如果解决方案是基于脚本的,请尽可能描述性。
谢谢
看DoubleTaptogo:
"当您第一次点击父项目时,DoubleTaptogo防止浏览器打开新的URL,但如果连续再次轻拍。"
http://osvaldas.info/drop-down-navigation-responsive-and-posponsive-and-touch-frylyly
这可能会有所帮助。如果您有链接
<a href="#">your drop down menu</a>
我的意思是将#
添加到href
另外在JavaScript中这样做
var link = $('.menu').find('a');
$(document).on('touchstart', link, function (e) {
e.preventDefault();
//do your stuff
});
$('.has-sub').on("touchstart", function (e) {
var submenu = $(this).find('ul').first();
var link = $(this); //preselect the link
if (link.hasClass('hover')) {
link.removeClass('hover');
$(submenu).slideUp(0);
e.stopPropagation()
return true;
} else {
$(submenu).slideDown(0);
link.addClass('hover');
e.stopPropagation();
return false; //extra, and to make sure the function has consistent return points
}
});
我的解决方案正在切换JavaScript中的HREF内容:
// JS let dropdown = document.getElementsByClassName("dropdown") let droplink = document.getElementsByClassName("drop-link") //console.log(droplink[0].getAttribute('href')) to check code for (let i = 0;i<dropdown.length;i++){ // if you have more than one dropdown dropdown[i].addEventListener('click', function(){ // if dropdown is already displaying if(dropdown[i].classList.contains('YourdisplayDropdownClass')){ droplink[i].href = 'myhtmlpage.html' } else { droplink[i].href = '#' dropdown[i].classList.add('YourdisplayDropdownClass'); } }); };
HTML中的结构
<nav> <ul> <li class="dropdown"><a class="drop-link" ref="myhtmlpage.html">MyHTMLpage</a> <ul class="drop-menu"> <li><a href="mysubpage1.html" class="drop-item">MySubpage1</a></li> <li><a href="mysubpage2.html" class="drop-item">MySubpage2</a></li> </ul> </li> </ul> </nav>
对于那些仍在寻找一种方法的人,我有一个解决方案:
首先,您可以通过检测主输入类型是pointer: coarse
(https://stackoverflow.com/a/52855084)来检测设备是否为触摸屏
然后,如果设备是触摸设备,请计算单击链接的次数。在第一次单击时,请使用.preventDefault()
防止默认行为,并且下拉次数应打开,但不应打开链接。在第二次点击中,不要抑制此行为,链接将打开。
因此,定义一个变量以跟踪计数,在单击链接上添加您的在链接中添加函数,并防止默认操作(如果是第一次单击):
var dropdown_clicked = 0;
//for touchscreens, click 1 = open dropdown, click 2 = open link
$("#dropdown > a").on('click', function (e) {
if(window.matchMedia("(pointer: coarse)").matches) {
//pointer:coarse = touchscreen
dropdown_clicked += 1;
if (dropdown_clicked == 1){
e.preventDefault();
}
if (dropdown_clicked == 2){
dropdown_clicked = 0;
}
}
确保您的功能是在$(document).ready(function(){ });
中定义的,因为此方法使用jQuery。
对于上下文,我有这样的方法可以在悬停上打开下拉菜单:
$("#dropdown").hover(function () {
//slideToggle = display or hide the matched elements with a sliding motion
//stop(true,true) stops the animation from repeating
$(this).find('ul').stop(true, true).slideToggle('medium');
});
和下拉html:
<ul>
<li><a href="index.php">home</a></li>
<li id="dropdown"><a href="page.php">my dropdown</a>
<ul>
<li>dropdown content</li>
<li>dropdown content</li>
</ul>
</li>
</ul>
function createMenu(menuName,menuTitle,menuEntries,left,width) {
numEntries = menuEntries.length;
document.write('<div class="menuTitle" style="left:0px; width:100px;"');
document.write('onMouseover="menuToggle('' + menuName + '');"');
document.write('onMouseout="menuToggle('' + menuName + '');">');
document.write(menuTitle);
document.write('</div>');
document.write('<div id="myMenu" class="menu" style="left:0px; width:100px;"');
document.write('onMouseout="menuToggle('' + menuName + '')">');
for (i = 0; i < numEntries; i++) {
document.write('<a href="' + menuEntries[i].url + '" class="menuEntry">' + menuEntries[i].entry + '</a><br>');
}
document.write('</div>');
}
function menuToggle(target) {
targetMenu = (document.getElementById) ? document.getElementById(target).style : eval("document." + target);
targetMenu.top = (parseInt(targetMenu.top) == 22) ? -2000 : 22;
}
// -->
</script>
这是JavaScript,用于创建一个下拉菜单,该下拉菜单在鼠标悬停在鼠标上时会掉落 - 它来自Arman Danesh的10个简单步骤或更少的简单步骤的书籍。他是一位伟大的作家,可能会比我更好地解释这一点 - 但是这里;
您正在做的是创建一个具有预定义变量的函数,如()声明。线 Numentries ... 将变量数字的值设置为预定义变量菜单的长度。换句话说,(在此示例中,编程的条目数为三个,使numentries = 3)但是,您代码的许多条目是numentries的值。
document.write的内容看起来可能令人困惑,但它只是包含HTML代码的JavaScript代码,因为仅将DIV放置在其上会破坏程序,因为您将其放入脚本标签中。如果您在任何时候都不理解我,请问您以后再说我的教科书中有什么。
这是第一个功能,第二个功能是使鼠标悬停的菜单下拉菜单的原因。我不知道如何在不引用这本书的情况下向您解释这一点,但是如果您需要我解释一下,我会尝试的。如果您还需要显示菜单的HTML代码,我可以为您提供整个示例,我可以在计算机上。
希望这会有所帮助,请问您是否需要我遍历任何事情。我将继续研究如何为您更改触摸屏X