Проблема связана с Internet Explorer 8 и ниже. Нашли достойное рабочее решение.
Вопрос
Internet Explorer 8 и ниже не запускают событие click()
, установленное jQuery (или даже может быть встроенным, не уверенным) на элементы <input />
, у которых есть свойство CSS, display
установлено на none
. Он работает в Internet Explorer 9, Mozilla Firefox и Google Chrome. Weird. Это как код и есть ли работа для Internet Explorer 8 и ниже?
Контекст
При нажатии input
задается стиль display: none;
. И функция задается в click
событии input
. Поскольку весь материал находится внутри label
, он вызывает событие click
на input
, когда нажал label
. Вы можете считать это своего рода симпатичным селектором, скрывая input
.
label
неявно передает событие click
в первый input
по умолчанию, и именно это я и хочу использовать здесь. Я не хочу, чтобы пользователи видели уродливый input
здесь. Ожидаемое поведение браузера, но не работает.
HTML
<ul>
<li>
<label>
<input type="button" value="Button 1" />
Hello! This is a list item #1.
</label>
</li>
<li>
<label>
<input type="button" value="Button 2" />
Hello! This is a list item #2.
</label>
</li>
<li>
<label>
<input type="button" value="Button 3" />
Hello! This is a list item #3.
</label>
</li>
</ul>
Точный 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"));
});
});
Fiddle: http://jsfiddle.net/qSYuP/
Обновление # 1: Попробовал присвоить атрибут for
:
<label for="btn1">
<input type="button" value="Button 1" id="btn1" />
Все еще не работает!
Обновление # 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
для 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
Работает бесконечно! Должна быть проблема с моим script!
Решение: вид дерьмового исправления, но сделал трюк!
Поскольку это потому, что 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;
}