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

Я совсем не понимаю этого.Вот некоторый код 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%.

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

ОБНОВЛЕНИЕ

@ 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 (в основном приложении или в моем тестовом приложении).

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Всякий раз, когда я вижу, что подобное происходит на любом языке, это потому, что есть другой код с ошибкой. Как вы указали, ваш простой случай не создает проблемы Попробуйте удалять другой код по несколько строк за раз до тех пор, пока проблема не исчезнет - последний удаленный код должен содержать проблему.

Приветствия

2 голосов
/ 30 сентября 2011

, как упоминает InvertedSpear, проверьте тип документа, у меня недавно были проблемы с IE9, и большая часть его сводилась к тегам типа Doc, запускающим режим совместимости, который мне не нужен, то же самое можно сказать и о метатеги, так что это может сводиться к вашим метатегам.

Вы всегда можете установить рабочий режим совместимости, используя также ссылки ниже.

от: http://evolpin.wordpress.com/2011/02/25/ie9-compatibility-and-the-meta-tag/

I 'мы обнаружили, что это действительно задокументировано Microsoft…

http://msdn.microsoft.com/en-us/library/cc288325(VS.85).aspx

«Заголовок X-UA-Compatible не чувствителен к регистру;однако он должен появляться в заголовке веб-страницы (раздел HEAD) перед всеми остальными элементами, кроме элемента title и других метаэлементов. ”

...