Iframe shimming или ie6 (и ниже) выберите z-index bug

Эмм, я не уверен, столкнулся ли кто-нибудь с этой проблемой
краткое описание на IE6, любые объекты <select> отображаются по любому другому элементу, даже div... означает, что если у вас есть фантастический эффект javascript, который отображает div, который должен быть поверх всего (например: lightbox, multibox и т.д...) onclick определенного элемента и что div перекрывает a <select> ваш div будет отображаться так, как если бы он находился под <select> [в этом случае максимальный и минимальный z-индекс не работает]

Я пробовал поиск по Google и нашел решение для обработки iframe
но мне нужны были довольно чистые альтернативы или еще лучше, кто-нибудь нашел лучшее решение? поскольку метод, использующий iframes, использует около 130 МБ оперативной памяти, может замедлить работу компьютеров с бедными людьми.

Ответ 1

Вам не нужно скрывать каждый select с помощью цикла. Все, что вам нужно, это правило CSS:

* html .hideSelects select { visibility: hidden; }

И следующий JavaScript:

//hide:
document.body.className +=' hideSelects'

//show:
document.body.className = document.body.className.replace(' hideSelects', '');

(Или вы можете использовать свою любимую реализацию addClass/removeClass).

Ответ 2

Существует плагин для jquery, называемый bgiframe, который упрощает реализацию метода iframe.

Лично, как веб-разработчик, я до такой степени, что меня больше не интересует пользовательский опыт в IE6. Я сделаю так, чтобы он был максимально приближен к "правильному", и убедитесь, что он работает, но, насколько скорость идет, слишком плохая. Они могут обновиться. IE7 (хотя все еще довольно медленный, по сравнению с любым другим браузером) вышел на 2 года (почти до дня!). IE8 скоро выйдет. Firefox доступен для каждой платформы. Safari также является опцией (и супер быстрой). Opera доступна для большинства/каждой платформы.

IE6 был выпущен более 7 лет назад. ИМХО, нет причин по-прежнему использовать его, кроме ленивых пользователей и некомпетентных ИТ-отделов (или если вы являетесь веб-разработчиком).

Ответ 3

в случае, если кому-то это интересно, вот некоторый код обрезки IE.

* html .shimmed {
    _azimuth: expression(
        this.shimmed = this.shimmed || 'shimmed:'+this.insertAdjacentHTML('beforeBegin','<iframe style="filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0);position:absolute;top:0px;left:0px;width:100%;height:100%" frameBorder=0 scrolling=no src="javascript:false;document.write('+"''"+');"></iframe>'),
        'inherit');
}

ref: этот смысл subtleGradient и этот сообщение от Zach Leatherman

Ответ 4

До IE7 выпадающий список был "оконным" элементом управления, означающим, что он был визуализирован как элемент управления непосредственно Windows, а не браузером, синтезирующим его. Таким образом, было невозможно поддерживать z-индексирование против других синтезированных элементов управления.

Чтобы появиться над DDL, вы должны использовать другой элемент управления, например IFRAME. Вы также можете использовать малоизвестную функцию только для IE, называемую window.createPopup(), которая по существу делает всплывающее окно без хромирования. У этого есть ограничения, такие как неустановившийся щелчок, но они действительно полезны, если вы создаете систему меню наведения.

Ответ 5

Самое простое и изящное решение этой раздражающей ошибки IE находится по адресу http://docs.jquery.com/Plugins/bgiframe с помощью jQuery.

Я пришел к такому выводу, попробовав в течение 2 дней, чтобы он работал с приложениями WebSphere Portal/Portal, где все динамично, в том числе меню перелета.

Ответ 6

Также есть метод activex, который я начинаю исследовать. Для этого требуется создать условный код для использования элемента управления activex вместо поля выбора для ie6. Там demo script показывает технику, которая обсуждается в подробнее здесь.

Обновление: похоже, что MS Office необходим для того, чтобы элемент управления active-x находился на пользовательской машине. В теории, возможно, можно было бы включить это где-то, так или иначе, но это становится намного беспощадным.

Ответ 7

Я знаю, что многие люди предлагали свои собственные советы, но в моем случае я просто просто спрятал select, используя jquery, как показано ниже.

$(':date').dateinput({
    format: 'dd/mm/yyyy',
    onBeforeShow: function(event) {
        $('select').hide();
    },
    onHide: function(event) {
        $('select').show();
    }
});