2011-01-01 15 views
8

JavaScript関数がありますが、その中で私が書いた関数を呼び出すコードはゼロになっています。私の関数はDOMを使ってiFrameを生成し、srcを定義して別のDOM要素に追加します。しかし、私の関数が戻る前に、関数を含む関数を継続して実行できるようにするには、iFrameを完全にロードすることが不可欠です。不可能なインラインJavascriptの遅延/スリープ

1のsetTimeoutオプション:ここで

は、私が試してみましたが、なぜ彼らは動作しないものがあり、時間の
99.999%、これが答えです。事実、過去10年間、私はJavaScriptで指導してきましたが、いつもこのオプションを使用するためにコードをリファクタリングできると主張してきました。さて、私はついに見つけました!問題は、私の関数がインラインで呼び出されているため、iFrameのロードが完了する前に非常に次の行が実行されるとスクリプトが完全に中立し、スクリプトが完了すると外部スクリプトが続行されるということです。
(//のiFrameがロードされていない){//何もしない}時に使用このオプション:種類のコールバックは「何もしない」ループ

2を動作しません。理論的には、フレームがロードされるまでこれは戻らないでしょう。問題は、これがすべてのリソースを奪うので、iFrameは決して読み込まれないということです。このトリックは、非常に専門家ではないが、汚れたものなどは、インラインの遅延が必要なときには動作しますが、完了するために外部スレッドが必要なので、そうしないでしょう。
FFでは、数秒後にスクリプトが一時停止し、応答しないスクリプトがあるという警告がポップアップ表示されます。そのアラートがアップしている間、iFrameをロードしてから機能を復帰させることができますが、ブラウザを10秒間フリーズさせてから、ユーザーにエラーを正しく却下させる必要はありません。

3.モデルの対話:
私はFFのポップアップが関数の実行を停止し、それについて考えながらのiFrameをロードするために許可されていることに触発されたが、私はそれがモーダルためであることに気づきましたダイアログは、実行を停止する方法ですが、他のスレッドは続行できます!ブリリアントなので、私は他のモーダルオプションを試してみることにしました。 alert()のようなものは美しく動作します!それがポップアップすると、1/10秒間だけでも、iFrameは完了することができ、すべてがうまくいきます。 1/10秒で十分でない場合は、モデルダイアログをソリューション2のwhileループに置くことができます。これにより、iFrameが確実にロードされるようになります。甘い権利?私のスクリプトを実行するためにユーザーが解雇するための非常にプロフェッショナルな対話をポップアップさせなければならないという事実を除いて。私はこの行動のこのコスト/利益について自分自身と戦ったが、私のコードが1ページで10回呼び出されたシナリオに遭遇した!ページにアクセスする前に10アラートを却下する必要がありますか?それは90年代後半のスクリプトキディーのページを思い起こさせるもので、オプションではありません。そこ

4.無数他の遅延スクリプト:
約10 jQueryの遅延またはスリープ機能は、それらのいくつかは実際には非常に巧妙に開発されたが、どれが働いていない、があります。いくつかのプロトタイプオプションがありますが、私が見つけたものはありませんでした!他のライブラリやフレームワークでは、必要なものを持っていると主張していましたが、残念ながら彼らはすべて私に偽りの希望を与えようと共謀しました。

組み込みのモデルダイアログが実行を停止し、他のスレッドが続行できるようになるため、ユーザー入力なしで同じことを行うためのコードがいくつかアクセス可能でなければならないと確信しています。

コードは、何千もの行に文字通り何千もの行があり、独自仕様なので、この小さな問題の例を書きました。それはあなたが変更することができますONLYコードを注意することが重要であることはonlyThingYouCanChange機能に

テストファイルされる:

<html> 
<head> 
</head> 
</html> 
<body> 
<div id='iFrameHolder'></div> 
<script type='text/javascript'> 
function unChangeableFunction() 
{ 
    new_iFrame = onlyThingYouCanChange(document.getElementById('iFrameHolder')); 
    new_iFrame_doc = (new_iFrame.contentWindow || new_iFrame.contentDocument); 
    if(new_iFrame_doc.document)new_iFrame_doc=new_iFrame_doc.document; 
    new_iFrame_body = new_iFrame_doc.body; 
    if(new_iFrame_body.innerHTML != 'Loaded?') 
    { 
     //The world explodes!!! 
     alert('you just blew up the world! Way to go!'); 
    } 
    else 
    { 
     alert('wow, you did it! Way to go!'); 
    } 
} 
var iFrameLoaded = false; 
function onlyThingYouCanChange(objectToAppendIFrameTo) 
{ 
    iFrameLoaded = false; 
    iframe=document.createElement('iframe'); 
    iframe.onload = new Function('iFrameLoaded = true'); 
    iframe.src = 'blank_frame.html'; //Must use an HTML doc on the server because there is a very specific DOM structure that must be maintained. 
    objectToAppendIFrameTo.appendChild(iframe); 
    var it = 0; 
    while(!iFrameLoaded) //I put the limit on here so you don't 
    { 
     //If I was able to put some sort of delay here that paused the exicution of the script, but did not halt all other browser threads, and did not require user interaction we'd be golden! 
     //alert('test'); //This would work if it did not require user interaction! 
    } 
    return iframe; 
} 
unChangeableFunction(); 
</script> 
</body> 

はblank_frame.html:

<html> 
<head> 
</head> 
<body style='margin:0px'>Loaded?</body> 
</html> 


HERE私が答えです回答者からのコンバインド・アイデアから作成されました!あなたたち最高!私は変更することが許可された機能の
新しいソース:

function onlyThingYouCanChange(objectToAppendIFrameTo) 
{ 
    iFrameLoaded = false; 
    iframe=document.createElement('iframe'); 
    iframe.onload = new Function('iFrameLoaded = true'); 
    iframe.src = 'blank_frame.html'; //Must use an HTML doc on the server because there is a very specific DOM structure that must be maintained. 
    objectToAppendIFrameTo.appendChild(iframe); 
    var it = 0; 
    while(!iFrameLoaded) //I put the limit on here so you don't 
    { 
     if (window.XMLHttpRequest) 
     { 
      AJAX=new XMLHttpRequest(); 
     } 
     else 
     { 
      AJAX=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     if (AJAX) 
     { 
      AJAX.open("GET", 'slow_page.php', false); 
      AJAX.send(null); 
     } 
     else 
     { 
      alert('something is wrong with AJAX!'); 
     } 

     //If I was able to put some sort of delay here that paused the exicution of the script, but did not halt all other browser threads, and did not require user interaction we'd be golden! 
     //alert('test'); //This would work if it did not require user interaction! 
    } 
    return iframe; 
} 

slow_page.php:

<? 
usleep(100000);//sleep for 1/10th of a second, to allow iFrame time to load without DOSing our own server! 
?> 

私は何も私その関数の外でなかったと述べていることに注意したいです変更する可能性があり、PHPページを追加することは、その "ルール"に違反していたかもしれないが、私はそれを行うことができたかもしれません。もし私がそれを行うことができなかったら、がslow_page.phpの代わりにblank_frame.htmlを呼び出すことができました。そして、それは一度だけそれを呼び出す必要があったはずですiFrameの読み込み時間。何らかの理由でiFrameのロードが遅かった場合は、2ce(サーバーへの合計3回の呼び出し)と呼びます。

+1

新しい関数(){return code; } 'setTimeout'のコールバックで? –

+2

個人的には、これを必要とするデザインは非常に欠陥があると思いますが、学問的な観点からは答えがあるかどうかを知ることに興味があります。 –

+0

meder、setTimeoutは、わからないものを組み合わせる方法がない限り、継続的なJavaScriptの実行を許可します。私はいくつかの非常に巧妙なことをやったjQueryプラグインについて言及しましたが、私はそれを見つけ出して、誰も私のためには役に立たないものを分析しました。あなたが上の例でそれを働かせる方法を見つけることができるなら、私は興奮するでしょう!ブライアン。 ブライアン。私はあなたに同意する99.999%、そして数日前に私は100%と言っているだろうとインライン遅延が必要だと誰かと主張していたでしょう。残念ながら、私はここにそれを修正するコントロールがありません! – trex005

答えて

関連する問題