1

特定のアクションでiframeを表示し、iframeをHTMLで埋めるページがあります(たとえば、複数選択ボックスとOKボタンなど)。

iframe の OK ボタンには、次のように onClick メソッドが定義されています。

onClick="parent.hideIFrame();parent.processMultiSelectBox();"

ユーザーが iframe で [OK] をクリックすると (おそらく複数選択ボックスで遊んだ後)、iFrame がすぐに消えて、複数選択ボックスで選択された値が処理できるようになります。しかし、これは起こっていることではありません。iFrame は、他の関数が実行されている間も表示されたままになり、2 番目の関数が終了した後にのみ消えます。

hideIFrame 関数は非常に単純です。

function hideIFrame() {
  frmObj = document.all.iFrameID;
  if(frmObj) {
    frmObj.style.visibility = "hidden";
  }
}

わかりやすくするために、上記の関数を言い換えました (いくつかのインジケーター変数の割り当てなどを削除しました)。

2 番目の関数は、複数選択オブジェクトのすべてのオプションを実際にループし、処理を行います。これには約 0.5 秒かかり、それが完了すると iFrame が消えます。[OK] をクリックしたときに 0.5 秒間残るのは少し面倒です。

私の質問は、くそったれをより速く消す方法があるかどうかです。「古典的な C」の用語で言えば、可視性の変更がすぐに発生する「フラッシュ」はありますか?

2 番目の関数の最初の行として「アラート」を配置すると、iframe はすぐに消えますが、2 番目の関数が完了するまでの間、アラート ボックスの [OK] が残ることに気付きました。

ありがとう。

編集: DDaviesBrackett の回答に基づいて、これは私がやったことです:

iframe の onclick が次のように変更されました。

onClick="parent.hideAndProcessMultiSelectBox(parm1, parm2);"

hideAndProcessMultiSelectBox 関数は次のように定義されています。

function hideAndProcessMultiSelectBox( parm1, parm2 ) {
   hideIFrame();
   setTimeout( function() { processMultiSelectBox( parm1, parm2 ); }, 0 );
}

出来上がり..遅れることはありません..

4

1 に答える 1

3

あなたはすでにあなたの問題の根源に到達しています。ドキュメントのリフローは、現在のJSスレッドが完了するまで発生しません(JSの実行中に何度も再描画しないようにするため)。高価な処理を行う前に、ブラウザに制御を戻す必要があります。

これを実現する最も簡単な方法は、明らかなコードを少しでも作成することはできませんがprocessMultiSelectBox、遅延0でsetTimeoutを呼び出すことです。

onClick="parent.hideIFrame();parent.setTimeout(parent.processMultiSelectBox,0);"

タイムアウトを設定しているものにパラメーターを渡す必要がある場合は、2つのオプションがあります。Javascript(悪い、悪い、非常に悪い、恐ろしい)と評価される文字列にタイムアウトを設定するか、あなたが興味を持っているもの:

onClick="parent.hideIFrame();parent.setTimeout(function(){parent.processMultiSelectBox(foo, bar, 'baz');},0);"

との間には違いがありますが、RSolbergの応答も役立つ場合がありvisibility:hiddenますdisplay:none

于 2009-06-12T22:31:18.053 に答える