Oprava nabídky mobilního Safari pro iOS

Jednou z komponent, na kterou jsem docela hrdý, je komponenta rozbalovací nabídky Mozilla Developer Network. Je elegantní, flexibilní, přístupný pomocí klávesnice a relativně kompaktní (i když vyžaduje jQuery). Jeden problém, kterého jsem si všiml, byl ten, že klepnutím jednou otevřel nabídku (dobré), ale museli byste dvakrát klepnout (dvakrát klepnout) na odkaz podnabídky, abyste spustili přesun na adresu URL odkazu. Není to katastrofický problém, ale rozhodně otravný. Po chvíli šťouchání jsem přišel s řešením, které uspokojilo nepříjemnosti!

JavaScript

Zjistil jsem hlavní problém: položka hlavní nabídky byla kódována tak, aby otevřela podnabídku po mouseenter . I když jsem byl vděčný, že mobilní Safari pro iOS používá mouseenter jako pouhý otevřený spouštěč způsoboval uživatelům bolest při dvojitém klepnutí, když navštívili odkaz v podnabídce. Využil jsem tedy výhody touchstart událost:

$menuItem.on('touchstart mouseenter focus', function(e) {
    if(e.type == 'touchstart') {
        // Don't trigger mouseenter even if they hold
        e.stopImmediatePropagation();
        // If $item is a link (<a>), don't go to said link on mobile, show menu instead
        e.preventDefault();
    }

    // Show the submenu here
});

Proč ne touchend ? Bohužel, pokud uživatel podrží prst stisknutý déle než na rychlé klepnutí, spustí se událost mouseenter. Trochu zvláštní, ale protože mám touchstart jako první událost v posluchači mohu použít stopImmediatePropagation abyste zabránili mouseenter od věčné střelby. Co je také hezké, že nemusím provádět žádnou detekci zařízení, abych žongloval touchstart a mouseenter , takže toto je skvělé řešení...

...ale není to dokonalé řešení. Pokud klepnete a podržíte odkaz na položku hlavní nabídky, kontextová nabídka mobilního prohlížeče se nezobrazí, protože jsme použili preventDefault . Stále objevuji a experimentuji, takže budu tento příspěvek nadále aktualizovat, když budu hledat svatý grál!