【问题标题】:Why can't I click on links on mobile device? [closed]为什么我不能点击移动设备上的链接? [关闭]
【发布时间】:2017-06-22 08:49:23
【问题描述】:

我正在开发一个网站 (saulesinterjerai.lt) 现在一切正常,除了在移动设备上链接不可点击,而是通过其他层..

如何从代码中禁用此行为? (不在浏览器上)

我写的代码在这里,但是我从网上复制了一些代码部分(如果你知道如何使用开发工具,所有都在“dep”文件夹中)。我也怀疑pjax 或专有的“可缩放”模块可能有问题,但我找不到原因..:

var pjax = new Pjax({ selectors: ["head title", "body"] })
var Site;

var attach_menu_control = function() {
  var $sidebar = document.querySelector('.sidebar')
  var $sidebar_content = $sidebar.querySelector('.content')
  var $menu_opener = $sidebar.querySelector('.menu-closed')

  var hide_menu = function() {
    $sidebar_content.style.display = 'none'
    $menu_opener.style.display = 'block'
    $sidebar.style.width = '40px'
  }

  var show_menu = function() {
    $sidebar_content.style.display = 'block'
    $menu_opener.style.display = 'none'
    $sidebar.style.width = '270px'
  }

  var click_handler = function(e){
    // e.preventDefault()
    var width = (window.innerWidth > 0) ? window.innerWidth : screen.width;
    if ($sidebar_content.style.display == 'none') {
      show_menu()
    } else if (width <= 724) {
      hide_menu()
    }
  }

  if ( !is_touch_device() ) $sidebar.addEventListener('click', click_handler)
  $sidebar.addEventListener('touchend', click_handler)
  var event = new Event('click');
  $sidebar.dispatchEvent(event)
}
attach_menu_control()

document.addEventListener('DOMContentLoaded', reloadCarbon)
document.addEventListener('pjax:complete', reloadCarbon)
document.addEventListener('pjax:send', resetCarbon)

// Animations

document.addEventListener('pjax:send', function(){
  var $main = document.querySelector('main')
  $main.style.opacity = 0
})

document.addEventListener('pjax:complete', function(){
  var $main = document.querySelector('main')
  $main.style.visibility = 'hidden'
  $main.style.opacity = 0
  setTimeout(function(){
    document.querySelector('main').style.visibility = 'visible'
    document.querySelector('main').style.opacity = 1
    attach_menu_control()
  }, 10)
})

function hasClass(element, cls) {
    return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
}

function is_touch_device() {
  return 'ontouchstart' in window        // works on most browsers 
      || navigator.maxTouchPoints;       // works on IE10/11 and Surface
}

CSS:

    .menu-closed {
        font-size: 30px;
      position: absolute;
      writing-mode: vertical-lr;
      top: 50%;
      padding-left: 14px;
      cursor: pointer;
    }

    .sidebar {
        transition: width 0.2s;
        overflow-x: hidden;
        z-index: 10000;
        backface-visibility: hidden;
    }

    .sidebar .content {
        width: 270px;
    }


    @media only screen and (max-width: 724px) {
        .sidebar {
            background-color: rgba(245, 245, 245, 0.87);
        }

        .sidebar h1 {
            font-size: 36px;
        }

        .sidebar header h2 {
            font-size: 28px;
        }

        .language {
            font-size: 16px;
        }

        .sidebar nav > ul > li {
            line-height: 36px;
        }

        .sidebar nav > ul.siteLinks a, 
        .sidebar nav > ul > li > a {
            font-size: 36px;
            line-height: 36px;
        }

        main {
            padding-left: 40px;
        }

        /* Force sideback to be in closed mode when new page is opened */
        .sidebar {
            width: 40px;
        }

        .sidebar .content {
            display: none;
        }
    }

    /* Emulate fixed positionin */

    html {
        position: absolute;
        height: 100%;
        width: 100%;
        overflow: hidden;
    }

    body {
        height: 100%;
        overflow: auto;
    }

    .fixed {
        position: absolute;
    }

【问题讨论】:

标签: javascript css click touch-event


【解决方案1】:

我认为这是由于这个函数,它被调用:

 var click_handler = function(e){
    e.preventDefault()
    var width = (window.innerWidth > 0) ? window.innerWidth : screen.width;
    if ($sidebar_content.style.display == 'none') {
      show_menu()
    } else if (width <= 724) {
      hide_menu()
    }
  }

e.preventDefault() 阻止浏览器执行默认操作,此处:切换页面并跟随链接中的 URL。

我想您必须小心附加此处理程序的哪个项目。 这种处理程序在链接上感觉不是很自然。

Chrome 控制台的警告突出显示了这一点:

Ignored attempt to cancel a touchend event with cancelable=false, for example because scrolling is in progress and cannot be interrupted.
click_handler @ app.js:34

编辑

我看到很多处理程序附加到您的元素,我不了解每个人的角色(例如,我不知道 pjax 库),我认为一个负责失去预期行为。如果我是你,也许我会尝试让它更简单,并重写菜单系统及其在网页中的集成。

如果您不能(或不想)重构页面,也许不要尝试修复它,而是尝试解决方法。

我要做的是在菜单打开时添加一个透明的灰色背景,向用户显示屏幕的其余部分被禁用(或完全透明,当用户点击/点击它时,它会关闭菜单以回到主要内容)。 当菜单打开时,您在主要内容上设置以下 css:

pointer-events: none

这将阻止菜单下的图片/内容接收事件,并且只有菜单应该获得点击/点击事件。希望这会有所帮助!

【讨论】:

  • 嗨 sjahan,我为此 preventDefault 添加了这个,以防止点击到底层,因为它不会打开菜单,而是打开图像并放大它们。现在我删除了它 - 它打开了菜单后面的图像(我猜这应该是另一个问题,所以如果这个问题没有得到解决,我会以不同的角度发布)。但是,即使使用之前的版本 - 您也可以在普通浏览器中单击链接,唯一的问题是移动设备(为什么?)
  • 查看 CSS 的最后几行 - 这可能是由于这种尝试将菜单定位为固定的方式(正常方式不起作用)
  • 快速浏览一下,我看不出 css 有什么问题,但是,可能是当您点击链接时,该事件冒泡进入许多事件处理程序并最终被取消。我会尝试更深入地研究它!现在,链接正常,但菜单表现得很奇怪,你能把它恢复原状吗?
  • 谢谢 .. 唯一的区别是注释 e.preventDefault(),您可以在开发工具中取消注释。我根据当前代码修改了问题。再次感谢!
  • 我接受了你的回答,因为这可能是我唯一能得到的答案。但是我仍然无法点击移动设备上的链接。任何帮助将不胜感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多