Как я могу заставить оплату после изменения 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) {}