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;
。 并且函数在input
的click
事件中给出。 由于整个内容都在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
方法
你的代码非常不正确..
- 在
label
内input
? - 事件被假定为泡沫而不是向下
- 并且它如此简单..如果你想知道什么时候点击li附加一个处理程序,而不是输入
在你更新的4中,你可以为’input`点击做一个event.stopPropagation
,这将解决无限问题
从来没有受到过这样的打击,因为我做的事情有点不同 – 点击标签input.checked = !input.checked; return false;
input.checked = !input.checked; return false;
,然后在输入上有一个“更改”事件(而不是点击事件)。