Удивительно странная ошибка JavaScript в IE 9: изменение заголовка документа приводит к выполнению последующего кода

Я этого совсем не понимаю. Вот код Javascript, который работает во всех браузерах, кроме IE 9. Он вызывается из Flash-ролика с использованием ExternalInterface и предназначен для динамического изменения размера фильма в DOM, если размер фильма изменяется внутри

function vResizeFlash(swfId, ht) {
    document.getElementById(swfId).height = "100%";
    document.getElementById('flashContainer').style.height = ht + "px";
}

Но все будет нормально, если я изменю document.title:

function vResizeFlash(swfId, ht) {
    // IE 9 won't run the rest of this function unless
    // we go through the charade of changing the document title.
    if (navigator.appName.indexOf("Microsoft") != -1) {
       var docTitle = document.title.replace(/^(.+?)\s*$/,"$1");
       document.title = docTitle + " ";
    }
    // Well-coded browsers begin here
    document.getElementById(swfId).height = "100%";
    document.getElementById('flashContainer').style.height = ht + "px";
}

Здесь я просто обрезаю все пробелы с правой стороны document.title , а затем добавляю один символ пробела к Это. Внезапно выполняются следующие строки. Примечание: на странице есть и другие вызовы ExternalInterface , и все они работают нормально даже в IE 9, так что это не проблема Flash / IE 9.

Я наткнулся на исправление, потому что менял заголовок, чтобы показать аргументы функции (в качестве быстрого теста отладки), просто чтобы убедиться, что функция запускается. И вдруг код сработал. Вынуть? Не работает. 100% воспроизводимость.

Кто-нибудь знает , почему имеет место это совершенно ошеломляющее поведение?

UPDATE

@ c69 поставил вопрос: «Может быть, это средство удаления мертвого кода IE9?»

Я не знал об этом, поэтому я пошел и погуглил и нашел эту статью по теме, а также некоторое обсуждение этого в другом месте.Однако я недостаточно знаю об этом, чтобы оценить, как это повлияет на двухстрочную функцию Javascript, тем более, что одна из строк действительно имеет референт на странице (хотя она загружается с опозданием через код SwfObject). Тем не менее, для «оптимизатора» кода было бы довольно плохой ошибкой удалять строки кода, которые он считал ненужными, потому что он не понимал, как они вызываются. И если он не смог понять, как вызываются строки, то как при вставке строки, делающей ложное изменение в document.title, этот код внезапно становится «необходимым»?

ОБНОВЛЕНИЕ 2

Другой кусок головоломки Это может иметь какое-то отношение к режиму совместимости IE 9. Страница запускается в стандартном режиме IE 9.

enter image description here

Теперь, если я включу режим совместимости IE,

enter image description here

проблема исчезнет без использования описанного выше хака. Выключите его, и проблема вернется (если нет взлома).

Но когда я попытался провести простой тест с использованием того же самого HTML (без пары тегов JSP) и урезанного SWF, который содержит только код изменения размера и инструменты для тестирования, все работает нормально. Однако в в том случае значок совместимости вообще не отображается.

enter image description here

Мы используем Tomcat 6.0.32. Я не знаю, что мы используем какие-либо специальные заголовки, и нет метатегов, касающихся режима совместимости IE (ни в основном приложении, ни в моем тестовом приложении).

45
задан Robusto 27 September 2011 в 20:49
поделиться