IE的"指针 - 事件"属性替代方案

anu*_*anu 155 html css browser internet-explorer cross-browser

我有一个下拉导航菜单,其中一些标题在点击时不应导航到其他页面(这些标题在点击时打开一个下拉菜单),而其他标题应该导航(这些没有下拉列表并直接导航).但是,两者都是类型已经href定义了它们

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

pointer-events: none;
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Kyl*_*yle 87

Pointer-events是一个Mozilla hack,它已经在Webkit浏览器中实现,你不能指望在IE浏览器中看到它已经有一百万年了.

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

通过图层转发鼠标事件

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

也有另一种JavaScript解决方案在这里.

2013年10月的更新:显然它将在第11版进入IE.来源.谢谢蒂姆.

  • "你不能指望在IE浏览器中看到它再过百万年了."`仅用了3年...... (13认同)
  • 在W3C,这个问题因[点击劫持而引起争议](http://lists.w3.org/Archives/Public/www-style/2011Aug/0176.html).经验法则:一旦W3C公布了候选推荐,IE团队就会实施它并且总是会有[匆忙造成浪费]的教训(http://bit.ly/OifiM4).此外,Mozilla [全部说明](https://developer.mozilla.org/en-US/docs/CSS/pointer-events)"**警告:***在CSS中使用指针事件非SVG元素是实验性的.该特性曾经是CSS3 UI草案规范的一部分,但由于许多未解决的问题,已被推迟到CSS4.*" (11认同)
  • 根据caniuse.com,CSS指针事件即将发布到IE 11. http://caniuse.com/#feat=pointer-events (8认同)
  • ie9的文档说它支持这个属性(但我还没试过ie9).无论如何,我已经在脑海里想到了链接中给出的想法但是因为我正在寻找一些css特定的解决方案我不能使用它们.我将尝试修改html/js代码而不是花时间解决这个问题.非常感谢您的时间和帮助 (4认同)
  • IE11现在支持指针事件:无; :d (4认同)
  • 这不是为了回答@eyurdakul的理由 (4认同)
  • @KyleSevenoaks我想每个人都低估了微软.当前的IE开发很棒,特别是status.modern.ie.他们只需要尽快杀死IE8和9,我们很高兴进入现代发展的甜蜜天堂! (2认同)
  • 是的,是的,我们已经涵盖了这一点.这个答案是在微软被认为在浏览器构建方面不那么出色的时候构建的.时代已经改变,但答案仍然存在. (2认同)

Mar*_*cks 20

这是另一个使用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;

});
Run Code Online (Sandbox Code Playgroud)

  • 这非常有效!因为ie11应该开始支持指针事件,我只是把它包装在这个子句中:if(navigator.userAgent.toLowerCase().indexOf('msie')> 0)感谢! (3认同)
  • 这对我有用.我更喜欢小修正,我可以将其添加到我的js代码中,而不是添加大量的polyfills;) (2认同)

obi*_*144 17

IE有一个解决方法 - 使用内联SVG并在SVG中设置指针事件="无".请参阅我的答案如何使Internet Explorer模拟指针事件:无?


Nik*_*hil 9

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

<a href="contact.html" onclick="unleashTheDragon();" disabled="disabled">Contact</a>
Run Code Online (Sandbox Code Playgroud)

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

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

UPDATE 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;
        }
Run Code Online (Sandbox Code Playgroud)

使用Chrome,IE11和IE8.
当然,上面的CSS假定使用锚标记进行渲染disabled="disabled"


小智 6

这是一个实现此功能的小脚本(受到Kyle提到的Shea Frederick博客文章的启发):