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"));
    });
});​

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;
}

Fiddle: http://jsfiddle.net/VSQbD/

Ответы

Ответ 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;, а затем на событии появится событие "изменить" (а не событие щелчка).