Динамическая загрузка jQuery mobile приводит к минимизации IE

Хорошо, это самая странная ошибка, с которой я когда-либо сталкивался. Это довольно просто, хотя. Если я загружаю jQuery, а затем jQuery mobile динамически в любой версии Internet Explorer, фактическое окно IE минимизируется. Это происходит во всех версиях IE через IETester, однако, если я запускаю полную версию в IE9, она запускает режим совместимости и по некоторым причинам не минимизирует.

Я пробовал разные способы загрузки скриптов (прокомментировано в примере кода), и все они приводили к одному и тому же поведению.

Почему это происходит? Есть ли способ обойти это?

http://jsfiddle.net/Xeon06/RCsuH/

2 ответа

Решение

Это известная проблема в jQuery mobile. Нарушающей строкой является jquery.mobile.navigation.js: 913.

// Kill the keyboard.
// XXX_jblas: We need to stop crawling the entire document to kill focus. Instead,
//            we should be tracking focus with a live() handler so we already have
//            the element in hand at this point.
// Wrap this in a try/catch block since IE9 throw "Unspecified error" if document.activeElement
// is undefined when we are in an IFrame.
try {
    $( document.activeElement || "" ).add( "input:focus, textarea:focus, select:focus" ).blur();
} catch(e) {}

Там призыв к blur() это отправляет окна IE в конец стека.

В качестве обходного пути вы можете избежать этого, поместив теги сценария физически в <head> HTML.

<!DOCTYPE HTML>
<html>
  <head>
    <link rel="stylesheet" href="http://code.jquery.com/mobile/latest/jquery.mobile.css" />
    <script src="http://code.jquery.com/jquery-1.6.2.js"></script>
    <script src="http://code.jquery.com/mobile/latest/jquery.mobile.js"></script>

...

Размещение тегов скрипта в другом месте документа или вставка их через скрипт вызывает ошибку.

Эта скрипка демонстрирует обходной путь в действии. Обратите внимание, что это работает только в документе верхнего уровня. Если документ находится в <iframe>ошибка все равно появится. Таким образом, если вы откроете редактор JSFiddle в IE 7/8, он все равно будет отправлен обратно; но если вы откроете только визуализированный HTML, он не будет.

Моя попытка "исправить" это: http://jsfiddle.net/RCsuH/6/

@ josh3736 был почти точно прав, где-то в коде он запускает document.body.blur() что вызывает минимизацию окна.

Мое исправление просто заменяет эту функцию неактивной. Мне не удалось заставить теги сценария запускать onload, когда они закончили загрузку, поэтому замена функции (при необходимости) остается за вами.

Однако все это, похоже, является ошибкой в ​​библиотеке jQuery Mobile, и поэтому вам, вероятно, следует подать в них отчет об ошибке. Тем не менее, я не уверен, что это будет их слишком беспокоить, так как в IE есть ошибка для платформы, предназначенной для мобильных телефонов / планшетов.

Примечание: это ужасный, ужасный код, который заменяет родные функции. Если это возможно, не используйте это.

Другие вопросы по тегам