web-dev-qa-db-fra.com

HTML Embedded PDF's & onload

J'incorpore un PDF dans une page Web avec le code html suivant: -

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

Le chargement des fichiers PDF peut être un peu lent, aussi je voudrais masquer l'objet et afficher un message de chargement/gif jusqu'à ce qu'il soit complètement chargé afin que l'utilisateur ne voie pas un écran vide.

Tout ce dont j'ai besoin, c'est d'un moyen de dire quand l'objet est complètement chargé. J'ai essayé l'événement 'onload' de la, mais il semble ne jamais se faire virer.

Je commence à penser que ce n'est peut-être pas possible, mais il n'est jamais mauvais de demander ...

27
phil_h

Je ne sais pas pourquoi tout le monde rend les choses si difficiles.

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

Le code suivant fonctionne.

<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>
9
user124118

Je charge le PDF avec jQuery ajax dans le cache du navigateur. Ensuite, je crée un élément incorporé avec des données déjà dans le cache du navigateur.


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();
    }
});

Vous devez également définir correctement vos en-têtes http.


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

Aucune des recommandations n'est valide, car DOM est chargé avant le contenu du fichier PDF. Donc, DOM ne peut pas contrôler le contenu ActiveX

3
Michael
$(document).ready(function() {
   });

ne fonctionnerait pas car cela se déclenche principalement sur document.readyState == interactive plutôt que sur document.readyState == complete.

Si vous mettez une minuterie avec cette vérification (document.readyState == "complete") cela fonctionnerait certainement!

1
Amir Shahzad
<embed onload='alert("I should be called")'></embed>
0
jmmaniego

"Le contenu d'une balise est affiché lorsqu'un objet est en cours de chargement, mais qu'il n'est pas encore terminé."

Alors, installez votre casserole et ça devrait marcher pour vous. Et vous n'aurez pas à écrire de JavaScript.

src: http://en.wikibooks.org/wiki/XHTML/XHTML_Objects

0
geowa4

Vous allez vouloir quelque chose comme la fonction document.ready() de jQuery. Pour les navigateurs non-IE, vous pouvez enregistrer un gestionnaire pour l'événement DOMContentLoaded et votre fonction de gestionnaire sera appelée une fois que toutes les images et tous les objets ont été chargés. Pour IE, vous devez vérifier en permanence la propriété document.readyState et attendre qu’elle soit "complete".

Si vous utilisez jQuery, ils ont déjà travaillé dur pour vous. Il vous suffit donc de:

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

Si vous ne voulez pas utiliser jQuery, vous devez faire quelque chose comme:

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();
0
Matt Bridges