【问题标题】:IE 11 onload is never called永远不会调用 IE 11 onload
【发布时间】:2017-10-11 23:40:01
【问题描述】:

我的网页有以下 javascript

function LoadPDF(filename)
{
    var loc = filename;
    document.getElementById("pdf").setAttribute("src", loc);
    if (window.addEventListener) {
        document.getElementById("pdf").addEventListener("load", LoadPrint, false);
    }
    else if (window.attachEvent) {
        document.getElementById("pdf").attachEvent("onload", LoadPrint);
    }
    else {
        document.getElementById("pdf").onload = LoadPrint;
    }
}

function LoadPrint() {
    alert('fired!');
    if (document.getElementById("pdf").src !== "") {
       var frm = document.getElementById("pdf");        
       frm.contentDocument.getElementById("pdf").contentWindow.print();
    }
}

LoadPDF 是从后面的代码调用的。 “pdf”是我的 iframe。当 pdf 加载到 iframe 中时,我想调用 LoadPrint。但问题在于 IE 11 从未调用过。

有人可以帮忙吗?

【问题讨论】:

  • 什么时候应该被调用?这只是定义
  • 它是否适用于所有其他浏览器?您在 IE 上收到错误还是无法正常工作?
  • 是的,这只是 IE 特定的。适用于所有其他浏览器

标签: javascript asp.net iframe


【解决方案1】:

这是一个 IE11 bug,MS 拒绝修复它,因为他们认为这是一个功能错误,并且不再为旧浏览器版本修复此类错误。

解决此错误的方法是将 pdf 文件加载到另一个页面 iframe 中,然后将该页面加载到您的 iframe 中。一个带有文件参数的简单 javascript pdf 加载器:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PDF Loader</title>
<style type="text/css">
html, body {
    border:0;
    margin:0;
    height:100%;
    overflow-y:hidden;
}

#pdf {
    border:0;
    margin:0;
    width:100%;
    height:100%;
}
</style>
</head>
<body>

<iframe id="pdf"></iframe>

<script type="text/javascript">

function getParameterByName(name) {
    var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
    return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
}

var pdf = getParameterByName('pdf');
document.getElementById('pdf').setAttribute('src', pdf);

</script>
</body>
</html>

您可以将它与&lt;filename.html&gt;?pdf=&lt;pdf_file_to_load&gt; 一起使用。

然后您只需更改代码以通过该加载器加载 pdf 文件,如下所示:

function LoadPDF(filename)
{
    var loc = "pdf-loader.html?pdf="+filename;
    document.getElementById("pdf").setAttribute("src", loc);
    if (window.addEventListener) {
        document.getElementById("pdf").addEventListener("load", LoadPrint, false);
    }
    else if (window.attachEvent) {
        document.getElementById("pdf").attachEvent("onload", LoadPrint);
    }
    else {
        document.getElementById("pdf").onload = LoadPrint;
    }
}

function LoadPrint() {
    alert('fired!');
}

LoadPDF('http://www.pdf995.com/samples/pdf.pdf');

现在 LoadPrint 函数在 iframe 加载事件中被调用,即使在 IE11 上也是如此。 这是我的工作示例,您甚至可以使用 IE11 进行测试:http://zikro.gr/dbg/html/ie11-iframe-pdf/

在这里您可以看到加载 10MB PDF 的屏幕截图,只有在加载完成后才会触发 load 事件并提醒消息:

【讨论】:

  • 我没有看到您的示例有效。在 IE11 中打开页面后,在加载 pdf 之前会打开“已触发”警报
  • @user2837961 因为 PDF 没有显示,这并不意味着它没有加载。我在同一个链接上添加了一个 10MB 大小的文件的 pdf url。尝试重新加载链接,您将看到浏览器在触发load 事件并警告“已触发”消息之前实际上需要一些时间来加载该 10MB PDF;那是因为所有这些时间都在等待加载该大 PDF 的所有数据。
  • 它很奇怪,但我被“解雇”了,当我点击链接时,pdf 需要时间来加载/显示
  • @user2837961 我已经用屏幕截图更新了我的答案,该屏幕截图显示了我正在谈论的行为。您可以清楚地看到它在 PDF 完成加载之前不会弹出警告消息。加载页面前是否清除了 IE11 缓存?
  • 感谢这项工作。在“解雇”之后,我想打印 pdf。你能帮我吗?我已经更新了我的问题,但给出了“无效调用对象”错误
【解决方案2】:

我不知道这是否是您在这种情况下的具体问题,但请确保在分配它的 src 属性之前将您的侦听器绑定到该元素。如果该项目在缓存中,则加载事件可能会在您绑定之前触发,从而完全丢失它。

【讨论】:

  • 我尝试在分配事件后加载 src 但不起作用
  • @user2837961 我看不出代码有任何明显错误。是否有任何错误被转储到控制台?
  • 不幸的是,控制台中没有任何内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 2014-06-18
  • 2021-04-15
  • 2014-11-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多