【问题标题】:HTML Embedded PDF's & onloadHTML 嵌入式 PDF 和加载
【发布时间】:2010-11-11 09:56:31
【问题描述】:

我正在使用以下 html 将 PDF 嵌入网页中:-

<object id="pdf" classid="clsid:CA8A9780-280D-11CF-A24D-444553540000" width="1024" height="600">
    <param name="SRC" value="/GetDoc.ashx?SOID=<%=Html.Encode(Model.OrderID)%>" />
    <embed src="/GetDoc.ashx?SOID=<%=Html.Encode(Model.OrderID)%>" width="1024" height="600">
        <noembed> Your browser does not support embedded PDF files. </noembed>                     
    </embed>
</object>

PDF 的加载速度可能有点慢,所以我想隐藏对象并显示加载消息/gif,直到它完全加载,这样用户就不会看到空白屏幕。

我真正需要的只是一种告诉对象何时完全加载的方法。我已经尝试过 'onload' 事件,但它似乎从未被解雇。

我开始认为这可能是不可能的,但问它永远不会有坏处......

【问题讨论】:

标签: html pdf embed


【解决方案1】:

我不知道为什么每个人都那么难。

<object data="yourfile.pdf" style="background: transparent url(AnimatedLoading.gif) no-repeat center;" type="application/pdf" />

【讨论】:

【解决方案2】:
<embed onload='alert("I should be called")'></embed>

【讨论】:

  • 在问题中,提问者说他​​们“尝试了 onload 事件,但似乎从未被解雇”。
  • 是的,Chrome 中不会触发此事件
【解决方案3】:

我正在将带有 jQ​​uery ajax 的 PDF 加载到浏览器缓存中。然后我使用浏览器缓存中的数据创建嵌入元素。


var url = "http://example.com/my.pdf";
// show spinner
$.mobile.showPageLoadingMsg('b', note, false);
$.ajax({
    url: url,
    cache: true,
    mimeType: 'application/pdf',
    success: function () {
        // display cached data
        $(scroller).append('<embed type="application/pdf" src="' + url + '" />');
        // hide spinner
        $.mobile.hidePageLoadingMsg();
    }
});

您还必须正确设置您的 http 标头。


HttpContext.Response.Expires = 1;
HttpContext.Response.Cache.SetNoServerCaching();
HttpContext.Response.Cache.SetAllowResponseInBrowserHistory(false);
HttpContext.Response.CacheControl = "Private";

【讨论】:

  • 你知道这是否适用于 Chrome 吗?我正在设置过期和缓存控制标头,并且文件显示在 chrome://cache 中。出于某种原因,在网络选项卡中,它显示了再次获取的文件。我能想到的只有两件事。 1) 用于嵌入的 pdf 选项的 url 片段阻碍了 chrome 的缓存逻辑,或者 2) 缓存在两次提取之间没有足够的时间来缓存文件。
  • 在非 .NET 语言中,所有 HttpContext 点什么线相当于什么?
  • 不幸的是,这只有在您的缓存足够大时才有效。移动设备并非如此。
【解决方案4】:
$(document).ready(function() {
   });

不会起作用,因为这主要在document.readyState == interactive 而不是document.readyState == complete 上触发。

如果你用这个检查 (document.readyState == "complete") 设置一个计时器,它肯定会起作用!

【讨论】:

    【解决方案5】:

    以下代码有效。

    <div style="background: transparent url(loading.gif) no-repeat">
    <object height="1250px" width="100%" type="application/pdf" data="aaa.pdf">
    <param value="aaa.pdf" name="src"/>
    <param value="transparent" name="wmode"/>
    </object>
    </div>
    

    【讨论】:

      【解决方案6】:

      所有建议均无效,因为 DOM 是在加载 PDF 内容之前加载的。所以 DOM 无法控制 ActiveX 内容

      【讨论】:

        【解决方案7】:

        你会想要像 jQuery 的 document.ready() 函数这样的东西。对于非 IE 浏览器,您可以为事件 DOMContentLoaded 注册一个处理程序,并且您的处理程序函数将在加载完所有图像和对象后调用。对于 IE,您必须不断检查document.readyState 属性,并等待它变为"complete"

        如果您使用的是 jQuery,他们已经为您完成了艰苦的工作,所以您所要做的就是:

        $(document).ready(function() {
            //take away the "loading" message here
        });
        

        如果您不想使用 jquery,则必须执行以下操作:

        addEventListener('DOMContentLoaded', function() { 
            //take away the "loading" message here
        });
        
        function waitForIE() {
        
            if (!document.all) return;
        
            if (document.readyState == "complete") {
                //take away the "loading" message here
            }
            else {
                setTimeout(waitForIE, 10);
            }
        }
        
        waitForIE();
        

        【讨论】:

        • DOMContentLoaded 可以在 PDF 显示在屏幕上之前很好地触发。
        • 有人用过这种方法吗?从 cmets 看来,它工作不正常。我正在尝试在 Silverlight 的 ASP 页面上显示 PDF,但我无法像在原始问题中那样在 中设置 元素,而不会出现异常。
        • DOM Loaded 在加载 PDF 之前触发。
        【解决方案8】:

        “在加载对象但尚未完成时显示标签内的内容。”

        所以把你的微调器放在那里,它应该很适合你。而且您不必编写任何 JavaScript。

        源代码:http://en.wikibooks.org/wiki/XHTML/XHTML_Objects

        【讨论】:

        • 我认为问题是在最终显示 pdf 文件之前,activex 对象已经加载好。所以我认为在activex组件接管之前,标签内的内容只会显示几分之一秒。
        猜你喜欢
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-01
        • 2022-10-15
        • 2018-05-14
        • 2015-07-26
        相关资源
        最近更新 更多