【问题标题】:css 'pointer-events' property alternative for IEIE 的 css 'pointer-events' 属性替代
【发布时间】:2011-08-16 20:13:16
【问题描述】:

我有一个下拉导航菜单,其中某些标题在单击时不应导航到其他页面(这些标题在单击时会打开一个下拉菜单),而其他标题应导航(这些没有下拉菜单并直接导航)。但是,这两种类型都定义了href

为了解决这个问题,我为前一种标题添加了以下 css

pointer-events: none;

它工作正常。但由于 IE 不支持此属性,我正在寻找一些解决方法。 烦人的是我没有完全更改 HTML 和 JavaScript 代码的访问权限和权限

有什么想法吗?

【问题讨论】:

标签: html css internet-explorer browser cross-browser


【解决方案1】:

Pointer-events 是 Mozilla hack,它已在 Webkit 浏览器中实现,您不能指望再过一百万年在 IE 浏览器中看到它。

但是我找到了一个解决方案:

Forwarding Mouse Events Through Layers

这使用了一个插件,该插件使用一些不为人知/不理解的 Javascript 属性来获取鼠标事件并将其发送到另一个元素。

还有另一个 Javascript 解决方案here

2013 年 10 月更新:显然它会在 v11 中进入 IE。 Source。谢谢蒂姆。

【讨论】:

  • ie9 的文档说它支持这个属性(但是我还没有尝试过 ie9)。无论如何,我已经有了一些想法,这些想法在链接中给出,但我正在寻找一些 css具体解决方案我不能使用它们。我将尝试修改 html/js 代码,而不是花时间在这个问题上。非常感谢您的时间和帮助
  • 在 W3C,这个问题发生在 under debate due to click-hijacking。经验法则:一旦 W3C 发布候选人推荐,IE 团队就会实施它,haste makes waste 总是有教训。此外,Mozilla said it all "警告: 在 CSS 中对非 SVG 元素使用指针事件是实验性的。该功能曾经是 CSS3 UI 草案规范的一部分,但由于对于许多未解决的问题,已推迟到 CSS4。"
  • 根据 caniuse.com 的说法,CSS 指针事件即将进入 IE 11。caniuse.com/#feat=pointer-events
  • "you can't expect to see it in IE browsers for another million years." 只用了 3 年...
  • @KyleSevenoaks 我猜每个人都低估了微软。当前的 IE 开发很棒,尤其是 status.modern.ie。他们只需要尽快杀死 IE8 和 9,我们就可以进入现代开发的甜蜜天堂!
【解决方案2】:

这是另一个很容易用 5 行代码实现的解决方案:

  1. 捕获顶部元素(要关闭指针事件的元素)的“mousedown”事件。
  2. 在“mousedown”中隐藏顶部元素。
  3. 使用“document.elementFromPoint()”获取底层元素。
  4. 取消隐藏顶部元素。
  5. 为底层元素执行所需的事件。

例子:

//This is an IE fix because pointer-events does not work in IE
$(document).on('mousedown', '.TopElement', function (e) {

    $(this).hide();
    var BottomElement = document.elementFromPoint(e.clientX, e.clientY);
    $(this).show();
    $(BottomElement).mousedown(); //Manually fire the event for desired underlying element

    return false;

});

【讨论】:

  • 这对我有用。我更喜欢可以放入我的 js 代码中的小修复,而不是添加大量的 polyfill;)
  • 这是一个创造性的解决方案,我喜欢它。唯一的问题是这会给点事件工作的浏览器增加不必要的处理。让它有条件地仅在 IE 浏览器中执行会很棒。
  • 我同意,它可以快速解决一个令人困惑的问题,但实际上在我的实现中,我只在浏览器是 IE 时应用它,你把它放在这个检查中:if (navigator. appName == 'Microsoft Internet Explorer') { ... 逻辑在这里.. }
  • 这很好用!由于 ie 11 应该开始支持指针事件,我只是将它包装在这个子句中: if (navigator.userAgent.toLowerCase().indexOf('msie') > 0) THANKS!
【解决方案3】:

IE 有一个解决方法 - 使用内联 SVG 并在 SVG 中设置 pointer-events="none"。 在How to make Internet Explorer emulate pointer-events:none?中查看我的回答

【讨论】:

    【解决方案4】:

    值得一提的是,对于 IE,disabled=disabled 适用于锚标签:

    <a href="contact.html" onclick="unleashTheDragon();" disabled="disabled">Contact</a>
    

    IE 将其视为disabled 元素,不会触发点击事件。但是,disabled 不是锚标记上的有效属性。因此,这在其他浏览器中不起作用。对他们来说,pointer-events:none 在样式中是必需的。

    更新 1:所以添加以下规则对我来说就像一个跨浏览器解决方案

    更新 2:为了进一步兼容,因为 IE 不会为带有 disabled='disabled' 的锚标记形成样式,所以它们仍然会看起来处于活动状态。因此,a:hover{} 规则和样式是一个好主意:

    a[disabled="disabled"] {
            pointer-events: none; /* this is enough for non-IE browsers */
            color: darkgrey;      /* IE */
        }
            /* IE - disable hover effects */   
            a[disabled="disabled"]:hover {
                cursor:default;
                color: darkgrey;
                text-decoration:none;
            }
    

    在 Chrome、IE11 和 IE8 上工作。
    当然,上面的 CSS 假设锚标签是用 disabled="disabled" 渲染的

    【讨论】:

    • 这对我不起作用。在 IE9-10 中,onclick 函数仍然会执行。
    【解决方案5】:

    这是一个实现此功能的小脚本(灵感来自 Kyle 提到的 Shea Frederick blog article):

    【讨论】:

    • 我相信,如果元素是锚标签,这将不起作用。至少,它对我不起作用。
    【解决方案6】:

    用不可见的块覆盖有问题的元素,使用伪元素::before:after

    a:before {
    //IE No click hack by covering the element.
      display:block;
      position:absolute;
      height:100%;
      width:100%;
      content:' ';
    }
    

    因此,您点击的是父元素。不好,如果父级是可点击的,但在其他情况下效果很好。

    【讨论】:

    • 我对 disabled 属性使用了类似的想法。在 IE 中添加 disabled 属性可防止点击事件,但如果有子项,它们仍会触发点击。覆盖孩子,使他们不可点击是一个很好的解决方案。我必须使用不透明度为 0 的背景颜色来让 IE 注册那里有一个实际元素。
    【解决方案7】:

    我花了将近两天的时间来寻找这个问题的解决方案,我终于找到了。

    这使用 javascript 和 jquery。

    (GitHub) pointer_events_polyfill

    这可以使用 javascript 插件来下载/复制。 只需从该站点复制/下载代码并将其保存为pointer_events_polyfill.js。将该 javascript 添加到您的网站中。

    &lt;script src="JS/pointer_events_polyfill.js&gt;&lt;/script&gt;

    将此 jquery 脚本添加到您的站点

    $(document).ready(function(){
        PointerEventsPolyfill.initialize({});
    });
    

    并且不要忘记包含您的 jquery 插件。

    有效!我可以单击透明元素下的元素。我正在使用 IE 10。我希望这也可以在 IE 9 及以下版本中使用。

    编辑:当您单击透明元素下方的文本框时,使用此解决方案不起作用。为了解决这个问题,我在用户点击文本框时使用焦点。

    Javascript:

    document.getElementById("theTextbox").focus();
    

    JQuery:

    $("#theTextbox").focus();
    

    这让您可以在文本框中输入文本。

    【讨论】:

      【解决方案8】:

      我找到了另一个解决方案来解决这个问题。如果浏览器窗口宽度大于 1'000px,我使用 jQuery 将href-属性设置为javascript:;(不是'',否则浏览器将重新加载页面)。您需要在链接中添加一个 ID。这就是我正在做的事情:

      // get current browser width
      var width = $(window).width();
      if (width >= 1001) {
      
          // refer link to nothing
          $("a#linkID").attr('href', 'javascript:;'); 
      }
      

      也许对你有用。

      【讨论】:

        【解决方案9】:

        使用OnClientClick = "return false;"

        【讨论】:

          【解决方案10】:

          您也可以“不”在&lt;a&gt; 标记内添加一个网址,我也为&lt;a&gt; 标记驱动的下拉菜单执行此操作。如果没有下拉列表,那么我添加 url,但如果有带有 &lt;ul&gt; &lt;li&gt; 列表的下拉列表,我只需将其删除。

          【讨论】:

            【解决方案11】:

            我也遇到过类似的问题:

            1. 我在指令中遇到了这个问题,我修复了它,添加 a 作为其父元素并为此设置了 pointer-events:none

            2. 上述修复不适用于选择标签,然后我添加了 cursor:text(这是我想要的),它对我有用

            如果需要普通光标,您可以添加 cursor:default

            【讨论】:

              【解决方案12】:

              最佳解决方案:

              .disabled{filter: alpha(opacity=50);opacity: 0.5;z-index: 1;pointer-events: none;}
              

              在所有浏览器上完美运行

              【讨论】:

              • IE 版本
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-06-04
              • 2019-10-29
              • 2018-03-20
              • 2020-12-28
              相关资源
              最近更新 更多