Я только что потратил невероятное количество времени на эту абсолютно нелепую ошибку (проявляющуюся только в IE7), на веб-странице, слишком сложной для размещения кода здесь, где element.className = element.className
не работал.
Окончательное решение для IE7 (ну, протестировано, по крайней мере, в том месте, где я столкнулся с ошибкой), кажется, выполняет ВСЕ строки ниже в качестве ловушки для любых изменений DOM:
try{
element.parentNode.style.cssText += "";
element.parentNode.style.zoom = 1;
element.style.cssText += "";
element.style.zoom = 1;
}catch(ex){}
Первые две строки (окруженные try-catch
) уже давно есть в нашем фреймворке, но в каком-то конкретном случае их оказалось недостаточно, но добавление следующих двух исправило это.
Проверено как в развернутом, так и в не развернутом окне.
try/catch
на месте, потому что в некоторых определенных обстоятельствах (например, внутри iframe
) он может генерировать ошибку JS, которая сломает приложение (это информация от моего коллеги по команде, я сам с этим не сталкивался).
Наоборот, для IE8 element.className = element.className
, кажется, делает свою работу (да, мы все любим условный код для каждой версии...)
Я люблю Win XP как операционную систему, но пока люди, привязанные к IE, не используют ее, нам приходится искать грязные исправления таких сумасшедших проблем... Чертовски грустно.
Изменить 2013.03.05
Фрагмент выше, похоже, работает в большинстве сценариев, но его недостаточно в одном месте. Теперь у нас есть такие вещи в нашем коде:
try {
var s1 = domElt.parentNode.style, s2 = domElt.style;
var dummyCss = "foo:foo;"; // do not add leading ';' here!
s1.cssText += "";
s1.zoom = 1;
s2.cssText += dummyCss;
s2.cssText = s2.cssText.replace(dummyCss, "");
} catch (ex) {}
person
jakub.g
schedule
16.05.2012