2011-07-18 132 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>'; 
} 

我真的很喜歡的解決方案是這樣的原因在Firefox刪除指示它刪除指示正確保存後會顯示文件對話框,但在IE它這麼想的只是工作。

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

Anny suggestions?

好的繼承人腳本,在IE和Firefox中工作。 基本上我需要檢查在Firefox中變成「NaN」的iframes就緒狀態,並首先在IE中「加載」並在完整(IE)上「交互」 因此,我創建了帶有「加載」值的startState以在瀏覽器導致IE更改它的狀態兩次,Firefox只有一次。 在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()」 - 有一個隱藏的eval,而是使用'setInterval(doS Omething,1000)' – mplungjan

+0

好吧,謝謝 – Kaido

回答

0

UPDATE:

使用短信 - MSDN - MDN - 安全地從一個網頁服務器上的溝通跨域/ crossframes到另一個頁面上的其他的服務器

這個怎麼樣

<?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

現在不用了,它也可以在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