2011-07-18 15 views
0

私は誰かがこれで私を助けることができる場合、私は喜んでいるので、ビッグjavascriptの達人ではありません。 私がしたいのは、ファイルが準備されている間、ファイルのダウンロードのための簡単なインジケータを表示することです。 Firefoxでは完全に動作しますが、IEローダーでは動作しません。これはPHPによって作成され、ダウンロードはiframe経由で行われます。 以下のコードからわかるように、私はドキュメントの準備ができているかどうかを確認しましたが、何らかの理由でIEのインタラクティブな状態を維持していますが、Firefoxではうまくいきません。Javascript! IEのドキュメント準備完了状態

if($_POST['download']) 
{ 
    echo '<iframe id="frame" src ="download.php?data='.$_POST['download'].'" width="0" height="0" frameborder="0" scrolling="no"></iframe>'; 

    echo '<div id="loader">'; 
    echo '<div id="loading-container"><p id="loading-content">Please wait while we prepare your files<img id="loading-graphic" width="220" height="19" src="images/indicator.gif" /></p></div>'; 
    echo '</div>'; 
    echo '<script type="text/javascript"> 

    var wooIntervalId = 0; 
    var i = 0; 
    function startInterval() 
    { 
     wooIntervalId = setInterval(doSomething, 1000); 
    } 

    function doSomething() 
    { 
     document.getElementById("loading-content").innerHTML = document.readyState + i; 
     i++; 
    } 

    function remove_elem() 
    { 
     element = document.getElementById("loader"); 
     element.parentNode.removeChild(element); 
    } 

    startInterval(); 

    </script>'; 
} 

私は本当にそれが後のファイルダイアログが表示されますが、IEでそれがうまく動作dosen't保存権利インジケータを削除し、Firefoxでこの原因のような指標を除去するためのソリューションが好きでした。

window.onload = function() 
    { 
     element = document.getElementById("loader"); 
     element.parentNode.removeChild(element); 
    } 

Anny suggestions?

IEとFirefoxで動作するOk heresスクリプト。 基本的に私はFirefoxで "NaN"を反転させるiframe ready状態をチェックする必要があります。まずIEで "読み込み"、完全(IE)で "インタラクティブ"にします したがって、両方のブラウザで値を "読み込む" IEの状態が2回、Firefoxが1回だけ変更されます。 ChromeとOperaのiframe準備完了状態は「未定義」に変わり、一度だけ実行されます。だれかがそれを修正すれば、それも素晴らしいことになります。

<script type="text/javascript"> 
    var startingState = "loading"; 
    var wooIntervalId = 0; 
    function startInterval() 
    { 
     wooIntervalId = setInterval(doSomething, 1000); 
    } 

    function doSomething() 
    { 
     var doc=document.getElementById("frame"); 
     if(startingState != doc.readyState) 
     { 
      remove_elem(); 
      clearInterval(wooIntervalId); 
     } 
    } 

    function remove_elem() 
    { 
     element = document.getElementById("loader"); 
     element.parentNode.removeChild(element); 
    } 
    startInterval(); 
    </script>'; 
+0

setInterval( "doSomething()"から "and()"を削除してください - 隠れた評価がありますが、代わりに 'setInterval(doS omething、1000) ' – mplungjan

+0

ありがとうございました – Kaido

答えて

0

UPDATE:

使用メッセージング - この

について 安全にご使用のサーバーの別の上の別のページに、サーバー上のページから、クロスドメイン/ crossframesを通信する

方法 - MDNからMSDN

<?PHP if (isSet($_POST['download'])) { ?> 
    $url = "download.php?data=".htmlentities($_POST['download']); 
    <iframe id="frame" src ="<?PHP echo $url; ?>" width="0" height="0" frameborder="0" scrolling="no" onload="remove_elem('loader')"></iframe> 
    <div id="loader">; 
    <div id="loading-container"><p id="loading-content">Please wait while we prepare your files<img id="loading-graphic" width="220" height="19" src="images/indicator.gif" /></p></div> 
    </div>'; 
    <script type="text/javascript"> 
    var wooIntervalId = 0; 
    var i = 0; 
    function startInterval() { 
     wooIntervalId = setInterval(doSomething, 1000); 
    } 

    function doSomething() { 
     document.getElementById("loading-content").innerHTML = document.readyState + i; 
     i++; 
    } 

    function remove_elem(elemId) { 
     var element = document.getElementById(elemId); 
     element.parentNode.removeChild(element); 
    } 

    startInterval(); 

    </script> 
<?PHP } ?> 
+0

これでいいですか.t Firefoxでもうまくいきます。もう一度メモしておくと、GIF画像が動くのを止めるので、インジケータはもう動かないが、画面上に残る(IEの私のバージョンで) – Kaido

+0

iframeを削除すれば、IEは期待どおりに動作し、 iframeがあれば、IEのような完全な外観にしてください。悪い点は、iframeに何かを追加してファイルのデータがブラウザの理由で直接出力されたことを確認することができないことです。これは、データセンターとウェブサイトが別のサーバーにあることを意味します。 – Kaido

+0

メッセージング[MSDN](http://msdn.microsoft.com/en-us/library/cc197015%28v=vs.85%29.aspx)[MDN](https://developer.mozilla.org/ en/DOM/window.postMessage) – mplungjan

関連する問題