4

MSIE v7 は (私の手では) モードレス ダイアログを開いたり、ターゲット ページに Javascript アラートがある場合に onLoad イベントをトリガーしたりしません。以下は 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!');
  }
}

モードレス.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>
4

3 に答える 3

1

IE7 は適切な動作を示しているようです。HTML は、スクリプトを含めて順次読み取られ、解析されます。パーサーが JavaScript アラートに達すると、それを実行して戻りを待ちます。次に、ページの解析を終了し、onLoad イベントを発生させることができます。

ページがロードされた後にアラートを表示する場合は、onLoad イベント自体を処理する必要があります。これは、次の方法でネイティブに実行できます。

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

または、jQuery などの任意の数の JavaScript ライブラリでこれを行うことができます。

$(document).ready(function() {
    //do stuff here
});
于 2008-12-22T18:42:05.470 に答える
0

モードレス ダイアログの HTML 本文での alert() の使用について、多少の混乱があると思います。次の点により、観察された動作を説明しやすくなります。

  1. コードは、モードレス ダイアログ (オブジェクト検出) のサポートをチェックします。
  2. 上記のチェックで「はい」の場合は次のステップに進み、そうでない場合はアラートを表示します。
  3. モーダル ダイアログでは、他の回答で指摘されているように、HTML 本文がブラウザによってダウンロードされ、順次解析されます。
  4. スクリプト タグは本文のどこにでも表示でき、MS Windows Script Host (MSIE の JavaScript エンジン) によって解析および実行されます。モーダル ダイアログのアラートは関数内に存在しないため、コードのグローバル ブロックとして扱われなくなり、スクリプト ブロックの実行が JS エンジンによって行われるとすぐに実行されます。
  5. アラートは、それ以降の JavaScript の実行を停止します。JavaScript の実行は、ユーザーがアラートを無視した場合にのみ再開されます。
  6. onload ハンドラーは、ドキュメントが完全にダウンロードされてレンダリングされた場合にのみ起動されます。したがって、アラートの実行は、ユーザーがアラートを閉じるまで onload ハンドラーの実行を遅らせ、ドキュメントの残りの部分を解析してレンダリングします。

    JavaScript でのタイミングと同期に関する Opera Developer Community の記事(特に IE については触れていませんが) は、この文脈で読むと非常に役立つ記事です。

    更新: サーバー (Apache Tomcat) とファイル システムの両方で同様のコードを実行してみました。サーバーからではなくファイルシステムからindex.htmlを開くと、説明されている動作が発生するようです。IE のゾーン設定がここで機能している可能性があります。

于 2008-12-24T17:01:18.853 に答える
0

それを止めているのはインラインの onload イベントではありませんか? 以下のコードは私にとってはうまくいきます。

索引.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>

モードレス.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>

注: なんらかの理由で、モードレス ウィンドウに変更を加えて更新するには、ブラウザのキャッシュをクリアする必要があります。

于 2008-12-16T19:00:35.877 に答える