Які типові причини розробленого Javascript на Firefox не в IE? [зачинено]


108

Я розробив декілька розширених сторінок javascript, які добре працюють на останніх Firefox та Safari. Я пропустив перевірку в Internet Explorer, і тепер я знаходжу, що сторінки не працюють в IE 6 і 7 (поки що). Сценарії якимось чином не виконуються, на сторінках видно, що JavaScript там не було, хоча деякий JavaScript виконується. Я використовую власні бібліотеки з маніпуляцією з домом, з YUI 2 використовую YUI-Loader та XML-Http-Request, а на одній сторінці використовую "psupload", що залежить від JQuery.

Я встановлюю редактор Microsoft Script з Office XP і тепер буду налагоджувати. Я зараз також напишу конкретні тести.

Які типові несправні точки ІЕ? У якому напрямку я можу тримати очі відкритими.

Я знайшов цю сторінку, яка показує деякі відмінності. візит: Quirksmode

Чи можете ви зі свого досвіду назвати якісь типові речі, які я повинен спочатку шукати?

Тут також я буду задавати більше питань стосовно конкретних завдань пізніше, але наразі мене цікавить ваш досвід, чому IE зазвичай виходить з ладу у скриптах, які добре працюють у Firefox

Редагувати: Дякую за всі ці чудові відповіді!

Тим часом я адаптував весь код так, що він також працює з Internet Explorer. Я інтегрував jQuery і зараз будував свої власні класи. Це була моя основна помилка, що я не будував усі свої речі на jQuery з самого початку. Тепер я.

Також мені дуже допоміг JSLint.

І багато з окремих питань з різних відповідей допомогли.


Проблем із css або стилем поки що немає, як я це знав із попереднього кодування. Лише проблеми JS - karlthorwald
user89021

1
Я спершу запущу JSLint зараз на всіх файлах, є такі, які я ніколи не адаптував.
user89021

7
"Це була моя основна помилка, що я не будував усі свої речі на jQuery з самого початку". - це не вирішить магічним чином вирішити всі ваші проблеми з перехресним браузером. Шукайте stackoverflow для jQuery та IE, ви знайдете безліч питань. Найкраще навчитися розробляти сценарії крос-браузера самостійно, тому коли jQuery або один із його мільярдів ескізних плагінів не вдасться, ви зможете реалізувати справжнє робоче рішення для крос-браузера та знати, що воно працює, і чому.
Dagg Nabbit

11
+1 Немає коментарів вище. Вам дальше краще уникати jQuery повністю IFF ви вивчаєте javascript - jQuery надзвичайно корисний, якщо ви хочете зробити щось складне швидко і легко, але якщо ви навчаєтесь, це захистить вас від складності розуміння того, як насправді JavaScript працює - занадто багато людей, здається, знають jQuery, але не мають поняття, як писати JavaScript. Ви не помилилися спочатку, не спираючись на jQuery - тепер у вас є набагато краще розуміння власного коду, ніж ви б мали.
lucideer

Відповіді:


121

Будь ласка, не соромтесь оновити цей список, якщо ви бачите помилки / упущення тощо.

Примітка: IE9 виправляє багато з наведених нижче питань, тому багато цього стосується лише IE8 та нижче та певною мірою IE9 у режимі примх. Наприклад, IE9 підтримує SVG, <canvas>, <audio>і <video>спочатку, проте ви повинні включити режим сумісності зі стандартами , щоб вони були доступні.


Загальне:

  • Проблеми з частково завантаженими документами. Це гарна ідея додати JavaScript у window.onloadподібному випадку, оскільки IE не підтримує багато операцій з частково завантаженими документами.

  • Різні атрибути : У CSS це elm.style.styleFloatв IE та elm.style.cssFloatFirefox. У <label>тегах доступ до forатрибута здійснюється elm.htmlForв IE та elm.forFirefox. Зауважте, що forзарезервовано в IE, тому elm['for'], ймовірно, краща ідея зупинити IE від винятку.


Основна мова JavaScript:

  • Доступ до символів у рядках : 'string'[0]не підтримується в IE, оскільки це не в оригінальних специфікаціях JavaScript. Використовуйте 'string'.charAt(0)або 'string'.split('')[0]відзначайте, що доступ до елементів масивів значно швидший, ніж використання charAtз рядками в IE (хоча при splitпершому виклику є деякі початкові накладні витрати )

  • Коми до закінчення об'єктів: наприклад {'foo': 'bar',}, не допускаються в IE.


Проблеми, характерні для елемента:

  • Отримання documentIFrame :

    • Firefox та IE8 +: IFrame.contentDocument (IE почав підтримувати це з версії 8 ).
    • IE: IFrame.contentWindow.document
    • ( IFrame.contentWindowвідноситься до windowобох браузерів.)

  • Полотно: Версії IE до IE9 не підтримують <canvas>елемент. IE підтримує VML, що є аналогічною технологією, але explorercanvas може забезпечити на місці обгортку <canvas>елементів для багатьох операцій. Майте на увазі, що IE8 у режимі дотримання стандартів у багато разів повільніше і має набагато більше збоїв, ніж у режимі диваків при використанні VML.

  • SVG: IE9 підтримує SVG спочатку. IE6-8 може підтримувати SVG, але лише із зовнішніми плагінами, лише з деякими з цих плагінів, що підтримують маніпулювання JavaScript.

  • <audio>і <video>: підтримуються лише в IE9.

  • Динамічне створення радіо кнопок: IE <8 має помилку, яка робить радіо кнопки, створені document.createElementневірно. Див. Також Як динамічно створювати перемикач у Javascript, який працює у всіх браузерах? як спосіб обійти це.

  • Вбудований JavaScript у <a href>теги та onbeforeunloadконфлікти в IE: Якщо в hrefчастині aтегу є вбудований JavaScript (наприклад, <a href="javascript: doStuff()">тоді IE завжди відображатиме повідомлення, повернене з, onbeforeunloadякщо onbeforeunloadзаздалегідь не буде видалено обробник. Див. Також Попросити підтвердження під час закриття вкладки .

  • <script>Відмінності подій тегів: onsuccess і onerrorне підтримуються в IE і замінюються специфікою IE, onreadystatechangeяка запускається незалежно від того, вдалося чи не вдалося завантажити. Дивіться також JavaScript Madness для отримання додаткової інформації.


Розмір / положення / прокрутка та положення миші:

  • Отримання розміру / положення елемента : ширина / висота елементів іноді не elm.style.pixelHeight/Widthв IE elm.offsetHeight/Width, а й надійна в IE, особливо в режимі примх, і іноді один дає кращий результат, ніж інший.

    elm.offsetTopі про elm.offsetLeftних часто повідомляється неправильно, що призводить до того, що позиції елементів виявляються невірними, через що спливаючі елементи тощо відбиваються на кілька пікселів у багатьох випадках.

    Також зазначу , що якщо елемент (або батько елемента) має displayв noneто IE викликає виключення при зверненні розміру / положення атрибутів , а не повертаючись 0як це робить Firefox.

  • Отримайте розмір екрана (Отримання області видимого екрана):

    • Firefox: window.innerWidth/innerHeight
    • Режим стандартів IE: document.documentElement.clientWidth/clientHeight
    • Режим примх IE: document.body.clientWidth/clientHeight

  • Положення прокрутки документа / положення миші : це фактично не визначено w3c, тому є нестандартним навіть у Firefox. Щоб знайти scrollLeft/ scrollTopз document:

    • Firefox та IE у режимі примх: document.body.scrollLeft/scrollTop
    • IE в стандартному режимі: document.documentElement.scrollLeft/scrollTop
    • ПРИМІТКА. Також використовуються pageXOffset/ інші веб-переглядачі pageYOffset.

      function getDocScrollPos() {
       var x = document.body.scrollLeft ||
               document.documentElement.scrollLeft ||
               window.pageXOffset || 0,
           y = document.body.scrollTop ||
               document.documentElement.scrollTop ||
               window.pageYOffset || 0;
       return [x, y];
      };

    Для того, щоб отримати положення курсору миші, evt.clientXі evt.clientYв mousemoveподіях буде надано положення відносно документа, не додаючи положення прокрутки, тому попередня функція повинна бути включена:

    var mousepos = [0, 0];
    document.onmousemove = function(evt) {
     evt = evt || window.event;
     if (typeof evt.pageX != 'undefined') {
      // Firefox support
      mousepos = [evt.pageX, evt.pageY];
     } else {
      // IE support
      var scrollpos = getDocScrollPos();
      mousepos = [evt.clientX+scrollpos[0], evt.clientY+scrollpos[1]];
     };
    };

Вибір / діапазон:


Отримання елементів за ідентифікатором:

  • document.getElementByIdможе також посилатися на nameатрибут у формах (залежно від того, що визначено спочатку в документі), тому краще не мати різних елементів, які мають однакові nameта id. Це сягає часів, коли idне було стандарту w3c. document.all( власне IE-властивість ) значно швидше document.getElementById, але у нього виникають інші проблеми, оскільки він завжди визначає пріоритети nameраніше id. Я особисто використовую цей код, відмовляючись від додаткових чеків, щоб бути впевненим:

    function getById(id) {
     var e;
     if (document.all) {
      e = document.all[id];
      if (e && e.tagName && e.id === id) {
       return e;
      };
     };
     e = document.getElementById(id);
     if (e && e.id === id) {
      return e;
     } else if (!e) {
      return null;
     } else {
      throw 'Element found by "name" instead of "id": ' + id;
     };
    };

Проблеми з лише читанням внутрішнього HTML:

  • IE ніяк не підтримує установки innerHTML з col, colGroup, frameSet, html, head, style, table, tBody, tFoot, tHead, title, і trелементи. Ось функція, яка працює навколо цієї функції для елементів, пов’язаних із таблицею:

    function setHTML(elm, html) {
     // Try innerHTML first
     try {
      elm.innerHTML = html;
     } catch (exc) {
      function getElm(html) {
       // Create a new element and return the first child
       var e = document.createElement('div');
       e.innerHTML = html;
       return e.firstChild;
      };
      function replace(elms) {
       // Remove the old elements from 'elm'
       while (elm.children.length) {
        elm.removeChild(elm.firstChild);
       }
       // Add the new elements from 'elms' to 'elm'
       for (var x=0; x<elms.children.length; x++) {
        elm.appendChild(elms.children[x]);
       };
      };
      // IE 6-8 don't support setting innerHTML for
      // TABLE, TBODY, TFOOT, THEAD, and TR directly
      var tn = elm.tagName.toLowerCase();
      if (tn === 'table') {
       replace(getElm('<table>' + html + '</table>'));
      } else if (['tbody', 'tfoot', 'thead'].indexOf(tn) != -1) {
       replace(getElm('<table><tbody>' + html + '</tbody></table>').firstChild);
      } else if (tn === 'tr') {
       replace(getElm('<table><tbody><tr>' + html + '</tr></tbody></table>').firstChild.firstChild);
      } else {
       throw exc;
      };
     };
    };

    Також зауважте, що IE вимагає додавання <tbody>до a <table>перед додаванням <tr>s до цього <tbody>елемента під час створення document.createElement, наприклад:

    var table = document.createElement('table');
    var tbody = document.createElement('tbody');
    var tr = document.createElement('tr');
    var td = document.createElement('td');
    table.appendChild(tbody);
    tbody.appendChild(tr);
    tr.appendChild(td);
    // and so on

Відмінності подій:

  • Отримання eventзмінної: події DOM не передаються функціям в IE і доступні як window.event. Одним із поширених способів отримання події є використання, наприклад,
    elm.onmouseover = function(evt) {evt = evt||window.event}
    за замовчуванням, window.eventякщо evtне визначено.

  • Основні відмінності коду подій: Ключові коди подій різко змінюються, хоча якщо ви подивитесь на Quirksmode або JavaScript Madness , навряд чи це специфічно для IE, Safari та Opera знову відрізняються.

  • Мишачі відмінності подій:button атрибут в IE є біт-прапор , який дозволяє використовувати кілька кнопок миші відразу:

    • Зліва: 1 ( var isLeft = evt.button & 1)
    • Праворуч: 2 ( var isRight = evt.button & 2)
    • Центр: 4 ( var isCenter = evt.button & 4)

      Модель W3C (підтримується Firefox) менш гнучка, ніж модель IE, лише одна кнопка, дозволена одразу з лівою як 0, правою як 2і в центрі 1. Зауважимо, що, як згадує Пітер-Поль Кох , це дуже контрінтуїтивно, оскільки 0зазвичай означає «кнопка немає».

      offsetXі offsetYє проблематичними, і, мабуть, найкраще їх уникати в IE. Більш надійним способом отримати offsetXі offsetYв IE було б отримати положення відносно розташованого елемента і відняти його від clientXі clientY.

      Також зауважте, що в IE для отримання подвійного клацання у clickподії вам потрібно буде зареєструвати і функцію a, clickі dblclickподію на функції. Firefox спрацьовує clickтак само, як і dblclickпри подвійному клацанні, тому для виявлення такої поведінки потрібно специфічне IE-виявлення.

  • Відмінності в разі моделі обробки: Обидва запатентованої моделі IE і модель обробки підтримки Firefox подій від низу до верху, наприклад , якщо є події в обох елементах , <div><span></span></div>тоді подій викличуть в span то в , divа не порядок , який вони пов'язаний, якщо традиційний напр elm.onclick = function(evt) {}.

    Події "Захоплення", як правило, підтримуються лише у Firefox тощо, що призведе до divтогочасних spanподій у порядку згори вниз. IE має elm.setCapture()і elm.releaseCapture()для перенаправлення подій миші з документа на елемент ( elmв даному випадку) перед обробкою інших подій, але вони мають ряд продуктивності та інших проблем, тому, ймовірно, цього слід уникати.

    • Firefox:

      Attach : elm.addEventListener(type, listener, useCapture [true/false])
      Detach : elm.removeEventListener(type, listener, useCapture)
      ( typeнаприклад, 'mouseover'без on)

    • IE: У IE може бути додано лише одну подію заданого типу для елемента - виняток створюється, якщо додано більше однієї події одного типу. Також зауважте, що у функціях подій thisпосилається на windowзамість пов'язаного елемента (тому це менш корисно):

      Attach : elm.attachEvent(sEvent, fpNotify)
      Detach : elm.detachEvent(sEvent, fpNotify)
      ( sEventє наприклад 'onmouseover')

  • Різниці в атрибутах події:

    • Зупиніть обробку подій будь-якими іншими функціями прослуховування :

      Firefox: evt.stopPropagation()
      IE: evt.cancelBubble = true

    • Припиніть, наприклад, ключові події від вставки символів або зупинення прапорців від перевірки:

      Firefox: evt.preventDefault()
      IE: evt.returnValue = false
      Примітка: Тільки повернення falseв keydown, keypress, mousedown, mouseup, clickі resetтакож запобігти дефолту.

    • Отримайте елемент, який ініціював подію:

      Firefox: evt.target
      IE: evt.srcElement

    • Отримання елемента, від якого курсор миші відсунувся: evt.fromElement у IE знаходиться evt.targetу Firefox, якщо у onmouseoutвипадку, інакшеevt.relatedTarget

    • Отримання елемента, на якому переміщується курсор миші: evt.toElement в IE знаходиться evt.relatedTargetу Firefox, якщо в onmouseoutподії, інакшеevt.target

    • Примітка: evt.currentTarget (елемент, з яким пов'язана подія) не має еквівалента в IE.


12
Дуже, дуже, дуже приємний список! Дякую всім, хто зробив свій внесок :)
cwap

26

Також перевірте, чи немає у коді таких кодів, як ці або подібні

var o={
'name1':'value1',
'name2':'value2',
} 

остання кома (наступне значення2) буде допущена Firefox, але не IE


1
Більшість хороших редакторів мають наздогнати цього
SeanJA

1
+1, у мене це було занадто часто.
Девід В.

1
Я б тобі дав +10, якби міг - це трапляється зі мною весь час.
Джош

О, і додати до коментаря @ SeanJA: Я нещодавно перейшов на NetBeans, який все це сприймає.
Джош

Я втратив стільки годин на цьому, коли вперше я робив якусь роботу з JS. Тепер це перше, що я перевіряю! Прокляття шалених розширень Textmate, залишаючи коми навколо.
Agos

12

Якщо ви дотримуєтесь використання jQuery або YUI для позначення вашої публікації, у вас повинні бути мінімальні відмінності між браузерами ... саме для цього створені рамки, щоб піклуватися про ці відмінності між переглядачами.

Для прикладу, подивіться на сторінку обходу DIM-привабливого типу DIM , згідно з якою IE не підтримує більшість речей ... в той час як true, фреймворки, наприклад, IE не підтримує elem.childElementCount, але в jQuery: $(elem).children().size()працює, щоб отримати це значення, у кожному браузері. Ви знайдете щось у бібліотеці, щоб обробити 99% непідтримуваних випадків у веб-переглядачах, принаймні зі сценарієм ... із CSS вам, можливо, доведеться перейти до плагінів для бібліотеки, загальним прикладом цього є отримання округлих кутів працює в IE ... оскільки у нього немає підтримки CSS для такого.

Якщо ви починаєте робити щось безпосередньо, наприклад document.XXX(thing), ви не знаходитесь у бібліотеці, ви робите JavaScript безпосередньо (це все javascript, але ви розумієте :), і це може чи не може спричинити проблеми, залежно від того, як П'яний команда IE була при здійсненні саме цієї функції.

З IE ви більше шансів на те, що стилізація вийде правильно, ніж необроблені проблеми з JavaScript, анімація на кілька пікселів і подібні речі, тим більше в IE6, звичайно.


Я зараз краще розумію. Так, я теж робив такі речі безпосередньо. karlthorwald
користувач89021

1
Якщо ви використовуєте IDE, як Netbeans, ви можете встановити цільові браузери для свого javascript, і це також допоможе, попереджаючи вас, коли ви робите щось, що, здається, не підтримується.
SeanJA

10

getElementbyID також буде відповідати атрибуту імені в IE, але не в інших браузерах, і IE вибере те, що знайде першим.

приклад:

<script>
 var foo = document.getElementById('bar');
</script>

....
<input name="bar" type="text" />  //IE will get this element
<span id="bar"> Hello, World! </span>  //FF,Safari,Chrome will get this element

3
вибачте за грубість, але IE справді некрасивий
user89021

12
document.getElementByIdOrNameIGuessWeverMan (id);
JulianR

5

Є багато речей, але одна пастка, в яку я потрапляв, полягала в тому, що багато браузерів приймає JSON без цитованих імен, тоді як ie6 і ie7 - ні.

{ name: "Jakob" } // will often work, but not in ie6/ie7
{ "name": "Jakob" } // Better!

Редагування : Для уточнення, це лише проблема, коли потрібен фактичний JSON, на відміну від об'єкта-букваря. JSON - це підмножина синтаксису буквеного об'єкта і має на увазі формат обміну даними (як XML), тому він розроблений для вибору.


2
Зауважте, що це залежить від контексту, об'єктний літерал - це нормально, JSON - це не так ... але, наприклад, jQuery взагалі не дозволяє недійсний JSON в останньому випуску.
Нік Крейвер

Не мій відгук ... але ви повинні уточнити це для інших, а потім +1 від мене.
Нік Крейвер

5

Різна підтримка JavaScript

IE не підтримує (більшість) розширень, доданих до JavaScript з 1.5.

Нове в 1.6

  • Методи масиву - indexOf(), lastIndexOf(), every(), filter(),forEach() , map(),some()
  • for each ... in - ітератує значення замість імен властивостей.

Нове в 1.7

Нове в 1.8

  • Методи масиву - reduce() ,reduceRight()
  • Ярлики для визначення функцій.

Деякі з цих речей вимагають вказати номер версії JavaScript для запуску (який зламається під IE), але деякі речі на кшталт [1,2,3].indexOf(2)можуть не здаватися такою великою справою, поки ви не спробуєте запустити його в IE


1
JavaScript, про який ви тут говорите, - це JavaScript mozilla (TM), а не javascript у більш загальному сенсі. Не всі реалізації ECMAScript / двигуни javascript (MS JScript у цьому випадку) слід очікувати за JavaScript JavaScript (TM). ECMAScript - це стандарт, а не JavaScript (TM), а JavaScript (TM) - не JavaScript. Сподіваюся, це мало сенс.
Dagg Nabbit

Має сенс для мене, але по темі про сумісність JavaScript та JScript я зрозумів, що це буде зрозуміло вже :)
gnarf

Коли ви говорите "IE не підтримує (більшість) розширень, доданих до JavaScript з 1.5.", Це здається, що ви говорите, що JavaScript mozilla JavaScript (TM) - це стандарт, якого IE повинен дотримуватися, звичайно, це не так. Ви можете, принаймні, сказати JavaScript Mozilla або подібний JavaScript ... інший браузер не підтримує всі розширення mozilla до ECMAScript, як деструктивне призначення тощо. Питання полягало у відмінностях між "більшістю" javascriptта (конкретною реалізацією) JScript, а не відмінностями між Mozilla JavaScript(TM)та JScript. Можливо, буде краще показати, де IE відхиляється від ES.
Dagg Nabbit

3

Основні відмінності JavaScript у IE та JavaScript у сучасних браузерах (наприклад, Firefox) можна пояснити тими самими причинами, що лежать у відмінності між крос-браузером CSS / (X) HTML. Ще в той день не було фактичного стандарту; IE / Netscape / Opera вела війну за дерни, реалізуючи більшість специфікацій, але також опускаючи деякі, а також роблячи власні специфікації, щоб отримати переваги один над одним. Я міг би продовжити, але давайте пропустити вперед до випуску IE8: JavaScript роками уникали / зневажали, і з ростом FF та зневагою до веб-комунальних служб IE вирішив зосередити увагу переважно на просуванні свого CSS з IE6. І в основному залишив підтримку DOM позаду. Підтримка DOM IE8 може також бути IE6, яка з'явилася в 2001 році .... тому підтримка DOM IE майже на десятиліття відстає від сучасних браузерів. Якщо у вас є розбіжності JavaScript, зокрема, в механізмі компонування, найкраще зробити це, щоб атакувати його так само, як ми вирішили проблеми CSS; Націлювання на цей веб-переглядач. НЕ ВИКОРИСТОВУЙТЕ БРУСЕРСЬКЕ РОЗМІСТАННЯ, використовуйте функцію виявлення функцій, щоб нюхати браузер / це рівень підтримки DOM

JScript - не власна реалізація ECMAScript IE; JScript - відповідь IE на JavaScript Netscape, обидва вони існували ще до ECMAScript.

Що стосується атрибутів типу для елемента сценарію, тип = "text / javascript" є стандартним стандартом (принаймні в HTML5), тому вам ніколи не потрібен атрибут типу, якщо ваш сценарій не JavaScript.

Наскільки IE не підтримує innerHTML ... innerHTML був винайдений IE і донині НЕ є стандартом DOM. Інші браузери прийняли його, тому що він корисний, саме тому ви можете використовувати його крос-браузер. Що стосується динамічного зміни таблиць, MSDN каже «з - за специфічною структури , необхідної таблиці, в InnerText і innerHTML властивості таблиці і т.р. об'єктів тільки для читання.» Я не знаю, наскільки це було справді спочатку, але очевидно, що сучасні браузери зрозуміли це, розбираючись зі складнощами компонування таблиць.

Я настійно рекомендую прочитати PPK на JavaScript Сценарії DOM Джеремі Кейта Дуглас Крокфорд : хороші частини та початок JavaScript Крістіана Хеллмана з DOM Scripting та Ajax, щоб отримати чітке розуміння JavaScript.

Що стосується фреймворків / бібліотек, якщо ви ще не маєте чіткого розуміння JavaScript, вам слід уникати їх. 2 роки тому я потрапив у пастку jQuery, і, хоча мені вдалося зняти чудові подвиги, я ніколи не дізнався прокляте про кодування JavaScript належним чином. Зрештою, jQuery - це жахливий дивовижний інструментарій DOM, але моя неспроможність засвоїти належне закриття, прототипічне успадкування тощо, не лише повернула мої особисті знання назад, і моя робота почала робити величезні хіти продуктивності, тому що я не мав підказки, що я робив.

JavaScript - мова браузера; якщо ви клієнт / інженер-інженер, це найважливіше значення, що ви керуєте JavaScript. Node.js приносить JavaScript повний нахил, я щодня бачу величезні кроки у своєму розвитку; JavaScript на сервері стане стандартом вже в найближчому майбутньому. Я згадую про це, щоб ще більше підкреслити те, наскільки важливим зараз є і яким буде JavaScript.

JavaScript буде робити більше хвиль, ніж Rails.

Щасливого сценарію!


2
Приємна відповідь, хоча я не згоден з використанням функції виявлення функцій для обнюхання браузера; використовуйте виявлення функцій лише для тестування на підтримку цих функцій. Також дивіться приклади в Розпізнавання функцій - це не виявлення браузера .
Марсель Корпель

мех. я повністю згоден з вашою незгодою. дякую за те, що це зробив. Я все ще JavaScript n00b, але в моїй грі немає сорому. "Виявлення браузера на основі функцій - це дуже погана практика, якої слід уникати будь-якою ціною. Пряме виявлення функцій є найкращою практикою, і майже в кожному випадку - саме те, що вам потрібно".
Альберт

2

Деякі власні об’єкти читаються лише для читання, але насправді це не здається (ви можете написати їм, але це не має ефекту). Наприклад, звичайний розширений javascript заснований на розширенні Elementоб'єкта шляхом переосмислення системних методів, скажімо, зміни Element.prototype.appendChild (), щоб зробити більше, ніж додати дочірній вузол - скажімо, ініціалізувати його з даними батьків. Це не вдасться в IE6 мовчати - оригінальний метод буде застосовано на нових об'єктах замість нового.

Деякі браузери (я не пам’ятаю, який зараз) вважають нові рядки між тегами HTML текстовими вузлами, а інші - не. Тож childNodes (n), nextSibling (), firstChild () тощо будуть вести себе дуже по-різному.


2

Трейлінг коми в масивах та об'єктних літералах, які раніше були проблемою, нещодавно не перевіряли (маючи на увазі IE8):

var a = [ 1, 2, 3, ];
var o = { a:1, b:2, c:3, };

Це може викликати додатковий код при генерації таких структур на стороні сервера.


2

Я щойно знайшов його сьогодні вранці, колега встановив тег сценарію як: <script type="application/javascript">тому що його ідея самозаповнення мала це перед "text / javascript"

Але, виявляється, IE просто ігнорує весь сценарій, якщо ви використовуєте "application / javascript", вам потрібно використовувати "text / javascript"


javascript за замовчуванням у всіх браузерах, тому використовуйте просто<script>
Lauri

2

Я знайшов дивну химерність днями із Internet Explorer. Я використовував YUI і замінював вміст тіла таблиці (), встановлюючи InternalHTML

Y.one('#elementId').set('innerHTML', '<tr><td>Column 1</td></tr>');

Це буде працювати у всіх браузерах, Окрім IE. Я нарешті виявив, що ви не можете замінити InternalHTML таблиці в IE. Мені довелося створити вузол за допомогою YUI, а потім додати його.

var myNode = Y.node.create('<tr><td>Column 1</td></tr>');
Y.one('#elementId').append(myNode);

Це було цікаво розібратися!


1
У мене таке відчуття, що вам потрібно обернути це <tbody>тегами.
Кейсі Чу

У вихідному коді він фактично загорнутий у тег <tbody>. Це все ще дує, що IE не сподобалось. Я пам'ятаю, як читав його в офіційних документах Microsoft, але зараз не можу знайти посилання. Вибачте!
Джастін

1

Додаткові коми та відсутні коми ставали звичайною проблемою в IE, поки вона безперебійно працює на FF.


1

IE дуже суворо ставиться до відсутності ";" так це зазвичай так.


Я знаходжу багато з них, поки я зараз jsLinting. Здається, це важливий момент.
user89021

1

Що це того, що я щойно стикався з цим неприємним питанням в <IE9

скажіть, у вас є такий html:

<table><tr><td>some content...</td></tr></table>

і чомусь (у мене був хороший) вам потрібно отримати весь HTML в таблиці до останнього закриття TR, ви можете спробувати щось подібне:

var tableHtml = document.getElementById('thetable').innerHTML;
var fragment = tableHtml.substring(0, tableHtml.lastIndexOf('</tr>'));

<IE9 тут нічого не поверне (-1), оскільки змінна tableHtml містить усі теги html у верхньому регістрі та lastIndexOf залежно від регістру. Щоб обійти це, мені довелося кинути toLowerCase () перед lastIndexOf.


0

IE не є сучасним веб-переглядачем, і лише він слідує ECMAScript.


0

Ви згадали jQuery, з яким я менш знайомий, але для загальної довідки, а саме з Prototype, одна річ, на яку слід стежити, - це зарезервовані слова / назви методів в IE. Я знаю, що мене часто отримує такі речі:

someElement.appendChild(new Element('label',{ **for**: someInput.id }).update( someLabelText );

(new Element (tagName, propertyHash) - це те, як створюються нові елементи в Protitype). В IE for:повинно бути 'for':, бо forце зарезервоване слово. Що має повний сенс - але FireFox це потерпить.

Ще один приклад:

someElement.wrap('div').addClassName('someClass')

( wrapметод у прототипі обгортає один елемент в інший) - У IE, на textareas, wrapє властивістю, і його Element.wrap()потрібно використовувати замість методизованої версії

Це два приклади, які приходять на думку з мого досвіду. Вони засновані на прототипі, але основна проблема не полягає: слідкуйте за будь-якими методами / мітками / ідентифікаторами, які IE вважає зарезервованими словами, але FireFox або Safari будуть терпіти.


0

Справа в тому, що IE не підтримує JavaScript ... Він підтримує власну реалізацію ECMAScript: JScript ..., який є різним ...


0

Використання console.log()для виведення помилок на консоль помилок Firefox призведе до відмови ваших сценаріїв в IE. Треба пам’ятати, щоб вийняти їх під час тестування в IE.


Я вважаю, що використання console.log також вийде з ладу навіть у Firefox, якщо у вас не включений FireBug.
ejel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.