Właśnie zmarnowałem niesamowitą ilość czasu na ten absolutnie absurdalny błąd (przejawiający się tylko w IE7), na stronie internetowej zbyt skomplikowane, aby umieścić kod tutaj, gdzie element.className = element.className
nie działa.
Ostatecznym rozwiązaniem dla IE7 (dobrze, testowane przynajmniej w miejscu Napotkałem błąd) wydaje się być wykonywanie wszystkie linie poniżej jako haczyk do wszelkich zmian DOM:
try{
element.parentNode.style.cssText += "";
element.parentNode.style.zoom = 1;
element.style.cssText += "";
element.style.zoom = 1;
}catch(ex){}
Już od dawna mieliśmy dwie pierwsze linie (otoczone try-catch
) w naszym frameworku, ale w niektórych przypadkach okazało się to niewystarczające, ale dodanie dwóch następnych poprawiło to.
Testowane zarówno w oknie zmaksymalizowanym, jak i nie zmaksymalizowanym.
try/catch
jest na swoim miejscu, ponieważ w pewnych określonych okolicznościach (na przykład wewnątrz iframe
) może wygenerować błąd JS że złamie aplikację (jest informacji od moich kolegów z zespołu, nie spotkałem go samodzielnie).
Wręcz przeciwnie, dla IE8, element.className = element.className
zdaje się robić swoje zadanie (tak, wszyscy kochamy kod warunkowy dla każdej wersji ...)
Kocham Win XP jako systemu operacyjnego, ale do IE-bound ludzie go używają, musimy znaleźć brudne poprawki do takich szalonych problemów ... Cholera smutno.
Edit 2013.03.05
Powyższy fragment wydawało się działać w większości scenariuszy, ale też nie było na tyle w jednym miejscu.Teraz mamy takie rzeczy w naszym kodzie:
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) {}
Tak! Ten problem dotyczy elementów znajdujących się tuż pod ciałem, więc używam: document.body.className = document.body.className; Dzięki! –
Mmm doskonała poprawka - naprawiono problem z przepełnieniem IE7, który miałem – John
. jest. niesamowite. – allixsenos