IE 8 и ниже не запускают щелчок по элементам, которые имеют отображение: none; Любое обходное решение?
Проблема связана с 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"));
});
});
Обновление # 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;
}
Ответы
Ответ 1
Я думаю, что это довольно просто. Вам просто нужно использовать обработчики кликов для видимых элементов. Если вы хотите, чтобы щелчок на <label>
или <li>
работал, когда объект <input>
скрыт, и вы хотите, чтобы он работал во всех браузерах, вам просто нужно поместить обработчик клика либо в <label>
или <li>
, потому что это видимый объект, который получит щелчок при скрытии <input>
.
Ответ 2
Вид дерьмового исправления, но сделал трюк!
Поскольку это потому, что 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;
}
Ответ 3
Не можете ли вы установить абсолютный элемент, но установите его свойство left на что-то вроде -99999px?
Ответ 4
разные браузеры интерпретируют display:none
по-разному. display:none
на самом деле означает, что элемент должен исчезнуть, что затрудняет поиск jQuery в DOM.
лучший способ - использовать visibility:hidden
, а затем использовать метод click
Ответ 5
Ваш код в значительной степени неправильный.
-
input
внутри label
?
- События предполагают пузыриться вверх, а не вниз
- и его так просто.., если вы хотите знать, когда был нажат li, присоедините обработчик к нему и не введите
в вашем обновленном 4 вы можете сделать event.stopPropagation
для "ввода" щелчка и решить проблему бесконечности
Ответ 6
Никогда не удавалось это сделать, так как я делаю что-то немного по-другому - нажмите на ярлык input.checked = !input.checked; return false;
, а затем на событии появится событие "изменить" (а не событие щелчка).