Я просто потратил невероятное количество времени на эту абсолютно нелепую ошибку (проявляющуюся только в 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) {}