IE 8及以下版本不触发点击有display:none的元素; 任何解决方法?

问题出在Internet Explorer 8及更低版本中。 找到了一个体面的工作解决方案

问题

Internet Explorer 8及更低版本不会触发jQuery设置的click()事件(甚至可能是内联的,不确定) 元素,它们具有CSS属性, display设置为none 。 它适用于Internet Explorer 9,Mozilla Firefox和Google Chrome。 奇怪的。 这是代码的方式,是否有适用于Internet Explorer 8及更低版本的解决方法?

上下文

要单击的input display: none;样式display: none; 。 并且函数在inputclick事件中给出。 由于整个内容都在label ,因此当click label ,它会触发input上的click事件。 您可以将其作为某种漂亮的选择器,隐藏input

默认情况下, label隐式将click事件传递给第一个input ,这就是我想在这里使用它。 我不希望用户在这里看到丑陋的input 。 预期的浏览器行为,但不起作用。

HTML

 

导致问题的确切CSS

 ul li, ul li label {display: block; padding: 5px; cursor: pointer;} ul li label input {display: none;} ul li {border-bottom: 1px solid #ccc;} ul li:hover {background-color: #eee;}​ 

JavaScript的

 $(document).ready(function(){ $("input").click(function(){ alert("Hey you! " + $(this).attr("value")); }); });​ 

小提琴: http : //jsfiddle.net/qSYuP/


更新#1:尝试给出属性:

  

仍然不起作用!


更新#2:尝试CSS visibility: hidden;

 ul li label input {visibility: hidden;} 

打破布局。 但是,仍然无法正常工作!


更新#3:尝试CSS position: absolute;

 ul li label {overflow: hidden;} ul li label input {position: absolute; left: -99em;} 

作品! 我无法使用overflow: hidden; ,抓住了!


更新#4:手动触发click()函数:

 $(document).ready(function(){ $("input").click(function(){ console.log("Hey you! " + $(this).attr("value")); }); $("label").click(function(){ $(this).find("input").click(); }); }); 

那么,IE 8在打印LOG: Hey you! Button 3后会出现堆栈LOG: Hey you! Button 3 LOG: Hey you! Button 3 1209次!

 LOG: Hey you! Button 3 LOG: Hey you! Button 3 LOG: Hey you! Button 3 LOG: Hey you! Button 3 LOG: Hey you! Button 3 SCRIPT28: Out of stack space 

无限的作品! 应该是我的脚本的问题!


解决方案:有点蹩脚的修复,但做到了!

既然是因为IE 8支持opacity ,我不得不使用display: inline-block; opacity: 0;

 ul li label input { opacity: 0; width: 0px; height: 0px; display: inline-block; padding: 0; margin: 0; border: 0; } 

现在input的框是隐藏的,字面意思。 此修复程序仅适用于IE 8!

不得不修复使用IE 8及以下的Hack

 ul li label input { opacity: 0\9; width: 0px\9; height: 0px\9; display: inline-block\9; padding: 0\9; margin: 0\9; border: 0\9; } 

小提琴: http : //jsfiddle.net/VSQbD/

我认为这非常简单。 您只需在可见项目上使用点击处理程序。 如果你希望在对象被隐藏并且希望它在所有浏览器中工作时点击

  • ,那么你只需要在上放置一个点击处理程序或

  • 因为这是一个可见对象,当被隐藏时,它将接收到点击。

    有点蹩脚的修复,但做了伎俩!

    既然是因为IE 8支持opacity ,我不得不使用display: inline-block; opacity: 0;

     ul li label input { opacity: 0; width: 0px; height: 0px; display: inline-block; padding: 0; margin: 0; border: 0; } 

    现在input的框是隐藏的,字面意思。 此修复程序仅适用于IE 8!

    尝试使用IE 8 Hack:

     ul li label input { opacity: 0\9; width: 0px\9; height: 0px\9; display: inline-block\9; padding: 0\9; margin: 0\9; border: 0\9; } 

    你能不能将元素置于绝对位置,但是将它的左边属性设置为-99999px?

    不同的浏览器解释display:none不同。 display:none实际上意味着元素应该消失,使得jquery很难在DOM中找到。

    更好的方法是使用visibility:hidden然后使用click方法

    你的代码非常不正确..

    • labelinput
    • 事件被假定为泡沫而不是向下
    • 并且它如此简单..如果你想知道什么时候点击li附加一个处理程序,而不是输入

    在你更新的4中,你可以为’input`点击做一个event.stopPropagation ,这将解决无限问题

    从来没有受到过这样的打击,因为我做的事情有点不同 – 点击标签input.checked = !input.checked; return false; input.checked = !input.checked; return false; ,然后在输入上有一个“更改”事件(而不是点击事件)。