javascript - 使弹出导航模式靠近区域外的触摸事件

标签 javascript jquery events touch mobile-website

我的网站具有响应能力,对于狭窄的 View ,导航会切换到一个图标,在单击时显示导航。要关闭导航面板,您可以再次单击该图标或导航模式之外的任何位置。这是管理导航模式之外的点击的 JS:

$(document).mousedown(function(e) {
    var clicked = $(e.target);
    if (clicked.is("#navigation") || clicked.parents().is("#navigation") || clicked.is("#hamburger-nav-link")) {
        return;
    } else {
        $("#hamburger-nav-link").removeClass("hamburger-nav-active");
        $("#navigation").removeClass("mobile-nav");
    }
});

在移动设备(好吧,我的 iPhone)上,当您点击图标时,它会关闭导航模式,但是当您点击导航模式之外时,什么也不会发生。

我尝试实现此问题中的代码以将触摸事件映射到单击事件: JavaScript mapping touch events to mouse events

但这对我来说不起作用。

我将代码粘贴到 $(document).mousedown() 函数下方,它全部位于通用 jQuery 函数中。我粘贴了下面的代码,以便您可以看到整个内容。该文件在每个页面末尾的结束标记之前调用。

非常感谢任何帮助,谢谢!

$(函数(){

// Mobile nav
$("#hamburger-nav-link").click(function() {
    if ($("#navigation").hasClass("mobile-nav")) {
        $(this).removeClass("hamburger-nav-active");
        $("#navigation").removeClass("mobile-nav");
    }
    else {
        $(this).addClass("hamburger-nav-active");
        $("#navigation").addClass("mobile-nav");
    }

    return false;
});

// Close modal if click event is outside of it
$(document).mousedown(function(e) {
    var clicked = $(e.target);
    if (clicked.is("#navigation") || clicked.parents().is("#navigation") || clicked.is("#hamburger-nav-link")) {
        return;
    } else {
        $("#hamburger-nav-link").removeClass("hamburger-nav-active");
        $("#navigation").removeClass("mobile-nav");
    }
});

function touchHandler(event)
{
        var touches = event.changedTouches,
                first = touches[0],
                type = "";
                 switch(event.type)
        {
                case "touchstart": type = "mousedown"; break;
                case "touchmove":    type="mousemove"; break;                
                case "touchend":     type="mouseup"; break;
                default: return;
        }

                         //initMouseEvent(type, canBubble, cancelable, view, clickCount, 
        //                     screenX, screenY, clientX, clientY, ctrlKey, 
        //                     altKey, shiftKey, metaKey, button, relatedTarget);

        var simulatedEvent = document.createEvent("MouseEvent");
        simulatedEvent.initMouseEvent(type, true, true, window, 1, 
                                                            first.screenX, first.screenY, 
                                                            first.clientX, first.clientY, false, 
                                                            false, false, false, 0/*left*/, null);

                                                                                                                                                                 first.target.dispatchEvent(simulatedEvent);
        event.preventDefault();
}

function init() 
{
        document.addEventListener("touchstart", touchHandler, true);
        document.addEventListener("touchmove", touchHandler, true);
        document.addEventListener("touchend", touchHandler, true);
        document.addEventListener("touchcancel", touchHandler, true);        
}

});

最佳答案

只需将 click 和 touchend 事件绑定(bind)到文档即可使其工作。然后在单击图标时引用原始隐藏/显示功能。然而,这引入了另一个问题,即单击图标有时会双重触发,并且您会得到奇怪的行为。就像关闭然后重新打开一样。不过我将单独解决这个问题。所以,答案如下:

两个函数 touchHandler(event)init() 以及 $(document).mousedown(function(e) { ... }) ; 函数和 $("#hamburger-nav-link").click(function() { ... }); 函数替换为以下内容:

var navModalView = function() {
    if ($("#navigation").hasClass("mobile-nav")) {
        $("#hamburger-nav-link").removeClass("hamburger-nav-active");
        $("#navigation").removeClass("mobile-nav");
    }
    else {
        $("#hamburger-nav-link").addClass("hamburger-nav-active");
        $("#navigation").addClass("mobile-nav");
    }

    return false;
}

$(document).bind("click touchend", function(e) {
    var targetEl = $(e.target);

    if (targetEl.is("#navigation") || targetEl.parents().is("#navigation")) {
        return;
    }
    else if (targetEl.is("#hamburger-nav-link")) {
        navModalView();
        event.preventDefault();
    }
    else {
        $("#hamburger-nav-link").removeClass("hamburger-nav-active");
        $("#navigation").removeClass("mobile-nav");
    }
});

关于javascript - 使弹出导航模式靠近区域外的触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16020466/

相关文章:

javascript - ReactJS 区分来自多个组件的点击。

jquery-ui 框架图标上的悬停效果

jquery - 使用 jQuery Mobile Slider 制作动画颜色

java - 如何订阅其他 JFrame 中的 GUI 事件

javascript - 我还需要学习更多的编程语言吗?

javascript - 如何在 React Native 中使用 Redux 跨多个屏幕存储多个值

javascript - 刷新 Html 布局以重新计算滚动条

jquery - 删除表中的所有特定类

c# - PreviewMouseLeftButtonDown 和 MouseLeftButtonDown WPF 之间的区别

events - Postgres : Post statement (or insert) asynchronous, 非阻塞处理