jQuery で iframe の読み込みが完了したときにイベントを発生させるにはどうすればよいですか?
-
09-06-2019 - |
質問
ページ内に PDF をロードする必要があります。
理想的には、PDF が読み込まれると置き換えられる読み込みアニメーション GIF が必要です。
解決
それは不可能だと確信しています。
PDF 以外のほとんどのものは、Flash も含めて動作します。(Safari、Firefox 3、IE 7でテスト済み)
残念な。
他のヒント
やってみました:
$("#iFrameId").on("load", function () {
// do something once the iframe is loaded
});
これは私にとってはうまくいきました(PDFではなく、別の「」onload
耐性のある」コンテンツ):
<iframe id="frameid" src="page.aspx"></iframe>
<script language="javascript">
iframe = document.getElementById("frameid");
WaitForIFrame();
function WaitForIFrame() {
if (iframe.readyState != "complete") {
setTimeout("WaitForIFrame();", 200);
} else {
done();
}
}
function done() {
//some code after iframe has been loaded
}
</script>
お役に立てれば。
私はこれを試していますが、うまく機能しているようです:http://jsfiddle.net/aamir/BXe8C/
大きなPDFファイル:http://jsfiddle.net/aamir/BXe8C/1/
$("#iFrameId").ready(function (){
// do something once the iframe is loaded
});
代わりに .ready を試してみましたか?
私はこれに対してすぐに使えるアプローチを試しました。PDF コンテンツに対してはテストしていませんが、通常の HTML ベースのコンテンツに対しては機能しました。その方法は次のとおりです。
ステップ1:iframe を div ラッパーでラップする
ステップ2:背景画像を div ラッパーに追加します。
.wrapperdiv{
background-image:url(img/loading.gif);
background-repeat:no-repeat;
background-position:center center; /*Can place your loader where ever you like */
}
ステップ3:iframeタグに追加 ALLOWTRANSPARENCY="false"
アイデアは、iframe がロードされた後、iframe がロードされるまで、ラッパー div でロード アニメーションを表示し、iframe がロード アニメーションをカバーすることです。
試してみる。
jquery Load と Ready の両方を使用しても、iframe が本当に準備ができている場合には実際には一致しないようです。
結局このようなことをしました
$('#iframe').ready(function () {
$("#loader").fadeOut(2500, function (sender) {
$(sender).remove();
});
});
#loader は、スピナー GIF を持つ iframe の上に絶対的に配置された div です。
@Alex ああ、それは残念ですね。あなたの場合はどうなりますか iframe
次のような HTML ドキュメントがありました。
<html>
<head>
<meta http-equiv="refresh" content="0;url=/pdfs/somepdf.pdf" />
</head>
<body>
</body>
</html>
間違いなくハックですが、Firefox では機能する可能性があります。その場合、load イベントが発生するのが早すぎるのではないかと思いますが。
ここでは、私が任意のアクションに対して行っていることを示します。これは、Firefox、IE、Opera、Safari で動作します。
<script type="text/javascript">
$(document).ready(function(){
doMethod();
});
function actionIframe(iframe)
{
... do what ever ...
}
function doMethod()
{
var iFrames = document.getElementsByTagName('iframe');
// what ever action you want.
function iAction()
{
// Iterate through all iframes in the page.
for (var i = 0, j = iFrames.length; i < j; i++)
{
actionIframe(iFrames[i]);
}
}
// Check if browser is Safari or Opera.
if ($.browser.safari || $.browser.opera)
{
// Start timer when loaded.
$('iframe').load(function()
{
setTimeout(iAction, 0);
}
);
// Safari and Opera need something to force a load.
for (var i = 0, j = iFrames.length; i < j; i++)
{
var iSource = iFrames[i].src;
iFrames[i].src = '';
iFrames[i].src = iSource;
}
}
else
{
// For other good browsers.
$('iframe').load(function()
{
actionIframe(this);
}
);
}
}
</script>
iFrameでPDFをロードしているときにローダーを表示する必要があったので、私が思いついたのは次のとおりです。
loader({href:'loader.gif', onComplete: function(){
$('#pd').html('<iframe onLoad="loader.close();" src="pdf" width="720px" height="600px" >Please wait... your report is loading..</iframe>');
}
});
ローダーを表示しています。顧客が私のローダーを確認できることを確認したら、iframe をロードする onCompllet ローダー メソッドを呼び出します。Iframeには「onLoad」イベントがあります。PDFがロードされると、ローダーを非表示にしているonloatイベントがトリガーされます:)
重要な部分:
iFrame には、必要なこと (ローダーの非表示など) を実行できる「onLoad」イベントがあります。
ダウンロードが完了すると、ブラウザーの開く/保存インターフェイスがユーザーにポップアップ表示されることが予想される場合は、ダウンロードの開始時にこれを実行できます。
$( document ).blur( function () {
// Your code here...
});
ダイアログがページの上部にポップアップすると、blur イベントがトリガーされます。
PDF ファイルがロードされた後、iframe ドキュメントには新しい DOM 要素が追加されるため、 <embed/>
, したがって、次のようにチェックを行うことができます。
window.onload = function () {
//creating an iframe element
var ifr = document.createElement('iframe');
document.body.appendChild(ifr);
// making the iframe fill the viewport
ifr.width = '100%';
ifr.height = window.innerHeight;
// continuously checking to see if the pdf file has been loaded
self.interval = setInterval(function () {
if (ifr && ifr.contentDocument && ifr.contentDocument.readyState === 'complete' && ifr.contentDocument.embeds && ifr.contentDocument.embeds.length > 0) {
clearInterval(self.interval);
console.log("loaded");
//You can do print here: ifr.contentWindow.print();
}
}, 100);
ifr.src = src;
}
この状況に私が適用した解決策は、単純に絶対ロード画像を DOM に配置することです。これは、iframe がロードされた後に iframe レイヤーでカバーされます。
iframe の z-index は、(読み込みの z-index + 1) 以上である必要があります。
例えば:
.loading-image { position: absolute; z-index: 0; }
.iframe-element { position: relative; z-index: 1; }
JavaScript ソリューションが役に立たなかった場合、これが役立つことを願っています。このような状況では CSS がベストプラクティスだと思います。
よろしくお願いします。