Home > javascript, wtf, верстка, программирование > checked, name в checkbox и Ослик [IE]

checked, name в checkbox и Ослик [IE]

Я одного немогу понять – как IE со своими глюками и корявостью может держать 80% пользователей? Его тормознутость, полное игнорирование стандартов и непонятное поведение, причём всё рандомно. Это все знают и ничего не могут поделать. Даже сами разработчики. Тем более они. Так как работаю в webdev, очень много времени уходит на подтачивание разногласий и глючков со стороны IE. И седьмая версия точно положение не исправила. Вот и сегодня потратил полтора часа на понимание и исправление бага IE. А Вы знаете, что если динамически создавать checkbox или radio, то свойство name и checked установить после создания не получится? Нет? А я уже. Решение есть.

Как всё это было? В одном проэкте я динамически формирую форму с полями. И если поле основное, важное, то ставлю автоматом checked на чекбокс. Это выглядит в нормальном виде вот так:

  • my_att.png
  • Нормальные браузеры

Ослик же полностю игнорирует конструкцию (ниже), которая устанавливает checked = true.

inpO = document.createElement('input');
inpO.type = 'checkbox';
inpO.name = 'ftemp_' + id_fieldlist;
(field_type == 'main')? inpO.checked = true: inpO.checked = false;

Как я не бился в истериках, как не махал палкой, а он нивкакую!

И, только перерывши вагон документации, я понял, что придётся разделять рога и копыта – Ослика и братию. Ну отделить IE от того же Firefox и Opera можно простой конструкцией:

if(document.all){
  // Тут код для IE
} else {
  // Сюда всЁ остальное
}

Ничего сложного. Дальше начал рыть как же создавать checkbox`ы в самом IE, так как с правильными браузерами всё впорядке. Выход найден на форуме MSDN, где рассмотрено множество вариантов и даже те, которые не работают ;) Наиболее подходящий для меня вариант, который прошёл все тесты и логику и в сумме у нас получилась вполне красивый кусок функции:

if(document.all){
	(field_type == 'main')? tmp_c = 'checked': tmp_c = '';
	inpO = document.createElement('< input type="checkbox" + tmp_c+' name="ftemp_'+id_fieldlist + '">');
	inpO.setAttribute("checked", true);
} else {
	inpO = document.createElement('input');
	inpO.type = 'checkbox';
	inpO.name = 'ftemp_' + id_fieldlist;
	(field_type == 'main')? inpO.checked = true: inpO.checked = false;
}	

и что, сложно было разработчикам выпустить патч и профиксить такою подставу? Или чтобы жизнь мётом не казалась?

зы. Еще один баг (чуть не забыл) у IE есть в том, что он checkbox`ы с именем не создаёт. Вот что пишут на intenter.ru:

Проблема в том, что Internet Explorer не позволяет устанавливать значение атрибута name после того, как элемент уже был создан. Что же делать? Для того, чтобы обойти этот баг, программисты Microsoft сделали возможным создание элементов, уже имеющих некоторые аттрибуты.

Там же нашёл кроссбраузерную фунцию для создания обьектов с именем:

    //функция возвращает новый элемент с установленным аттрибутом name
    function createNamedElement(type, name) {
        var element = null;
        // Попытка создать элемент в стиле IE. Она будет неудачной в большинстве браузеров
        try {
            element = document.createElement('<'+type+' name="'+name+'">');
        } catch (e) {
        }
        if (!element || element.nodeName != type.toUpperCase()) {
            // Для не IE; использование стандартного метода создания элемента
            element = document.createElement(type);
            element.setAttribute("name", name);
        }
        return element;
    }

Вот и вся математика.

  1. July 2nd, 2007 at 20:52 | #1

    А от скажи..нах мені ще якусь хєрню ставить…. якщо це сцуко і так зхавало в мене кучу місця??? ІЕ форева. А ваші міліпіздріческі долі сєкунди у виконнані скрипту..мені пофіг :)

  2. July 3rd, 2007 at 09:43 | #2

    >> ІЕ форева

    Ненадо кидатись громкими фразами ) Ти просто “не в теме”. Та хоть i не розуміеш, але що тобі не удобніше користуватися альтернативою?

    >> А ваші міліпіздріческі долі сєкунди у виконнані скрипту..мені пофіг

    Ну не такы вони вже й “міліпіздріческі”:

    No Method IE 6 IE 7 FF 1.5 FF 2.0 Opera 9
    1 createElement() 1403 219 166 328 63
    2 createElement() full 1134 - - - -
    3 innerHTML 39757 20781 41058 307938 11391
    4 innerHTML optimized 10994 46 50 109 31
    5 innerHTML/join 400 31 47 125 31

    6 innerHTML/optimized 28934 109 84 172 62
    7 innerHTML/join 950 78 110 189 62

    Статистику мыряли не Эпли )))) – в полне адекватні люди

  3. July 3rd, 2007 at 16:15 | #3

    ОООООО!!! Цытата:

    YASIEQTMS (yet another stupid IE quirk – thanks Microsoft!)

  4. July 14th, 2007 at 09:27 | #4

    Ну забить на 80% коммерческая нотка не позволяет, да и пример бэк-енда, где есть редактор контента под 5.5 заточен.

  5. March 22nd, 2008 at 20:41 | #5

    Читал хабр – там общество по борьбе с ИЕ организовывают. Думал, во гады, навязывают народу свое мнение – кто ФФ, кто Оперу.
    Пришлось недавно веб-часть для одного проекта делать. Короче, может ИЕ и имеет право на жизнь, но его еще фиксить и фиксить (и еще раз фиксить).

  6. March 23rd, 2008 at 21:44 | #6

    А вот и другое мнение есть и намного более уважаемого человека в мире. И тут, как и везде, палка 37 см и может больно ударить по лицу. Хотя, почему же у других разработчивов всё получается, а у мелких так всё через ретмонд?

  1. No trackbacks yet.