代码之家  ›  专栏  ›  技术社区  ›  justkt

动态创建的iframe用于下载带有firebug的文件触发器onload,但不包括

  •  3
  • justkt  · 技术社区  · 14 年前

    编辑 :因为这个问题现在已经“解决”到了工作点,所以我想知道原因。有关修复,请参阅下面的我的评论。

    我有一个Web应用程序,它反复动态下载wav文件(在超时后或按照用户的指示)到iframe中,以便触发默认音频播放器来播放它们。应用程序仅针对FF 2或3。为了确定文件何时完全下载,我希望对iframe使用window.onload处理程序。基于 this stackoverflow.com answer 我每次都创建一个新的iframe。只要使用该应用程序在浏览器上启用Firebug,一切都会很好地工作。没有Firebug,OnLoad就不会启动。Firebug的版本是1.3.1,而我已经测试了火狐2.0.0.19和3.0.7。有什么想法,当wav文件下载后,如何从iframe获取onload来可靠地触发它?还是有其他方法来表示下载完成?相关代码如下:

    HTML(隐藏的唯一属性是display:none;):

    <div id="audioContainer" class="hidden">
    </div>
    

    javascript(也可以使用jquery,但是innerhtml比我读到的html()快):

    waitingForFile = true; // (declared at the beginning of closure)
    $("#loading").removeClass("hidden");
    var content = "<iframe id='audioPlayer' name='audioPlayer' src='" +
        /path/to/file.wav + "' onload='notifyLoaded()'></iframe>";
    document.getElementById("audioContainer").innerHTML = content;
    

    以及notifyLoaded的内容:

    function notifyLoaded() {
        waitingForFile = false; // (declared at beginning of the closure)
        $("#loading").addClass("hidden");
     }
    

    我还尝试通过document.createElement创建iframe,但发现了相同的行为。每次启用firebug时都会触发onload,而且永远不会没有它。

    编辑: 修复了有关如何声明iframe并添加回调函数代码的信息。不,这里没有console.log调用。

    3 回复  |  直到 9 年前
        1
  •  4
  •   Jesse Taber    9 年前

    旧问题,但供将来参考: 根据我的经验,文件下载不需要onload。解决这个问题的一种方法是像这里一样使用cookie http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser/

        2
  •  0
  •   bcherry    14 年前

    以下是一个适用于我的示例,没有打开Firebug(在FF 3.6.2 Mac中测试): http://www.jsfiddle.net/Kukry/

    我正在使用jquery .load() 事件而不是 onload .

    var iframe = $("<iframe/>").load(function () {
        alert("loaded");
    }).attr({
        src: "http://code.jquery.com/jquery-1.4.2.min.js"
    }).appendTo($("#thediv"));
    

    请注意,我正在加载一个javascript文件,而不是一个音频文件,这样可能会有所不同。

        3
  •  0
  •   Johan    14 年前

    也许你在某处调用了一些Firebug内部函数,比如console.log()?在这种情况下,火狐会抛出一个异常,如果Firebug不活动,它可以停止执行。