2008-12-14 6 views
4

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

Поблагодарите других, подтверждающих это, и обсудите, почему это должно быть так.

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> 

ответ

0

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

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> 

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

1

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

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

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

Или, вы можете сделать это с любым количеством яваскрипта библиотек, как JQuery:

$(document).ready(function() { 
    //do stuff here 
}); 
0

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

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

    The Opera Developer Community article on timing and synchronization in JavaScript (даже при том, что он не говорит о IE конкретно) является действительно полезной статьей для чтения в этом контексте.

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