Как я могу заставить оплату после изменения DHTML в IE7?
У меня есть страница, где пользователь может динамически добавлять ящики для загрузки файлов. Добавление полей изменяет высоту div, в котором они находятся, но некоторые элементы div ниже него остаются в одном и том же месте, поэтому они начинают перекрываться с новыми элементами DOM.
Это корректно работает в IE8, Firefox, Chrome. Как заставить IE7 обновить страницу с помощью нового DHTML?
Лучшим решением, которое я разработал, было следующее:
window.resizeBy(1, 0);
setTimeout(UndoResize, 0);
Но он не работает с максимальным окном (он восстанавливает окно).
Ответы
Ответ 1
Try:
element.className = element.className;
на модифицированном div (или, возможно, его родительском или даже более отдаленном предке, в зависимости от различных факторов, таких как относительно позиционированное сдерживание).
По мере того, как className
было присвоено значение, IE будет перепланировать и перекрасить эту часть страницы, если CSS, влияющий на этот элемент, изменился. К счастью, это не оптимизировано, чтобы проверить, действительно ли значение className
изменилось с его предыдущего значения, поэтому приведенное выше приведет к возврату, не нарушая ничего другого.
Я нашел один случай, когда этот исправленный IE6, но сломал IE7, но попробуйте его и посмотрите, работает ли он для вас.
Ответ 2
Я просто потратил огромное количество времени на эту абсолютно нелепую ошибку (проявляющуюся только в 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) {}