showModelessDialog - ошибка onLoad - IE 7 - PullRequest
4 голосов
/ 14 декабря 2008

MSIE v7 не (в моих руках) не открывает диалог немодального режима и не вызывает событие onLoad, если на целевой странице есть предупреждение Javascript. Следующие ошибки в MSIE v7, но все в порядке в v6 (при необходимости доступен zip-файл с полным исходным кодом).

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

index.htm (здесь показана только функция javascript)

function openDialog(n) {
  if (typeof(window.showModalDialog) == 'object')  { /* Ensure of browser support */
    var sURL = 'modeless.htm';                       /* Set the URL */
    var oWin = window.showModelessDialog(sURL);      /* Create new modeless window */
  }
  else {
    alert('"showModlessDialog" not supported!');
  }
}

modeless.htm

<html>
  <head>
    <title>Modeless dialog</title>
  </head>
  <body bgcolor="#ff0000" text="#ffffff" onLoad="alert('Modeless is now loaded')">
    <center>
      <h1>Modeless</h1>
    </center>
    <script type="text/javascript" language="JavaScript">
      /* If the next line is included, it prevents the onLoad event occurring in MSIE v7 */
      alert('This alert stops the onLoad event in MSIE v7!');
    </script>
  </body>
</html>

Ответы [ 3 ]

1 голос
/ 22 декабря 2008

Похоже, что IE7 отображает правильное поведение. HTML читается и анализируется последовательно, включая скрипты. Когда синтаксический анализатор достигает предупреждения javascript, он выполняет его и ожидает возврата. Затем он может завершить анализ страницы и вызвать событие onLoad.

Если вы хотите, чтобы предупреждение отображалось после загрузки страницы, вы должны обработать само событие onLoad. Вы можете сделать это с помощью:

window.onload = function() {
    //do stuff here
}

Или вы можете сделать это с любым количеством библиотек javascript, таких как jQuery:

$(document).ready(function() {
    //do stuff here
});
0 голосов
/ 24 декабря 2008

Я думаю, что есть некоторая путаница по поводу использования alert () в теле HTML немодального диалога. Следующие пункты помогут легче объяснить наблюдаемое поведение:

  1. Код проверяет поддержку немодального диалога (Обнаружение объекта)
  2. Если да, в приведенной выше проверке перейдите к следующему шагу, иначе выведите предупреждение.
  3. В модальном диалоговом окне тело HTML загружается браузером и анализируется последовательно, как указано в другом ответе .
  4. Теги сценариев могут появляться в любом месте тела и будут анализироваться и выполняться MS Script Host (механизм JavaScript для MSIE). Поскольку предупреждение в модальном диалоговом окне отсутствует в функции, оно заканчивается обработкой как глобальным блоком кода и будет выполнено немедленно, когда выполнение блока сценария выполнено механизмом JS.
  5. Оповещения останавливают любое дальнейшее выполнение JavaScript. Выполнение JavaScript возобновится только после того, как пользователь отклонит предупреждение.
  6. Обработчик загрузки запускается только после полной загрузки и обработки документа. Следовательно, выполнение предупреждения задержит выполнение обработчика загрузки, пока пользователь не отклонит предупреждение, а остальная часть документа будет проанализирована и обработана.

    Статья сообщества разработчиков Opera о синхронизации и синхронизации в JavaScript (даже если она не говорит конкретно об IE) - действительно полезная статья для прочтения в этом контексте.

    Обновление : я пытался запустить похожий код как с сервера (Apache Tomcat), так и с файловой системы. Похоже, описанное поведение происходит, когда я открываю index.html из файловой системы, а не с сервера. Здесь могут работать настройки зоны IE.

0 голосов
/ 16 декабря 2008

Вы уверены, что это не ваше встроенное событие загрузки, которое его останавливает? Код ниже работает для меня.

index.htm

<html>
 <head>
  <title>Index</title>
  <script type="text/javascript" language="JavaScript">

   function openDialog() {
    if (window.showModalDialog)  { 
     var sURL = 'Modeless.htm';                       
     var oWin = window.showModelessDialog(sURL);      
    }
    else
    {
     alert('"showModlessDialog" not supported!');
    }
   }

   function addEventSimple(obj,evt,fn) {
    if (obj.addEventListener)
     obj.addEventListener(evt,fn,false);
    else if (obj.attachEvent)
     obj.attachEvent('on'+evt,fn);
    }

   function removeEventSimple(obj,evt,fn) {
    if (obj.removeEventListener)
     obj.removeEventListener(evt,fn,false);
    else if (obj.detachEvent)
     obj.detachEvent('on'+evt,fn);
    }

    addEventSimple(window, "load", openDialog);
  </script>
 </head>
 <body text="#ffffff">
  <h1 align="center">Index</h1>
 </body>
</html>

Modeless.htm

<html>
<head>
 <title>Modeless dialog</title>
  <script type="text/javascript" language="JavaScript">
   addEventSimple(window, "load", showAlert);

   function showAlert() {
    alert('Modeless is now Loaded');
   }

   function addEventSimple(obj,evt,fn) {
    if (obj.addEventListener)
     obj.addEventListener(evt,fn,false);
    else if (obj.attachEvent)
     obj.attachEvent('on'+evt,fn);
    }

    function removeEventSimple(obj,evt,fn) {
     if (obj.removeEventListener)
     obj.removeEventListener(evt,fn,false);
    else if (obj.detachEvent)
     obj.detachEvent('on'+evt,fn);
    }
  </script>
</head>
<body text="#ffffff" >
 <h1 align="center">Modeless</h1>
  <script type="text/javascript" language="JavaScript">
   /* If the next line is included, it prevents the onLoad event occurring in MSIE v7 */
   alert('This alert stops the onLoad event in MSIE v7!');
  </script>
</body>
</html>

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

...