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 事件 的相关文章

  • 使用 Jquery 传递隐藏字段值

    我有一个正常的hidden Input field我在哪里生成random string 我需要将其附加到我尝试将数据发布到另一个页面的 URL 中 我已经做到了这一点并且效果很好 url Upload html field1 newval
  • 如何将类型添加到 Vite 库构建中?

    我按照vite文档使用图书馆模式 https vitejs dev guide build html library mode我能够生成一个工作组件库 我创建了该项目vue ts预设 在我的组件中 我定义了道具及其类型 并使用了一些接口 但
  • 如何将 STRUCT - OR - JSON 传递给 Coldfusion CFC 方法

    我有一个现有的 CFC 在将结构传递到方法中时可以正常工作 问题是 我们现在还需要通过 JSON 将数据传递到同一函数中 这是 CFC 片段
  • Rangy:插入符号下的单词(再次)

    我正在尝试创建一个预输入代码以添加到 wysihtml5 富文本编辑器 基本上 我需要能够插入人员 标签引用 例如 Twitter Github Facebook 我发现一些人试图实现同样的事情的代码 http jsfiddle net A
  • 使用 cordova cli 构建时的 Android 安装位置

    我正在使用 cordova CLI 工具构建一个大型 cordova phonegap 应用程序 我需要 AndroidManifest xml 文件中的 installLocation 具有 installLocation auto 或p
  • 如何根据另一个下拉列表中的选择动态填充下拉列表中的选项?

    我有一个表 其中包含类别信息 例如产品 我已将它们列在下拉菜单中 现在 我需要做的是 在下一个下拉菜单中列出所选类别的子类别 我希望 javascript 是必需的 但我对 javascript 还不太熟悉 将非常感谢您的帮助 你应该使用
  • jquery 当前可见的第 n 个子级

    我可以像这样设置每 4 个 item div 的样式 jQuery item nth child 4n addClass fourth item 这工作得很好 但后来我隐藏了一些项目 显示了其他一些项目 并想重新做这个样式 但只对每第四个可
  • Riak 在 MapReduce 查询中失败。使用哪种配置?

    我正在与 riak riak js 结合开发一个 nodejs 应用程序 并遇到以下问题 运行此请求 db mapreduce add logs run 正确返回存储在存储桶日志中的所有 155 000 个项目及其 ID logs 1GXt
  • D3 向对象添加超链接?

    我正在尝试制作 D3 图 它将代表我网站的菜单 我尝试按照此处的其他指南添加超链接 但它们都不起作用 每个对象都会有一个不同的 URL 指向 主页 关于 联系方式等 如果添加超链接 我可以拖动对象吗 这意味着如果我按住单击 如果我单击该对象
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • AngularStrap 工具提示禁用我的自定义指令

    我正在尝试让 bs tooltip AngularStrap 指令与我自己的名为 checkStrength 的自定义指令一起使用 该指令检查密码的强度 单独使用这些指令中的任何一个时 它们都可以正常工作 但不能一起工作 This http
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • Angularjs : $locationProvider.hashPrefix("!") ;

    我想将网址显示为 www test com 因为我正在使用 locationProvider hashPrefix 但它显示网址为 www test com 我想 哈希之前而不是哈希之后 Thanks var app angular mod
  • 在 Nodejs 中,如何停止 FOR 循环直到 MongoDB 调用返回

    我正在研究下面的代码片段 我有一个名为 stuObjList 的 JSON 对象数组 我想循环遍历数组以查找具有特定标志集的特定 JSON 对象 然后进行数据库调用以检索更多数据 当然 FOR 循环不会等待数据库调用返回并到达 j leng
  • 在 React Web 应用程序中使用 createjs-soundjs

    我想用https www npmjs com package createjs soundjs https www npmjs com package createjs soundjs在 React Web 应用程序上播放声音 我正常安装了
  • 使用ExternalInterface和IE从JavaScript获取Flash中的当前URL

    我正在尝试获取 Flash 播放器当前所在的 URL 不是 swf 文件的 URL 而是浏览器指向的 URL 到目前为止我已经使用过 var st String ExternalInterface call window location
  • Keycloak-js updateToken(minValidity) 需要澄清

    我在Keycloak js中阅读了很多该方法的示例 但没有对以下方法进行明确的解释 updateToken minValidity number KeycloakPromise
  • Chrome 调试器注入 javascript

    我有这样的好奇心 是否可以以某种方式在我的页面中注入 javascript 并执行它并调试它 正如您在控制台中所做的那样 但在控制台中您无法暂停并观察变量 是否可以调试我通过控制台输入的代码 为什么无法调试通过 XHR 接收的代码 Than
  • Jquery 以编程方式更改

    文本

    编辑 解决方案是将其添加到个人资料页面而不是性别页面 profile live pageinit function event p pTest text localStorage getItem gender 我在列表视图中有一个带有一些文
  • 为什么 try catch 块没有捕获 Promise 异常?

    我对承诺的错误处理感到困惑 答案可能很明显 但我不明白 我有以下示例代码 var test async function throw new Error Just another error try test then catch err

随机推荐

  • 使用本机 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 当菜单显示时