2011-07-18 97 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