div 下面仍然触发 click 事件

2024-02-22

这是我正在构建的 PhoneGap 应用程序,我正在我的笔记本电脑上进行测试,然后使用 PhoneGap cli 在 iPhone 上进行测试。我有一个 openlayers 3 地图,上面记录了点击事件。我还有一个 div,当菜单显示时,它会遮盖整个地图。这个想法是,当单击/点击此屏蔽 div 时,它会隐藏自身,但下面的地图不会注册单击事件。发生的情况是,地图正在注册点击事件,因此屏蔽 div 被隐藏,但地图随后会执行其他操作,因为它被点击了,但它不应该这样做!

我已经将代码简化到了实质内容。这是没有和有菜单和遮罩 div 显示的两个屏幕截图。右下角的按钮是打开菜单的按钮(.layers_menu_button).

这会侦听屏蔽 div 上的点击/点击(#net_curtain2),然后隐藏它(请注意,注释掉的传播是我尝试在此处停止单击/点击事件,但它没有任何区别)。interaction_type定义为click or touchend取决于我正在测试的内容。

$(window).on("load", function() {
    $(document).on(interaction_type, "#net_curtain2", function(event) {
        // event.stopImmediatePropagation();
        hide_layers_menu();
    });

    setup_map();
});

...

function hide_layers_menu() {
    $('.layers_menu_button').fadeIn("fast", function() {
        // Animation complete
    });

    // remove hide class, add show class
    $('.layers_menu_button').removeClass('hide_layers_menu');
    $('.layers_menu_button').addClass('show_layers_menu');

    $('.layers_menu_content').hide();

    $("#net_curtain2").fadeOut("fast", function() {
        // Animation complete
    });

    var layers_menu_width = parseInt($(window).width()-60);
    $("#layers_menu").animate({
        bottom: "30px",
        right:"30px",
        width: "20px",
        height: "20px"
        }, 'fast', function() {
            // Animation complete
        });
}

function setup_map() {
    // create view
    view = new ol.View({
            center: ol.proj.transform([0.153733491897583, 52.655333117999774], 'EPSG:4326', 'EPSG:3857'),
            zoom: 17
        });

    // create layers of map types
    road = new ol.layer.Tile({
                source: new ol.source.BingMaps({
                    imagerySet: 'Road',
                    key: 'my_key_here',
                    disableZooming: true,
                    maxZoom: 19
                })
            });

    map = new ol.Map({
        target: $('#map')[0],
        layers: [
            road
        ],
        view: view,
        controls : ol.control.defaults({
            attribution:false,
            zoom:false,
            rotate: false
        })
    });

    // check if net_curtain is visible and only act if NOT
    map.on('click', function(evt) {
        if($('#net_curtain2').is(':hidden'))
        {
            console.log("net curtain hidden");
        }
        else
        {
            console.log("net curtain showing");
        }
    });

    var interactions = map.getInteractions().getArray();
    var pinchRotateInteraction = interactions.filter(function(interaction) {
        return interaction instanceof ol.interaction.PinchRotate;
    })[0];
    pinchRotateInteraction.setActive(false);
}

因此,如果您在菜单未显示的情况下单击地图,控制台会输出“隐藏的网络窗帘”,这是正确的。但是,如果您打开菜单,然后单击遮罩 div(网帘),它会关闭菜单并隐藏网帘,这是正确的,但随后它会触发“网帘隐藏”,这是错误的!我需要它停止隐藏网帘。

最令人沮丧的是它可以在我的笔记本电脑上运行,但不能在手机上运行。和改变map.on('click'... to map.on(interaction_type...意味着它不会触发地图上的任何点击/点击事件。我很困惑。


我相信您的移动浏览器正在尝试模拟点击事件。

Calling event.preventDefault();应该可以解决你的问题。

尝试一下代码:

$(document).on(interaction_type, "#net_curtain2", function(event) {
    event.preventDefault();
    hide_layers_menu();
});

解释:

我相信您的问题是移动浏览器模拟点击事件的方式。为移动浏览器开发时要始终记住的一件事是如果没有明确阻止默认操作,则尝试模拟单击事件。事件的顺序是这样的:

  1. 触摸启动
  2. 触摸移动
  3. touchend
  4. 鼠标移到
  5. 鼠标移动
  6. 鼠标按下
  7. mouseup
  8. click

所以,通过不打电话event.preventDefault() in any touch您的移动浏览器假设您希望它继续通过该事件链,直到它触发一个事件click事件(就是这个click给您带来问题的事件)。

这可能会令人困惑,因为调用event.stopPropagation()阻止事件在事件链中冒泡——人们自然会认为正在发生这种情况。但您应该始终记住在触摸事件处理程序中使用 PreventDefault(),这样就不会发生默认的鼠标模拟处理。

如需更深入的解释,读这个 http://www.html5rocks.com/en/mobile/touchandmouse/.

可能相关:link https://stackoverflow.com/questions/5963669/whats-the-difference-between-event-stoppropagation-and-event-preventdefault

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

div 下面仍然触发 click 事件 的相关文章

  • Nodemailer:从未收到问候语

    当尝试使用 Nodemailer 在 Node 内发送电子邮件时 https github com nodemailer nodemailer https github com nodemailer nodemailer 调用sendMai
  • VS 2010 Web应用程序中的ASP.NET Web Api CRUD操作

    我尝试在 VS 2010 Web 应用程序中进行 ASP NET Web Api CRUD 操作 但为什么结果没有从源表返回所有整行 这是我的代码 路线 Globax asax protected void Application Star
  • 在 JavaScript 中定位提示弹出窗口

    我有一个如下所示的 JavaScript 提示 我想将提示放在屏幕中心 如何使用 javascript 做到这一点 function showUpdate var x var name prompt Please enter your na
  • 在 IE10 中禁用捏合放大

    在 IE10 触摸模式下 我希望仅使页面的特定部分可缩放 其余的不应该 我找到了这个 http msdn microsoft com en US library ie hh772044 aspx http msdn microsoft co
  • 在 php、ajax 或 javascript 中加载进度?

    任何人都知道如何在系统仍在服务器端获取数据的同时在客户端显示加载进度以及完成的百分比 例如 当我在客户端按下 确定 按钮时 它会调用服务器端从数据库收集数据 整个过程可能需要2到3分钟 如何在客户端显示加载进度 大约加载完成了多少 我怎样才
  • AngularJS 输入字段未从控制器内的 setTimeout 更新

    我正在使用 AngularJS 支持的页面 并且我需要在只读输入文本字段内显示正在运行的时钟 与data ng model 为了模拟运行的时钟 我使用了 JavaScript 调度程序setTimeout每 1000 毫秒调用一个函数 该函
  • 从网站存储数据的最简单方法(在服务器端)

    我有一个非常简单的网站 实际上是单页 有一个输入字段和一个按钮 我需要将用户提交的数据存储在服务器端的某个位置 完美的方法可能是简单的文本文件 并在每次单击按钮后附加新行 日志文件也可以 据我了解 JavaScript 本身是不可能的 我在
  • 如何检查元素的内容是否为空,如果是,则在 jquery 中删除该元素

    我目前正在尝试选择某个 div 内没有内容的任何 h2 元素并将其删除 这是我的 html 代码 div class skipToContainer h2 class vidSkipTo Hello h2 h2 class vidSkipT
  • 更改时触发跨度文本/html

    jQuery 或 JavaScript 中是否有任何事件在以下情况下触发span标签 text html 已更改 Code span class user location span user location change functio
  • 获得一次性绑定以适用于 ng-if

    这个问题已经被之前问过 https stackoverflow com questions 23969926 angular lazy one time binding for expressions 但我无法让该解决方案发挥作用 所以我想
  • 删除 Laravel Mix 中的临时文件

    我想在 laravel mix 构建期间或之后删除临时构建文件 这是我目前拥有的一些代码 但是del不工作 const mix require laravel mix const del require del compile sass i
  • 浏览器默认区域设置 - Intl.DateTimeFormat 与 navigator.language

    在对网站进行编码并格式化日期时 我想使用用户在浏览器中设置的区域设置 例如 如果用户定制了他们的chrome settings languages在 Chrome 中设置为非默认值 这就是我想要使用的值 但是 当我在此类浏览器的控制台中运行
  • jQuery:如何在显示元素的同时使用高亮效果?

    我在一个页面上有两个元素 div content div div style display none different content div 当我点击当前显示的div 我想隐藏它并显示另一个 这很容易做到 a hide b show
  • ReferenceError 和全局对象

    在浏览器中的 JavaScript 中window是全局对象 这意味着在全局范围内定义的每个变量都是window 那么为什么我会得到这个结果 console log window foo No error logs undefined co
  • 显示班级图片 10 秒

    我有下面给出的代码显示9 boxes 其值如下digital time 还有一个班级box002显示digits相当于随机选择的九个盒子的值 box002 can be dragged to digital time starting wi
  • 如何修复 getImageData() 错误画布已被跨源数据污染?

    我的代码在本地主机上运行得很好 但在网站上却不起作用 我从控制台收到此错误 对于这一行 getImageData x y 1 1 data Uncaught SecurityError Failed to execute getImageD
  • 如何模板化 Select2 的预选值

    我预先选择的值Select2 https select2 org如下所示 function formatState state console log state text2 I found undefined here console l
  • Cordova 2.4.0 或 2.5.0 或 2.6.0 和 requirejs

    Cordova 2 4 0 及更高版本支持 AMD 加载到 javascript 中 我特别希望将 Cordova 2 5 0 与最新版本的 RequireJS backbone jquery jquery mobile 一起使用 我还没有
  • NodeJS:如何获取服务器的端口?

    您经常会看到 Node 的示例 hello world 代码 它创建一个 Http Server 开始侦听端口 然后执行以下操作 console log Server is listening on port 8000 但理想情况下你会想要
  • 使用 JQuery 预填充选择字段的下拉选项验证

    我有这个 JQuery 片段来防止选择已在另一个字段中选择的下拉选项 var coll select name service on change function coll each function var val this value

随机推荐

  • 使用本机 CSS 和 HTML 设置漏斗堆栈布局样式

    我想显示类似漏斗堆栈的数据 如下图所示 我能够使用边框创建锥度 例如 div class taper div 并使用以下 CSS taper width 200px height 0px border color lightgray tra
  • 如何在应用程序启动时获取旋转进度条

    我是安卓新手 我设法将 JSON 文件解析到我的应用程序中 现在我想使用 AsyncTask 获取 Spinning ProgressBa 直到应用程序启动并加载数据 我尝试阅读很多内容 但它们只给出如何获取 onclick 事件或下载事件
  • 广播接收器 onReceive 在位置更改时触发两次

    我想知道用户何时关闭 GPS 我想了解不同活动中的这一行动 我制作了广播接收器来监听 GPS 状态的变化 但几乎总是当我关闭 GPS 时 我的 updateValue 函数会被触发两次 当用户关闭 GPS 时如何收到通知 我做错了什么 下面
  • 使用 GData 进行搜索查询的 YouTube UITableView

    我正在尝试自定义表格视图以根据搜索查询显示 YouTube 视频的提要 我找到了这段代码http pastebin com vmV2c0HT http pastebin com vmV2c0HT它在表格视图中显示 YouTube 频道的提要
  • DisabledBackend:Celery、Redis 和 Flask 的不稳定行为

    我已经使用 Celery 一段时间了 在生产中我使用 RabbitMQ 作为代理 使用 Redis 作为 K8s 集群中的后端 到目前为止没有任何问题 在本地 我运行一个包含一些服务 Flask API 2 个不同的 Workers Bea
  • emgucv:C# 中的 pan 卡不正确的倾斜检测

    我有三个泛卡图像 用于使用 emgucv 和 c 测试图像的倾斜 顶部的第一张图像检测到 180 度工作正常 中间的第二张图像检测到的 90 度应检测为 180 度 第三张图像检测到 180 度应检测为 90 度 我想在这里分享的一个观察结
  • 在 Docker 容器中安装 Web 应用程序:拨打 unix /var/run/docker.sock: no such file or directory

    我正在尝试在 Docker 容器中安装 Web 应用程序 我使用的是 OS X Yosemite 版本 10 10 1 我一直在关注这里关于 Dockerizing Node js Web App 的教程 https docs docker
  • 为什么 C# 构造函数无法推断类型?

    为什么构造函数不支持泛型方法的类型推断 public class MyType
  • CodeIgniter 项目上的第一个 HTTP 请求的延迟非常高

    我和一个朋友刚刚开始从事一个项目 其他人几年前就停止了开发 我们正在努力恢复它 我们已经解决了大部分与设置相关的问题 但有一个非常烦人的问题我们无法解决 在我们的本地主机中 所有页面都占用A LOT加载 刷新的时间 我指的不是资产 脚本或任
  • 如何让散景悬停工具捕捉数据?

    我希望散景悬停工具捕捉到数据点 而不是在线上插入鼠标位置 这是我认为可以做到这一点的代码 但我仍然在显示中获得插值数据 from bokeh plotting import figure output file show from boke
  • 通过 API 迭代 mailchimp 模板中的集合

    是否有机会通过 API 填写可重复的部分 例如 我有产品列表 我只想在模板中包含一次产品部分 然后迭代集合 我已经阅读了之前关于该主题的讨论并进行了谷歌搜索 但我仍然不明白是否可以通过 API 实现 div h2 Title h2 p Bo
  • 在 Windows(Vista 和 XP)上安装 Exuberant Ctags

    我想在工作时在 Vista 也可能是 XP 笔记本电脑 上使用 Exuberant Ctags 关于操作系统没有选择 我使用 GVim 而不是我的同事推荐的 Flex Builder 因为 FB 有问题并且无论如何也不能做 GVim 所做的
  • 是否有一个 create() 供 vuex 操作自动调度

    我在 vuex 中有一个操作 我想在 vuex 本身而不是组件中自动调度 我创建了一个通知栏 它通过多个页面上的不同通知进行更改 当我切换页面时 通知不是从头开始 而是创建了一个商店来设置要显示的通知 我想从 vuex 内部而不是从组件内部
  • ICU自定义音译

    我希望利用 ICU 库进行音译 但我想为一组特定的自定义音译提供自定义音译文件 以便在编译时合并到 ICU 核心中 以便在其他地方以二进制形式使用 出于兼容性原因 我正在使用 ICU 4 2 的源代码 据我了解 从他们网站的 ICU 数据页
  • 理解 scala:柯里化

    我最近开始学习 Scala 并遇到了柯里化 从这个答案post https stackoverflow com questions 17768686 currying example in scala 这段代码片段 def sum a In
  • MVC 3:如何学习如何使用 NUnit、Ninject 和 Moq 进行测试?

    我的问题的简短版本 任何人都可以向我指出一些好的 详细的资料来源吗 可以学习如何在我的 MVC 3 应用程序中实现测试 使用 NUnit Ninject 2 和起订量 这里有人可以帮助我澄清控制器存储库如何 解耦 模拟和依赖注入一起工作吗
  • 在首页以外的其他页面中显示图像时出现问题(wordpress/html/css)

    您好 我有一个正在为客户做的小网站 我使用了 html css 网站并使用空白主题将其转移到 WordPress 到目前为止一切顺利 如果您愿意 请查看 energyshop se 在起始页中显示了顶部的两个图像 但没有显示其余选项卡 为什
  • firestore 权限缺失或不足

    我收到错误 Firebase 缺少或权限不足 代码 const demoCollectionRef this db collection items 返回 demoCollectionRef add item 我认为这个错误是由于 angu
  • Android Studio 3.0.1 上的 Gradle 项目同步失败

    我是第一次在笔记本电脑上安装 Android Studio 3 0 1 但无法创建我的第一个 Hello World 应用程序 我收到以下错误 Create process failed error 216 Error Consult yo
  • div 下面仍然触发 click 事件

    这是我正在构建的 PhoneGap 应用程序 我正在我的笔记本电脑上进行测试 然后使用 PhoneGap cli 在 iPhone 上进行测试 我有一个 openlayers 3 地图 上面记录了点击事件 我还有一个 div 当菜单显示时