ページ読み込み完了判定の方法と代替処置について

このQ&Aのポイント
  • ページの読み込み完了を判定するには、window.onloadイベントやwindow.onabortイベントを利用することが一般的です。しかし、head要素やbodyの各イベント属性に直接記述することができない場合には、他の方法を考える必要があります。
  • 代替処置としては、body要素の中身がすべて読み込まれたかどうかを判定する方法や、最後の要素が読み込まれたかどうかを判定する方法があります。これらの方法は、一般的なページに対応することができます。
  • ただし、これらの方法ではイレギュラーな状況や特殊なケースに対応することが難しい場合があります。そのため、より画期的な方法を探している方は、新たな技術やライブラリを利用することを検討してみてください。
回答を見る
  • ベストアンサー

window.onloadなどあらかじめ用意された物以外でページが最後

window.onloadなどあらかじめ用意された物以外でページが最後まで読み込まれたか判定したいです。 条件を書きますね。 1.window.onloadなど直接head要素、またbodyの各イベント属性に記述は出来ない状態です。 2.掲示板の上部にフリーテキストの部分があり、その部分のみ扱えます。使えるタグが制限されています。インライン要素はstrongブロック要素はdivです。このためインラインでスクリプトを書いて行きます。 window.onloadが発生した後やwindow.onabortが発生して ちょっと経った後にブラウザが「読み込みすでに完了済み」や 「読み込みを中断済み」のような何らかの値をどこかに格納したりしないのでしょうか。 また代替処置をするならばどんなスクリプトが有効でしょうか。 なるべく色んなページに対応したいです。 例えばbodyの中身が全部読まれているか判定したり、 一番最後の要素が読まれたかどうか判定するスクリプトです。 もっとも一番最後の要素が読まれたかどうかを判定するアナログなやり方だと window.onabortの時などイレギュラーな時に うまく行かないので出来るだけ何か画期的なものを探しています。 JSが好きな方々、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • think49
  • ベストアンサー率59% (285/482)
回答No.4

#2,3 です。 状況がわかりました。つまり、こういうことですね。 ------ <div id="Edittable"><!-- 編集可能領域 --> <strong onclick="alert(document.getElementById('test7').firstChild.nodeValue)">クリックしてね</strong><!-- クライアント環境がナローバンドだとtest7の読み込みが完了していないかもしれないので、読み込み完了を判定したい。 --> </div> <p id="test1">test1</p> <p id="test2">test2</p> <p id="test3">test3</p> <p id="test4">test4</p> <p id="test5">test5</p> <p id="test6">test6</p> <p id="test7">test7</p> ------ 解決法としては、document.getElementById('test7') の存在をif文で判定すればいいと思います。 if('undefined' !== typeof document.getElementById('test7')){  alert(document.getElementById('test7').firstChild.nodeValue); } else {  // window.onload, addEventListener, attachEvent など } で、サンプルを書いてみましたが、onclickに入れるとGoogleChrome5でエラーが出ちゃいますね。 (全角空白は半角空白に置換してください) (function(test){  if('undefined' !== typeof document.getElementById('test7')){   test();  } else if ('undefined' !== typeof addEventListener) {   addEventListener('load', test, false);  } else if ('undefined' !== typeof attachEvent) {   attachEvent('onload', test);  } else {   throw new Error('#test7 is not found.');  } })(function(event){  alert(document.getElementById('test7').firstChild.nodeValue); }); onclickに入れなければエラーは出ないので、あんまり複雑なコードは入れないで、って事なのかもw

fun_wizard
質問者

お礼

うーむ素晴らしい すごいスマートにまとまってます!! 本当にありがとうございました。 私もこのコードを見たときこれは行ける!と思ったのですが なんと、、、ページがロードし終わったタイミングでは実行されませんでした!! これは1さんとお礼をした際に書いた難題が原因だと思われます。 おどかしてすみません。 それはアラートの場合であって、本当のやりたい事のエレメントを追加する方法だとうまく機能しました。 原因を色々考えたのですが イメージのロードとエレメントの定義のタイミングが別々になってるからかもしれないですね。 ドキュメントタイプをXHTMLにし、それでコーディングしたからかもしれないですね。 貼る場所は非情に汚いソースなのでDOMの定義とかの関連で違いがあるかもしれませんね。 ちなみに大変遅くなりましたがプロフィールに該当サイトを常に貼ってあります。 タイトル画像のすぐ下に書いてある小文字のdivに一行の長いものがあります。 それが該当箇所です。まだ本番では確認してないです。別のコードが書いてあります。 ちなみにうちの掲示板はスパムが酷いのでコメントを閉じちゃいました。 色々聞きたいことがあるのですが過去の投稿などをとりあえず参考にします。 一応テストページを用意しました。 画像は一枚3MBにしてあります。 画像読み込み中にデカイ文字の「ページ読み込み時にクリック」を押してみてください。 www.geocities.jp/hyper_funstyle/cmand_alert/test.html 本番でのスクリプトの起動方法は半透明のもしくは完璧な透過PNGを背景に敷いたdivを CSSでずらして絶対にマウスオーバーしたり、マウスムーブする場所に仕掛けるつもりです。 クロームは今回は考慮しないことにします。 軽くて早いのは使ってて気持ちいいんですけどね。(地図の立体表示とか) もう修正されたかもしれないですが マージンとか擬似要素とかの挙動がなんかカオスなんですよね。 (´・ω・`) JSやASが前進する瞬間はひらめいた時、いい辞書・サイトにめぐり合ったとき、 そしてイイ師に出会えた時ですね☆ ありがとうございます。 このスクリプトを家宝にします。

その他の回答 (3)

  • think49
  • ベストアンサー率59% (285/482)
回答No.3

#2です。 <iframe> や <frame> で該当ページを読み込んで、親windowからiframeのwindow(contentWindow)やサブフレームのwindowを参照する、って手もありますね。 外部URLをフレームに埋め込む手法は敬遠されがちですが、双方とも自分のサイトなら問題はないと思います。 (良い手法ではない、という意見もありそうですが) window - MDC https://developer.mozilla.org/ja/DOM/window JavaScript インラインフレーム(iframe)関連 - とみぞーノート http://wiki.bit-hive.com/tomizoo/pg/JavaScript%20%A5%A4%A5%F3%A5%E9%A5%A4%A5%F3%A5%D5%A5%EC%A1%BC%A5%E0%28iframe%29%B4%D8%CF%A2

fun_wizard
質問者

お礼

なるほどこれは新しい方法ですね。 この方法ならwindow.onloadを起こすことも出来ますね。 しかしソースを配布したいなーとも思ってるわけでちょっと複雑な心境です。 わがままですみません。本当に助かります。 window.onloadに初期状態で格納されてるものが undefinedと違うと良いのになぁと妄想しちゃいます。 (´・ω・`)一応アレから色々考えてエレメントの数を setIntervalとgetElementsByTagName().lengthを使ってリアルタイムに数えさせ、 増加が止まったらチェックを数秒繰り返して その指定した時間よりも止まっていたらスクリプトを実行というものを作ったのですが ナローバンドの不安定さを考えるとちょっと無理があるなぁと思っていたのです。 どこかに通信速度表のような物を用意して エレメントの増加量で比較して秒数を可変なんていう 結構小難しいのも考えてるのですが、やはり正確ではないですね。

  • think49
  • ベストアンサー率59% (285/482)
回答No.2

方法論としては、適当な要素のonload属性からownerDocument,defaultViewでwindowオブジェクトを取得できそうではあります。 が、仮に可能だったとしても極めて黒に近い灰色って気がしますね。 script要素を禁止しているということは、そのような行為をして欲しくないのでしょうから…。。

fun_wizard
質問者

お礼

ownerDocumentやdefaultViewは初めて目にしました 調べてみます。 >script要素を禁止していると・・・・・ そのようですね。いじってて感じました。 ありがとうございます。

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

??? window.onloadを見ないで読み込み完了を判定するって不可能だと思うんだけど・・・ 掲示板とやらは、つまりいじれない、提供側が固定で設置していて利用者が一定の設定しかできない代物って事だよね? でも書き方からするとjavascriptを使う方法が有るのなら やっぱり onload になるんじゃない? 通常はheaderだけど、途中であっても結局 onload が起きたのを拾って処理するscriptを書く、という形になると思う。 addEventListener だとかその辺りから IE用ではどうするとか引っ張ってみたら良いんじゃないかな。 (タグに onLoad="func()" を書かないでonloadを察知する方法の話) about対策はエラー判定やtryで対処

fun_wizard
質問者

お礼

掲示板なので、ページが長い場合は ページをロード中にオンロードもしくはそれに相当する物を起動すれば問題無いですよね しかし、ページがロードし終わったあとに インラインからwindow.onloadに何かファンクションを入れても実行されないんですよ。 これを判定できればページが中途半端にロードされようと 完全にロードされようとページの中身を確実に書き換える事が出来るんです。 window.onloadは一回しか返事を返してくれないですし ブーリアン型でどっかに保存されてれば良いなぁ と思いにふけっていた所なのです。 about対策はエラー判定やtryで対処する方法はちょっと調べてみます。 tryは何かに使えそうですね。 ありがとうございます。

関連するQ&A

  • window.onLoad について

    <body> タグに、onload=関数名・・・ と記述するとなぜかオブジェクトがありませんとかで 実行されない時があるため、 <head>タグ内に <script type="text/javascript">  window.onLoad=function(){ 関数名} </script> と記述してみたところ、まったく関数が動作しなくなってしまいました。 ステータスには「ページが表示されました」とでていて、スクリプトエラーにもなっていないようです。 原因がわからず、それならば・・・ htmlを順番に表示していくのだから、htmlの最後のほうに記述すればいいのでは? と思い、 </body>の直前に <script type="text/javascript"> 関数名  ← onloadで動作させる関数 </script> と記述してみたところ、うまく表示できました。 この記述方法って正しいのでしょうか? 環境に依存するのか、毎回悩まされるし、毎回対処方法が違ったりしているので ホントに困っています。 アドバイスお願いします。 #何故 window.onLoad=function(){ 関数名 } ではまったく動かなかったのでしょう。。。

  • <body onload=""> と window.onload

    JavaScriptのonload処理についての質問です。 現在Java、JSP、JavaScript等でWebアプリケーションを作成しているのですが、 bodyタグ中のonloadに記載したファンクションが時々呼ばれないという問題が起きています。 (こんな感じで記述  <body onload="hoge();hogehoge();">  hogehoge()がたまに呼ばれないことがある・・・) これを回避する方法として、「onload処理をwindow.onloadに記述すれば良い」 という話を聞きました。 (こんな感じで記述  <script>    window.onload = function(){ hoge();hogehoge(); }  </script> ) 「bodyタグ中に記述するとたまに呼ばれないものが、window.onloadに記述すると確実に呼ばれる」 なんてことがあるのでしょうか? 「2つめのファンクションが呼ばれない」という現象がたまにしか発生しないので、 window.onloadに記述する方法で確実に呼ばれるようになったという保証がとれません。 知識として知っている方がいれば是非教えていただきたいです。 よろしくお願い致します。 ※ブラウザはIEを使用  バージョンは IE → 6.0      JavaScript → 1.1 です。  

  • window.onloadでのfunction

    javascript初心者で質問自身が僕が解決したい問題の原因かどうかも解らずに質問しています。 <script type="text/javascript"> <!-- function hoge_1() { ~処理1~ } function hoge_2(hiki_suu) { ~処理2~ } window.onload = function() { document.getElementById("button_1").onclock = hoge_1; document.getElementById("button_2").onclock = hoge_2("watasu"); } // --> </script> 上記のようにページheadにscriptを配置したとします。ページ上のbutton_1がクリックされると処理1が実行されるのですが、hoge_2のように引数を使ってしまうと、onload時に処理2を実行してしまい、button_2は有効に動作しません。 functionの引数の問題なのか、window.onloadの作法なのか、なにが悪いのか全く解らず質問しています。 ご指導のほどよろしくお願いいたします。

  • 1ページ内で複数のwindow.onload = functionの動作

    Ajaxを使用して取得してきたRSSをinnerHTMLで表示するスクリプトを1ページ内に複数設置したいのですが、うまくいきません。 prototype.jsを使うと複数のonloadを制御できるという記事を参考にしたのですが、動作しませんでした。(WindowsIE6で検証してます) http://hori-uchi.com/archives/2005_09.html BODY以下のソースはこちらです。現状だとどちらか一つだけなら動作する感じです。これをどちらも動作する方法をご教授いただけませんでしょうか。宜しくお願いします。 //RSS取得1箇所目 <div id="p1">roading1</div><script> window.onload = function(){ var u = document.getElementsByTagName("head")[0].appendChild(document.createElement("script")); u.type = "text/javascript"; u.charset = "utf-8"; u.src = "http://###"; } var xml = {}; xml.onload = function(data){ var items1 = data.items; var g = "\n"; for(var i = 0; i < Math.min(items1.length, 20); i++){ // } document.getElementById("p1").innerHTML = g; } </script> //RSS取得2箇所目 <div id="p2">roading2</div><script> window.onload = function(){ var u = document.getElementsByTagName("head")[0].appendChild(document.createElement("script")); u.type = "text/javascript"; u.charset = "utf-8"; u.src = "http://***"; } var xml = {}; xml.onload = function(data){ var items2 = data.Result; var h = "\n"; for(var i = 0; i < Math.min(items2.length, 20); i++){ // } document.getElementById("p2").innerHTML = h; } </script>

  • window.onloadが、ブラウザ(Firefox)で戻る場合に動作しない

    「Flash版地図API」の導入作業をしています。 地図内にマーカーを付けるために、以下のように記述しました。 <script language="JavaScript" type="text/javascript"> <!--常にマーク表示--> window.onload = function() { thisMovie('YFMap').addIcon('tokyo', '35.60714835619635', '139.3955620148672', '<a href="/">東京'</a>, 'L1'); } </script> window.onload は、ブラウザを開くたびに実行されると思います。 IEでは、問題ないのですが、Firefoxの場合、表示されたマークをクリックして次のページへ移動して、その後、ブラウザで戻ってくると、マークが表示されないのです。 どうやら、Firefoxの場合、「window.onload」は、ブラウザから戻ってきた場合は動作していないのでは?と想像しています。 この場合、どのように記述するのが良いのでしょうか?ご指導宜しくお願い致します。 ※ javascriptの知識はほとんどありませんので、具体的なソースで教えて頂きたいです。

  • <body>にwindow.onload = functionを2つ設定すると、最後に書いたイベントだけが実行されてしまいます。

    <body>タグにonloadイベントを実行させる2つの外部jsを<head>内に設置し実行すると、 最後に記述したイベントだけが反映されてしまいます。 http://blog.webcreativepark.net/2008/02/26-185844.html を参考にいろいろといじってはみたのですが、 function addEvent(elm,listener,fn){ try{ elm.addEventListener(listener,fn,false); }catch(e){ elm.attachEvent("on"+listener,fn); } } js初心者でして、上の関数の中にどのように記述をすれば良いのかわかりません。 IE6・IE7・safariで動作させるには、実際にどのようなソースを書けばいいのでしょうか。 どなたかご教授いただけますでしょうか。 <head>内の外部jsは、以下のように記述しました。 <script src="/A.js" type="text/javascript"></script> <script src="/B.js" type="text/javascript"></script> </head> 外部jsのソースは以下になります。 //A.js window.onload = function() { var blur = function () { this.blur() }; for (var i = 0; i < document.links.length; i++) document.links[i].onfocus = blur; } //B.js window.onload = function() { prepZooms(); insertZoomHTML(); zoomdiv = document.getElementById(zoomID); zoomimg = document.getElementById(theID); } 以上になります。宜しくお願い致します。

  • window.onloadの実行と抑止の分岐方法

    親ウィンドウと子ウィンドウの間でデータを共有したいと思い、下記のソースを作成しました。 親ウィンドウで任意の文言を入力し、子ウィンドウを開くをクリックすると、子ウィンドウに値が渡されます。 子ウィンドウで任意の文言を入力し、値をセットをクリックすると、親ウィンドウに値が渡されます。 しかし親ウィンドウから子ウィンドウで値を渡した後、任意の文言を入力し送信ボタンを押すと、index.phpで子ウィンドウの変更後の文言をテキスト欄の値をセットしたあと、 子ウィンドウのwindow.onloadが走って値を追加してしまいました(下記のソースは簡易的なもののため、子ウィンドウのテキスト欄には<input type="text">を使用しておりますが、 実際には<select multiple="multiple">を使用しているため、下記のような表示になります)。 1. 親ウィンドウから子ウィンドウにセットされたテキストの例 あああ 2. 子ウィンドウで変更した文言 いいい 3. 送信ボタンクリック 子ウィンドウのselectには下記が表示されます。 いいい あああ その為、子ウィンドウでsubmitした際は、window.onloadを抑止できれば良いと思ったのですが、具体的にどう記述すればよいかわかりませんでしたので、 アドバイスいただける方がいらっしゃいましたら、ご教示の程、よろしくお願いします。 また、window.onloadの抑止にこだわっているわけではありません。 上記の送信ボタンクリック時、子ウィンドウのselectの中が「いいい」と表示される方法があれば大丈夫です。 【親ウィンドウ(index.html)】 <script type="text/javascript"> <!-- function window_open() { window.open('sub.html', null, 'width = 640, height = 480, scrollbars = yes' ) }; //--> </script> </head> <body> <form action="index.php" method="post" name="form00" id="form00"> <a onclick="window_open()" href="javascript:void(0)">子ウィンドウを開く</a> <br /> <input type="text" name="text00" value="" /> </form> </body> 【子ウィンドウ(sub.html)】 <script type="text/javascript"> <!-- window.onload = function() { if(window.opener) { document.form01.text01.value = window.opener.document.form00.text00.value; } } function Set() { window.opener.document.form00.text00.value = document.form01.text01.value; window.close(); } //--> </script> </head> <body> <form action="index.php" method="post" name="form01" id="form01"> <input type="text" name="text01" /> <input type="button" onclick="Set()" value="値をセット" /> <input type="submit" value="再読込" /> </form> </body> 以上、よろしくお願いします。

  • ビルダーで見るソースとネット上で見るソースの違い

    よろしくおねがいいたします。 ビルダー9でHPを作成してしていますが、ビルダーでソースを見ると最後は </BODY> </HTML> で終わっています。 ネット上で見ると</BODY></HTML>の後に <script language="JavaScript"> <!-- var SymRealOnLoad; var SymRealOnUnload; 中略 SymRealOnLoad = window.onload; window.onload = SymOnLoad; //--> というのが並んでいるのですがこれは問題ないでしょうか?

  • dummyページを一瞬で開き、閉じるjavascriot

    例えば、あるページを開いたときにサブウィンドウで yahooを開き、そのあとすぐにそのサブウィンドウ(yahoo)を 閉じる処理を行いたいのですが、うまくいきません。 ちなみに、以下のように記述しました。 <html> <head> <title></title> <script language="JavaScript"> <!-- function Dummy_Window() { window.open("http://www.yahoo.co.jp","window1","width=400,height=80"); window.close("http://www.yahoo.co.jp","window1"); } // --> </SCRIPT> </head> <body onload="Dummy_Window();"> </body> </html>

  • JavaScriptの表示についておねがいします。

    JavaScriptで、以下のスプリクトのページを表示する部分を10秒ごとにしたいのですがどなたか教えて頂けないでしょうか?出来れば、追記して回答お願いします。 <html> <body> </scr ipt> </head> <body onLoad="openWindow1()"> <a href="javascript:openWindow1();">web表示</a> <SCRIPT language="JavaScript"> <!-- // サブウィンドウの表示方法を指定する function openWindow1() { window.open("http://yahoo.co.jp/","1"); window.open("http://www.google.co.jp/","2"); window.open("http://ja.wikipedia.org/wiki/メインページ","3"); } //--> </SCRIPT> </body> </html>