【问题标题】:How to disable outside clicks while an element is visible?如何在元素可见时禁用外部点击?
【发布时间】:2011-06-09 16:52:53
【问题描述】:

我有一个 div,divDialog,它包含一个简单的对话框。它开始了无形的生命,但在某个时刻我让它可见。该页面上有几个其他元素(菜单等),它们具有点击事件的事件侦听器。

我的问题是,一旦 divDialog 可见,如何禁用除 divDialog 之外的所有点击事件?当然,一旦 divDialog 再次不可见,我想将所有侦听器恢复为正常行为。

我看了this elegant answer,但它并没有禁用外部点击,也不是跨平台的。

我确实有一个例程可以检测一个节点是否是另一个节点的祖先:

function isAncestorOf(ancestor, descendant) {...}

...这在解决方案中可能是必要的。但是我在事件侦听器、冒泡、捕获和跨平台行为方面遇到了问题(对于 IE 似乎无法解决)。

我没有在这个上使用 jquery;只是普通的 ol' javascript。

有什么建议吗?

【问题讨论】:

    标签: javascript html events cross-platform


    【解决方案1】:

    您应该在窗口上方放置一个透明、固定的div。这样,屏幕上的任何点击都将是该 div 而不是其下方的元素。这通常用作模式对话框的背景覆盖。在 IE 中,您需要确保为 position:fixed 声明了一个 !DOCTYPE 才能工作。

    div#overlay {
       position:fixed;
       top:0;
       left:0;
       height:100%;
       width:100%;
       z-index:100;
       background-color:#444444;
       opacity:0.5;
       filter:alpha(opacity=50);
    }
    

    您需要确保 divDialog 的 z-index 大于叠加层的 z-index。

    【讨论】:

    • divDialog 上的z-index 设置为101 以定位在叠加层之上
    • 哇。没想到。当然,divDialog 需要有更高的 z-index,对吧?那时不会有听众参与,对吗?
    • :),就在您评论 z-index 时发布。谢谢。
    • 好的。我试了一下。这里需要做的几件事(为了其他读者的利益)是:(1)你必须在 IE 浏览器中有一个 !DOCTYPE 才能使 position:fixed 工作; (2) 样式需要 "top:0; left:0;"如果覆盖不是页面上的第一件事,则添加它。
    • 我仍然有困难。即使存在叠加层(我更改了背景颜色以确保),即使使用 z-index:1000,也会有一些点击通过它。
    【解决方案2】:

    event.preventDefault 将阻止事件冒泡。

    【讨论】:

    • 是的,但是如果事件源自 divDialog 外部,例如在链接或菜单中,divDialog 将永远不会看到它以阻止它冒泡。
    • 我知道这可能不是您想要做的,但您必须“掩盖”其他 DOM 元素。 jQuery 通过创建一个显示在对话框下方的 div 来做到这一点,并且除了阻止用户单击其他内容(如果它是一个模态对话框,这就是您想要的)之外什么都不做,所以伪代码...在对话框显示;显示画面;显示对话框; -- 对话框隐藏;隐藏对话框;隐藏屏幕;
    • 这是有道理的。你和 js1568 在同一条轨道上。非常感谢!