jQuery並列load処理についての質問

このQ&Aのポイント
  • jQueryを使用してページの要素を並列で取得する方法について質問です。
  • 指定したURLから要素を非同期で取得するコードを記述していますが、リクエストが同時に行われないため、リクエストが完了するまでに時間がかかっています。
  • 修正方法やWebブラウザの仕様について教えてください。
回答を見る
  • ベストアンサー

jQuery 並列load処理

jQueryで、ページを構成する要素を並列で取得しようと考えています。 「/samples/heavy_function_parts1」 「/samples/heavy_function_parts2」 「/samples/heavy_function_parts3」 「/samples/heavy_function_parts4」 「/samples/heavy_function_parts5」 はそれぞれ、sleepして5秒後に現在時刻を返す処理となります。 下記のようなコードを書くと、div「Info5」が更新されるのが、ページ表示後 25秒後となります。 5秒後にすべての情報の更新が完了することを期待しているのですが、 どのように修正すべきでしょうか? ※FirefoxのLive HTTP headersを使ってログを取得してみると、リクエストは 同時に一つしか行われていない(リクエストが完了してから次のリクエストが 行われている)ようです。もしかしてWebブラウザの仕様だったりしますでしょうか? <script type="text/javascript"> $(function(){ $("#Info1").load("/samples/heavy_function_parts1"); $("#Info2").load("/samples/heavy_function_parts2"); $("#Info3").load("/samples/heavy_function_parts3"); $("#Info4").load("/samples/heavy_function_parts4"); $("#Info5").load("/samples/heavy_function_parts5"); }); </script> <div id="Info1">情報1</div> <div id="Info2">情報2</div> <div id="Info3">情報3</div> <div id="Info4">情報4</div> <div id="Info5">情報5</div>

noname#129301
noname#129301
  • AJAX
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
回答No.3

>loadを並列で実行したとしてもそれはキューにたまるだけであり、通信自体はシリアルで行われているのかなという気もしてきました。 $.load()ではなく、No.1で書かれているように$.ajax()を直接呼び出してみるとどうでしょうか。 (引数の指定の仕方などが変わるようです) 手元にあるver.1.42のコードを読んでみると、戻り値がXHRオブジェクトのようですので、場合によってはXHRオブジェクトを直接操作して、動作確認できるかもしれません。 (別途タイマーを用意して、XHRオブジェクトのreadystateが2や3(通信中)になってるかどうかなど) なお、複数のリクエストを同時に行うこと自体は可能です。 私は自作ライブラリを使用していますが、4~8個(この個数はブラウザの設定による)まで、同時リクエストが可能です。 私からの情報はこの辺りまでですね。 $.ajax()で作成したXHRオブジェクトを直接.open()や.send()するなどの方法もあるでしょうけど、 そこまで行くとライブラリを使うメリットが無くなるかもです。

その他の回答 (2)

回答No.2

以下のいずれかでどうでしょうか? 括弧の対応が間違ってたらすみません、適宜調整してください。 (1)-------------------- <div id="Info1">情報1</div> <div id="Info2">情報2</div> <div id="Info3">情報3</div> <div id="Info4">情報4</div> <div id="Info5">情報5</div> <script type="text/javascript"> //window.onloadを待たず、直接呼び出す $("#Info1").load("/samples/heavy_function_parts1"); $("#Info2").load("/samples/heavy_function_parts2"); $("#Info3").load("/samples/heavy_function_parts3"); $("#Info4").load("/samples/heavy_function_parts4"); $("#Info5").load("/samples/heavy_function_parts5"); </script> (2)-------------------- <script type="text/javascript"> //$();を5回呼び出す $(function(){$("#Info1").load("/samples/heavy_function_parts1");}); $(function(){$("#Info2").load("/samples/heavy_function_parts2");}); $(function(){$("#Info3").load("/samples/heavy_function_parts3");}); $(function(){$("#Info4").load("/samples/heavy_function_parts4");}); $(function(){$("#Info5").load("/samples/heavy_function_parts5");}); </script> <div id="Info1">情報1</div>(以下略) (3)-------------------- <script type="text/javascript"> //$()ではなく$(document).ready()を使用する $(document).ready(function(){ $("#Info1").load("/samples/heavy_function_parts1"); $("#Info2").load("/samples/heavy_function_parts2"); $("#Info3").load("/samples/heavy_function_parts3"); $("#Info4").load("/samples/heavy_function_parts4"); $("#Info5").load("/samples/heavy_function_parts5"); }); </script> <div id="Info1">情報1</div>(以下略) (4)-------------------- <script type="text/javascript"> //$(document).ready()を5回呼び出す $(document).ready(function(){$("#Info1").load("/samples/heavy_function_parts1");}); $(document).ready(function(){$("#Info1").load("/samples/heavy_function_parts1");}); (字数制限により以下略) >No.1 何秒後に更新するのではなく、「5つのリクエストを同時に行う」のが目的だと思います。

noname#129301
質問者

お礼

1~4のそれぞれについて試してみました。 結果はどれも同じで、前のリクエストの結果を受信してから次のリクエストが行われるという形で、時間はどれも25秒かかることとなりました。 ちょっと調べてみるとjavascript自体はシングルスレッドとのことで、loadを並列で実行したとしてもそれはキューにたまるだけであり、通信自体はシリアルで行われているのかなという気もしてきました。

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

jQueryの$.load()は、同じくjQueryの$.ajax()のラッパーのはずです。 $.ajax()では、デフォルトでasync:true (非同期)です。つまりそれぞれの通信を待たずにレスポンスを受信しだい、それぞれのコールバック関数が非同期に実行されます。  クライアント側とサーバー側のオーバーヘッド時間及び通信回線のスループットによって処理完了までの時間は毎回異なります。    従いまして、ご質問のような、「5秒後にすべての情報の更新が完了することを期待」を実装は不可能ではないでしょうか...

noname#129301
質問者

お礼

オーバーヘッド等があるのは承知しています。 5秒を多少超えてもかまいません。 少なくとも上記コードでは非同期処理にも関わらず、通信部分においては前の通信が完了するまで待機しているように思えます。 回避する手段があればお教えいただければと思います。

関連するQ&A

  • jQuery 並列load処理

    jQueryで、ページを構成する要素を並列で取得しようと考えています。 「/samples/heavy_function_parts」は5秒後に現在時刻を返す処理です。 下記のようなコードを書くと、div「Info5」が更新されるのが、ページ表示後 25秒後となります。 5秒後にすべての情報の更新が完了することを期待しているのですが、 どのように修正すべきでしょうか? <script type="text/javascript"> $(function(){ $("#Info1").load("/samples/heavy_function_parts"); $("#Info2").load("/samples/heavy_function_parts"); $("#Info3").load("/samples/heavy_function_parts"); $("#Info4").load("/samples/heavy_function_parts"); $("#Info5").load("/samples/heavy_function_parts"); }); </script> <div id="Info1">情報1</div> <div id="Info2">情報2</div> <div id="Info3">情報3</div> <div id="Info4">情報4</div> <div id="Info5">情報5</div>

    • ベストアンサー
    • AJAX
  • jQueryでloadしたphpをapendToしたいのですが。

    jQueryのload関数を使って、日付を元にランダムな10ケタの数字を生成するプログラム(rand.php)を読み込み、そのプログラムの結果をcontentsというIDのdiv内にappendToしたいのです。 そして、5秒ごとにrand.phpを読み込み、そのたびにcontentsというIDのdiv内に結果をappendToしたいのです。 イメージとしては下記のような感じになります。 $(function(){ function loadAndAppend(){ $("div#contents").apendTo(load("rand.php")); setTimeout(loadAndAppend, 5000); }; loadAndAppend(); }); しかし、これだとうまくいきません。apendTo(load("rand.php"))という部分がおかしいのでしょうが、これをどう直せばよいか分かりません。 ぜひとも解決法を教えていただけないでしょうか。

  • jQueryでloadした要素の操作ができない

    loadにて特定のIDを読み込みした後、そのID内の要素にクラスを追加したりdiv要素を追加したりしようとしていますが、読み込んだり読み込まなかったりで困っています。 firebug、chromeは問題なし、iPhone、xperiaで読み込んだIDにaddClass, wrapが適用できません。 ページをリロードすると適用されるので、読み込みの順番かと思いますが、、、 $(window).loadもダメでした。 <div id="loading01"></div> <script type="text/javascript"> $("#loading01").load("../index.html #hogehoge"); </script> <script type="text/javascript"> $("#hogehoge").ready(function() { $('#loading01 li')addClass('css01'); $('#loading01 a').wrap('<div class="css02"><div class="css03">') }); </script> 数時間困り果てています。。。よろしくお願いします。

  • jQuery1.4.2、jQueryUI1.8.4、toggle()の

    jQuery1.4.2、jQueryUI1.8.4、toggle()の状態を初期化 jQuery1.4.2、jQueryUI1.8.4にて、 toggle()を使用したあと、別のボタンなどで、そのtoggleの状態を初期化することは出来るのでしょうか。 <a id="button">ボタン</a> <div id="info"> <a id="close">閉じる</a> <p>あいうえお</p> </div> <script> $('#button').toggle( function(){$('#info').show('slide')}, function(){$('#info').hide('slide')} ); $('#close').click(function(){$('#info').hide('slide');}); </script> 「ボタン」を押して#infoを表示した後、「閉じる」を押して非表示にし、 もう一度「ボタン」を押すと、hide()が実行されてしまうため、このときにshow()が実行されるようにしたいのです。 フラグを使って.click()で切り替えれば作れますが、 せっかくtoggle()のようなメソッドがあるなら、それを利用できないかと思ったのですが。

  • JQUERY のEmpty()処理について

    JQUERY のEmpty()処理について 次のコードで$('#board').empty(); 後に追加作成した要素はクリックに反応しないのですが、対応の方法をお教えください。 <html><head><title></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script src="subf/jquery-1.4.2.min.js" type="text/javascript"></script> <script type="text/javascript"> $(function (){ $('#board').append('<div id="card1" class="card"'); $('#card1').html("Card1"); $('#board').append('<div id="card2" class="card"'); $('#card2').html("Card2"); $('.card').click(function(){ alert($(this).attr("id")); }); }); function removeObj(){ $('#board').empty(); $('#board').append('<div id="card3" class="card"'); $('#card3').html("Card3"); } </script> </head> <body> <form><input type='button' onclick='removeObj()' value='Reset'></form> <div id="board" style="WIDTH: 10%; TOP: 100px; HEIGHT: 100px; BACKGROUND-COLOR: #ccff33"></div> </body></html>

  • jQueryのloadのcallbackが変な動作

    jQueryのloadメソッドでCallBackが成功しているにも関わらず失敗する場合があります・・・対象方法が全くわからないのでご教示願えませんでしょうか? 【A.html】 <script type="text/javascript" src="jquery-1.4.1.min.js"></script> <table> <tr> <td><div id = "target_1"><div id = "target_2"></td> </tr> </table> <script type="text/javascript"> $.ajaxSetup({ cache: false }); var xmlHttp; xmlHttp = new XMLHttpRequest(); xmlHttp.open("GET", "A.html", false); xmlHttp.send(null); alert(xmlHttp.responseText); $(document).ready(function(){ $("#target_1").load("a.txt .tag", function(Text, status) { if ($("#target_1").text() == "あああ") { $("#target_1").replaceWith("<img src = 'a.png'>"); else if ($("#target_1").text() == "いいい") $("#target_1").replaceWith("<img src = 'b.png'>"); alert( "text: " + Text + "\nstatus: " + status ); }); $(document).ready(function(){ $("#target_1").load("a.txt .tag", function(Text, status) { if ($("#target_1").text() == "あああ") { $("#target_2").load("a.txt .5tag");★ else if ($("#target_1").text() == "いいい") $("#target_2").load("a.txt .5tag");★ alert( "text: " + Text + "\nstatus: " + status ); }); }); 問題は★印が付いているところの処理です。 アラートではSUCCESSになるのですが、なぜかロードが失敗する時があります。 割合としては10回に1回程度で1回発生するとブラウザの再起動をしない限り二度とロードができなくなります。 原因は何がいけないのでしょうか?

  • jqueryでhtmlを読み込んだ後に処理をさせる

    お世話になっております。 javascript初心者で最近、JQueryを使い始めた者です。 lightboxのようなモーダルウインドを作りたく、各ボタンのリンク先のファイルを読み込ませた後に フェードインで読み込ませた要素を表示させたいのですが 以下のソースでは #overLayerにaタグのリンク先のhtmlファイルを読み込ませた後にフェードインさせる処理がうまくいきません。 読み込ませるload1.htmlに画像を入れていると、フェードインしながら画像が読み込まれてしまいます。 画像付きhtmlファイルを画像データも含め完全に読みこみ終わった後に処理をするにはどのようにすればいいでしょうか? ご回答宜しくお願いいたします。 //*****javascriptコード**** <script type="text/javascript"> $(function(){ //bodyに背景レイヤーとボックス表示用のレイヤーを追加 $("body").prepend("<div id='glayLayer'></div><div id='overLayer'></div>"); //$("#overLayer").hide(); //ローディング画像のプリロード $("<img>").attr("src","images/loading.gif"); //背景レイヤークリック時の処理 $("#glayLayer").click(function(){ $(this).hide(); $("#overLayer").fadeOut("slow",function(){ $("#overLayer").html(""); }); }); //リンクボタンクリック時の処理 $("a.modal").click(function(){ $("#glayLayer").show(); $("#overLayer").show(); $("#overLayer").html("<img src='images/loading.gif'>"); $("#overLayer").data("file",$(this).attr("href")); $("#overLayer").load($("#overLayer").data("file"),function(){ //alert("complete"); $("#overLayer").hide(); $("#overLayer").fadeIn(1000); }); return false; }); }); </script> //****htmlソース**** <body> <ul> <li><a href="load1.html" class="modal">テスト1</a></li> </ul> </body>

  • jquery教えて下さい。

    現在、 <script type="text/javascript"> $(function(){ $("#btn1","#test2").click(function () { $("div","#test2").slideDown(3000); }); }); </script> のコードで btn1のidボタン▼をクリックすると test2がslidedownするコードを造っているのですが これをボタンを押さずに ページがひらいたと同時にスライドするにはどのように すればよろしいでしょうか? 宜しくお願いします。 <div id="test2"> <div style="display:none;"><div class="slide"> <ul> <li class="setsumei1">test1</li> <li class="setsumei1">test2</li> <li class="setsumei1">test3</li> <li class="setsumei1">test4</li> </ul> </div></div> <div id="btn1">▼</div> </div>

  • jQuery Ajax通信をランダムで表示

    Ajax通信で別htmlファイルを読み込みたいと考えています。 それぞれ読み込むファイルは、a.html、b.html、c.html、d.htmlとあります。 読み込む先(index.html)の以下div要素内に、 上記htmlを読み込みたいと考えています。 <div id="01"></div> <div id="02"></div> <div id="03"></div> <div id="04"></div> 本来ならAjax通信で以下のように出来るかと思います。 $(function(){  $('#01').load('a.html');  $('#02').load('b.html');  $('#03').load('c.html');  $('#04').load('d.html'); }); しかし、div要素内の表示をランダムにしたいのです。 例)id="01"のところに、b.htmlだったり、d.htmlだったりという感じです。  ロードする度にコンテンツの表示場所が変化するイメージです。 ランダムというところが、どのように対処したらよいのか、手も足も出ません。 どなたか詳しい方、ご教授いただけたら助かります。 何卒、何卒、宜しくお願いいたします。

    • ベストアンサー
    • AJAX
  • jQueryのアニメーションについて

    jQueryのアニメーションについて聞きたいです。 チェックボックスと連動してボックスが表示されるアニメーションはわかりましたが、表示される際のアニメーションはどうすればいいかわかりません。 フロートで横並びになった一番・二番・三番の三つのボックスがあり、三番のみが表示されている場合、三番のボックスが一番左に表示されています。 そこで二番のチェックボックスにチェックをして、二番のボックスを表示ると、二番が左で三番がその右に表示されます。 その際、三番が右にずれるときにアニメーションでスライドできないでしょうか。 現在のソースです。 【CSS/Script】 <script type='text/javascript' src='http://code.jquery.com/jquery-1.7.1.js'></script> <style type='text/css'> input{margin:80px 0 0 80px;} div{ display:none; margin:25px; padding:25px; background:#eee; width:200px; height:150px; float:left; } </style> <script type='text/javascript'> $(window).load(function(){ $('#check1').click(function() { $("#box1").slideToggle(this.checked); }); $('#check2').click(function() { $("#box2").slideToggle(this.checked); }); $('#check3').click(function() { $("#box3").slideToggle(this.checked); }); }); </script> 【HTML】 <p> <label><input type="checkbox" id="check1">一番</label> <label><input type="checkbox" id="check2">二番</label> <label><input type="checkbox" id="check3">三番</label> </p> <div id="box1">一番を押してでるのです</div> <div id="box2">さては二番を押したから</div> <div id="box3">どれかと思えば三番でした</div> よろしくお願いいたします。

専門家に質問してみよう