javascript - 在处理 z 顺序的 HTML 元素时禁用 Javascript 事件失败

标签 javascript html css firefox google-chrome

我有一个愚蠢的(希望很容易解决的)问题,我现在将尝试描述它。

场景-> 我正在尝试使用 HTML/CSS/JS 创建上下文菜单。只是一个具有高 z 顺序的 DIV,出现在用户右键单击的位置。很简单,那部分有效。如果用户单击不支持上下文菜单的某个地方,则不存在的部分是我试图使菜单消失;我试图通过触发 onclick 的 BODY 标记中的一般函数来实现这一目标。由于 BODY 标签的 z 顺序为 -1,而任何其他可能触发上下文菜单出现的标签都被赋予了更高的 z 顺序值,我希望如果我右键单击带有 z- 的元素顺序,比如说,3,那么它会触发 showMenu() 函数;相反,它似乎会执行此操作,并将事件传递给底层的 BODY 标记,这会导致菜单再次隐藏。

正如您想象的那样,这非常令人沮丧。有谁知道如何防止事件被传递下来? (INPUT 按钮是您可能想要查看的内容,A anchor 是类似的东西,但尚未编码以工作)。

这是 HTML 代码:

http://pastebin.com/YeTxdHYq

这是我的 CSS 文件:

http://pastebin.com/5hNjF99p

这似乎是 IE、Firefox 和 Chrome 的问题。

最佳答案

许多 DOM 事件从底部对象“冒泡”到容器对象,这意味着它们最终会到达主体。但您可以停止此操作 - 尝试将以下代码添加到您元素的点击处理程序中:

e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();

...其中 e 是您的函数中已有的表示事件对象的变量。

event.stopPropagation(); 应该可以在现代浏览器中使用,但旧的 IE 方法是 event.cancelBubble = true; - 为了安全起见,您可以同时执行这两种操作(但如上所示,在尝试调用之前检查 .stopPropagation 是否已定义)。

添加上面的代码后,如果您单击元素,您的函数将阻止容器对象(包括主体)看到单击。如果您点击其他地方,您的函数不会被调用,那么正文将处理点击。

MDN 上有更多关于此的信息和 QuirksMode.org .

注意:我忽略了 z 顺序问题,因为在这种情况下我认为这不是问题 - 所有元素都是 body 的后代所以(除非你停止它)我希望事件冒泡到 body 无论 z 顺序如何。

关于javascript - 在处理 z 顺序的 HTML 元素时禁用 Javascript 事件失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7924931/

相关文章:

javascript - AngularJs 用户验证对每个字符发出请求

javascript - 如果文本包含 :,则替换链接和文本

jquery - SVG map onclick 背景颜色应为黑色 "#000"

javascript - 更改不透明度属性并将渐变应用于 Bootstrap 工具提示

javascript - GPA计算器,如何将字母输入变成数字

javascript - AJAX/JavaScript : parsing JSON that contains an array

JavaScript 数组到 MVC Controller

html - 如果不发布,为什么人们将值 ="Submit"用于表单中的按钮元素

javascript - 如何使图像在其容器内增长以创建缩放效果?

jquery - 在不重新加载页面的情况下更新浏览器的 URL