【问题标题】:Javascript causing mobile navigation to require a 'double tap for links to workJavascript 导致移动导航需要“双击才能使链接正常工作”
【发布时间】:2018-09-01 16:53:02
【问题描述】:

我注意到在我的网站的移动版本 (iOS) 上,主导航需要点击两次链接才能重定向页面。删除各种样式/代码后,我找到了问题的原因,这是我的“滑动线”悬停效果的 Javascript。

我的基本理解是,由于脚本仍在移动设备上运行,当它不是真正需要时,这意味着导航正在运行/期待悬停效果,一旦运行,您就可以按您的意愿点击链接?

脚本在桌面上运行完美,所以我不想更改任何功能,但我可以添加一些东西来防止移动设备上的这个错误吗?或者,一个javascript“媒体查询”类型的东西,阻止脚本在1000px以下运行是一个更好的解决方案吗?如果是这样,实现它的最佳方法是什么?

提前致谢!

CodePen: https://codepen.io/moy/pen/pZdjMX

$(function() {
  var $el,
    leftPos,
    newWidth,
    $mainNav = $(".site-nav__list");

  $mainNav.append("<div class='site-nav__line'></div>");
  var $magicLine = $(".site-nav__line"),
    $currentMenu = $(".current-menu-item");

  $magicLine
    .width($currentMenu.length ? $currentMenu.width() : 0)
    .css("left", $currentMenu.length ? $currentMenu.find("a").position().left : 0)
    .data("origLeft", $magicLine.position().left)
    .data("origWidth", $magicLine.width());

  var hoverOut;

  $(".site-nav__list li a").hover(function() {
      clearTimeout(hoverOut);

      $el = $(this);
      leftPos = $el.position().left;
      newWidth = $el.parent().width();

      if (!$magicLine.width()) {
        $magicLine.stop().hide().css({
          left: leftPos,
          width: newWidth
        }).fadeIn(100);
      } else {
        $magicLine.stop().animate({
          opacity: 1,
          left: leftPos,
          width: newWidth
        });
      }
    },
    function() {
      hoverOut = setTimeout(function() {
        if (!$currentMenu.length) {
          $magicLine.fadeOut(100, function() {
            $magicLine.css({
              left: $magicLine.data("origLeft"),
              width: $magicLine.data("origWidth")
            });
          });
        } else {
          $magicLine.stop().animate({
            left: $magicLine.data("origLeft"),
            width: $magicLine.data("origWidth")
          });
        }
      }, 100);
    }
  );
});
/* Header */

.page-head {
  background: white;
  border-top: 2px solid #ddd;
  box-sizing: border-box;
  overflow: hidden;
  padding: 0 30px;
  position: relative;
  width: 100%;
}

.page-head__logo {
  background-image: none;
  float: left;
  padding: 0;
  text-shadow: none;
  width: 200px;
}


/* Nav */

.site-nav {
  display: block;
  float: right;
  text-align: center;
  width: auto;
}

.site-nav__list {
  list-style: none;
  margin: 0;
  padding: 0;
  position: relative;
  top: auto;
  left: auto;
  width: auto;
}

.site-nav__list li {
  background: none;
  display: block;
  float: left;
  margin: 0;
  padding-left: 0;
  text-transform: uppercase;
}

.site-nav__list a {
  box-sizing: border-box;
  display: block;
  font-weight: 900;
  padding: 30px 15px;
  transition: color .15s;
  text-shadow: none;
}

.site-nav__list a {
  color: red;
}

/* Underline */

.site-nav__line {
  background: red;
  content: "";
  display: block;
  height: 2px;
  position: absolute;
  top: -2px;
  left: 0;
  width: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<body>
  <header class="page-head">

      <a href="#" class="page-head__logo">Logo Here </a>

      <nav class="site-nav ">
          <ul class="site-nav__list">
            <li class="site-nav__item "><a href="#" class="site-nav__link">About</a></li>
            <li class="site-nav__item"><a href="#" class="site-nav__link">Looooonger Title</a></li>
            <li class="site-nav__item"><a href="#" class="site-nav__link">Company</a></li>
            <li class="site-nav__item"><a href="#" class="site-nav__link">About</a></li>
            <li class="site-nav__item"><a href="#" class="site-nav__link">Login</a></li>
            <li class="site-nav__item"><a href="#" class="site-nav__link amp">Apply</a></li>
          </ul>
    </nav>

  </header>
</body>

【问题讨论】:

    标签: javascript jquery html css touch


    【解决方案1】:

    如果你的问题是你在重定向到它的页面之前双击它,试试这个

    $('.site-nav__list a').click(function(){
    $(this).click();
    

    });

    功能是当你点击导航时脚本会再次点击,

    【讨论】:

    • 这实际上会触发双击吗?只是想知道这将如何影响桌面脚本?
    • 是的,当我需要硬刷新另一个页面时,我会使用该脚本,例如,除非您重新加载页面,否则您的关于我们页面上的脚本将无法工作。它还会影响移动设备和桌面设备,但不会影响任何脚本。
    【解决方案2】:

    如果您确定问题的原因是在移动屏幕上运行该脚本,您可以使用此代码仅在桌面上调用滑动脚本:

    if ( $(window).width() > 739) {      
    //Desktop scripts
    } 
    else {
      //mobile scripts
    }
    

    您可以通过更改739 来更改要在其上编写脚本的设备的屏幕宽度。之后,您的脚本将仅在大于 739 像素或您选择的屏幕上运行。

    更新

    如果你想在调整大小后一切正常,你应该做一个小技巧。

    就我个人而言,我使用这种方法是因为它是让您确定错误和问题的唯一方法。诀窍是在调整大小后重新加载页面。 在许多情况下它并不昂贵,因为大多数东西都兑现了并且不需要重新下载。有很多方法可以做到这一点,但我使用下面的一种,因为它效果很好并且简单而简短:

    window.onresize = function () {
        location = location;
    }
    

    您只需在脚本文件的末尾添加此行。调整大小后,一切都会再次正常运行。

    它是如何工作的?

    当您调整窗口大小时,将发出一个 javascript 事件。我们在最后一个代码中所做的是覆盖该事件的事件侦听器。所以当用户调整窗口大小时,location = location; 代码就会执行。

    这条线是什么意思?位置对象是window 对象的一个​​属性,并保存有关当前窗口url 的信息。当您更改windowlocation 时,浏览器页面将重新加载以获取新location 的新window (more info about location)。

    我们在这里所做的是将当前的location 分配给location。所以浏览器认为我们有一个重定向请求并重新加载页面。但是因为新的location 和之前的对象是同一个对象,所以页面会重新加载而不是重定向到其他地方。

    【讨论】:

    • 谢谢,看来可以了!是否可以修改以便检查调整大小?我知道它只会影响移动设备,因此人们不会调整浏览器的大小,而只是认为平板电脑已从纵向更改为横向?
    • 我在答案中为您添加了这一点。如果它有用,您可以接受它作为正确答案。
    • 谢谢,我会检查一下。我不确定我是否理解新代码与之前的 if ( $(window).width() &gt; 739) {} 代码的关系。 location = location; 是做什么的?
    • 我添加了有关代码的更多详细信息。希望对你有帮助。
    • 嗯,不错,很好用。我唯一担心的是,如果用户滚动然后旋转设备,则页面会刷新,他们需要再次向下滚动页面。有点边缘案例!但我会玩一会儿。再次感谢! :)
    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 2021-10-18
    • 2011-04-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    相关资源
    最近更新 更多