2017-06-22 5 views
0

Je développe un site (saulesinterjerai.lt) Tout fonctionne maintenant, sauf sur l'appareil mobile, les liens ne sont pas cliquables, au lieu de cela passe par d'autres couches ..Pourquoi ne puis-je pas cliquer sur les liens sur un appareil mobile?

Comment puis-je désactiver ce comportement à partir du code? (pas sur le navigateur)

Le code que j'ai écrit est ici, cependant certaines parties du code que j'ai copié du web (tout dans le dossier "dep" si vous savez comment utiliser les outils de développement). Je pense aussi qu'il ne pourrait être un problème pjax ou le module « zoomable » propriétaire, mais je ne trouve pas pourquoi ..:

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; 
    } 
+0

pas sûr où est le problème, sur mon Android tout fonctionne bien – NoOorZ24

+0

J'ai le même problème sur mon Nexus 6P/Chrome, c'est bizarre. Je vais jeter un coup d'oeil sur mon téléphone de dev. – sjahan

+3

S'il vous plaît lire [Quelque chose sur mon site web ne fonctionne pas. Puis-je simplement coller un lien?] (Http://meta.stackoverflow.com/questions/125997/something-on-my-web-site-doesnt-work-can-i-just-paste-a-link -to-it). Les questions qui dépendent de ressources externes à comprendre deviennent inutiles lorsque la ressource externe disparaît ou est réparée. Créez un [MCVE] et placez-le dans ** la question elle-même ** à la place. – Quentin

Répondre

2

Je pense que cela est dû à cette fonction, qui est appelée:

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() empêche le navigateur d'exécuter l'action par défaut, ici: pour changer de page et suivez l'URL dans le lien.

Je suppose que vous devez faire attention à l'élément auquel vous attachez ce gestionnaire. Ce type de gestionnaire ne semble pas très naturel sur un lien.

Cela a été souligné par les avertissements de la console 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 

EDIT

Je vois beaucoup de gestionnaires attachés à vos éléments, et je ne comprends pas le rôle de chacun (i don Je ne connais pas le pjax lib par exemple), je pense qu'on est responsable de la perte du comportement attendu. Si j'étais vous, peut-être que j'essaierais de simplifier et de réécrire le système de menu et son intégration dans la page Web.

Si vous ne pouvez pas (ou ne voulez pas) refactoriser la page, n'essayez peut-être pas de la résoudre mais essayez une solution de contournement. Ce que je ferais est d'ajouter une toile de fond grise transparente quand le menu est ouvert, pour montrer à l'utilisateur que le reste de l'écran est désactivé (ou complètement transparent et quand l'utilisateur clique dessus/tape dessus, il ferme le menu revenir au contenu principal). Lorsque le menu est ouvert, vous définissez sur le contenu principal de la css suivante:

pointer-events: none 

Cela permettra d'éviter les images/contenu dans le menu pour recevoir des événements, et que le menu devrait obtenir cliquez sur/événements robinet. J'espère que cela t'aides!

+0

Salut sjahan, j'ai ajouté ceci pour preventDefault pour empêcher le clicksthrough aux couches sous-jacentes, car au lieu d'ouvrir le menu, il ouvrirait les images et les zoomerait.Maintenant que je l'ai enlevé - il ouvre les images derrière le menu (ce qui devrait être une autre question je suppose, donc si cela ne se résout pas, je l'afficherai sous un angle différent). Cependant, même avec la version précédente - vous pouvez cliquer sur les liens dans le navigateur normal, le seul problème étant mobile (donc POURQUOI?) – Aurimas

+0

Regardez les dernières lignes de la CSS - pourrait-il être dû à cette façon d'essayer de positionner le menu comme corrigé (la manière normale ne fonctionne pas) – Aurimas

+0

Avec un coup d'oeil rapide, je ne peux pas voir un problème avec le CSS, cependant, c'est probablement que lorsque vous appuyez sur le lien, l'événement bouillonne dans de nombreux gestionnaires d'événements et finira annulé. Je vais essayer de regarder plus en profondeur! Maintenant, les liens fonctionnent mais le menu est bizarre, pouvez-vous le remettre en place? – sjahan