Я этого совсем не понимаю. Вот код 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.
Теперь, если я включу режим совместимости IE,
проблема исчезнет без использования описанного выше хака. Выключите его, и проблема вернется (если нет взлома).
Но когда я попытался провести простой тест с использованием того же самого HTML (без пары тегов JSP) и урезанного SWF, который содержит только код изменения размера и инструменты для тестирования, все работает нормально. Однако в в том случае значок совместимости вообще не отображается.
Мы используем Tomcat 6.0.32. Я не знаю, что мы используем какие-либо специальные заголовки, и нет метатегов, касающихся режима совместимости IE (ни в основном приложении, ни в моем тестовом приложении).