• 締切済み

ajaxローディングで取得したデータの並べ替え

お世話になっております。 データベースからデータを取得し表示し、「もっと見る」ボタンを押下されたらajaxローディングで追加分を取得するという処理と行っています。 ◆javascript処理 ----------- $(function() { //More Button $('.more').live("click",function() { var ID = $(this).attr("id"); if(ID) { $.ajax({ type: "POST", url: "~.php", data:"id="+ID, cache: false, success: function(html){ $("#updates").append(html); $("#more"+ID).remove(); } }); } }); }); -------- 上記の方法で追加部分を取得することはできています。 同じページ内にボタンを配置し取得したデータをソートできるようにしているのですが、 上記の「もっと見る」ボタンで取得後にソートを行うと取得した部分が消えてしまいます。 並べ替えの処理は以下の通り --------------------- jQuery(document).ready(function($) { $('#btn').click(function() { //********************************************** //新着順で並べ替え //********************************************** $('#list').html( $('#list > li').sort(function(a, b) { return parseInt($(b).attr('id'), 10) - parseInt($(a).attr('id'), 10); }) ); }); --------------------- またボタンとリスト部分は以下の通りです。 liタグを並べ替えるボタンを配置しています。 ------------------ <button id="btn">降順に並べ替え</button> <ul id="list"> <li id=1>~</li> <li id=2>~</li> <li id=3>~</li> </ul> ------------------ ajaxローディングで追加取得している部分がliタグと認識されていないため、このような挙動となってしまうと思うのですが解決策はありますでしょうか?ご教示いただけますようお願いします。

みんなの回答

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

No.1です。 ><div id="updates"></div>部分に追加取得した<li>~</li>を出力するようにしています。 <div>内に追加した時点で(というかdivがある時点で)文法違反になっていませんか? >ブラウザ上で「ソースを表示する」で取得したhtmlソースは(1)初期状態~~ ブラウザの「ソースの表示」は常に「ソース」を表示するようになっています。 変更されたDOMを確認する場合は、スクリプトで表示させるか、あるいは開発用のツールなどで御確認ください。(最近のブラウザには装備されているものもあるかと思います) さて、元のご質問文にあるソートのスクリプトですが >$('#list > li')~~ となっていますので、<div>内の<li>要素は対象にならないので、(元からある)<li>要素だけが対象になります。 さらにその結果を、 >$('#list').html(~~) としていますので、結果的に、対象外のものは削除されることになります。 これが直接の原因ではないですか? この辺りを調整すれば、意図なさったようになるかと…

k-igarashi5962
質問者

お礼

アドバイスありがとうございます。 $("#updates").append(html);の部分を$("#list").append(html);に修正して<li>を追加することで実現できました。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

よくわかってませんが… 追加取得したあとのDOMはどのようになっているのでしょうか? というか、phpから追加取得するデータは<li>~</li>の要素群になっているのでしょうか? いろいろ疑問点がありすぎるけれど、 並べ替えの対象は、ul#list内のli要素になっていますが、そこに同列でちゃんと追加されていますか? 追加するスクリプトでは、$("#updates").append(html);となっていますが、#updatesってどこ? HTMLの文法上はulの子要素はliのみとなっていたかと思いますが、そうなるように追加できていますか? 疑問点の列挙になってしまいましたが、このあたりに原因がありそうに思います。

k-igarashi5962
質問者

補足

>というか、phpから追加取得するデータは<li>~</li>の要素群になって >いるのでしょうか? はい、その通りです。<li>~</li>の要素群だけを取得しています。 >追加するスクリプトでは、$("#updates").append(html);となっています >が、#updatesってどこ? <ul> <li>~</li> <li>~</li> <div id="updates"></div> </ul> となっており、<div id="updates"></div>部分に追加取得した<li>~</li>を出力するようにしています。ただ、ブラウザ上で「ソースを表示する」で取得したhtmlソースは(1)初期状態、(2)もっと見るで追加取得した後、(3)ソートを行い並べ替えをした後、ですべて同じソースになっています。

関連するQ&A

  • Ajaxで作成したinputタグが正しく動作しない

    元々htmlで作成してあるform内容をAjaxで送受信し、 その得られたjsonデータを元に新規にテーブルを作成しています。 ここまでは出来ているのですが、更にこのテーブルにそれぞれの項目にソートボタンを実装したいのですが、これが実現しません。 <input type="button"で作成したボタン(元のhtmlにあるボタンと同様の記述)は元ページのphpに遷移してしまい、 <button></button>で作成したボタンは何の動作も行いません。 元々ある検索ボタンと同様に非同期でpostするには 追加で作成したform内の要素はどのようにすれば可能でしょうか? //テーブル作成関数 function create_table(data){ //テーブルヘッダー var text = "<table><thead><tr><th>foo</th><th></th>"; $("li", "#foo_list").each(function(i, v){ text += "<th>" + v.innerHTML + "\      //●inputボタン作成部 <input type='button' class='search_btn' value='検索' />\ <button class='search_btn' value='" + v.id + "_up' ><img src='./foo.gif'></button>\ <button class='search_btn' value='" + v.id + "_down' ><img src='./bar.gif'></button></th>"; }); text += "</tr></thead><tbody>"; ~省略~ //テーブル閉じる text += "</tbody></table>"; $("#result_table").html(text); } //ajax送受信 $(function(){ var jsdata = ""; $('.search_btn').click(function(){ var form = $("#frm"); var json = $(form.serializeArray());   $.ajax({ url : "./hoge.php", type : "post", data : json, success: function (jsdata){ results_data = eval( "(" + jsdata + ")" ); create_table(results_data); } }); }); }); よろしくお願いいたします。

  • AJAXで新規表示されたボタンが稼働しない

    下記のようなものを作りました。 1 通常は下記のような <100購入>というボタンが表示されています。 <button class="button8" type="submit" name="volume" value="100">100購入</button> 2 <追加表示ボタン>を押すと、 <button class="button8" type="submit" name="volume" value="500">500購入</button>という<500購入>ボタンが新たに追加されます。 3 <100購入>ボタンか<500購入>ボタンを押すと、お好きな数値が購入できます。 前提条件 <100購入>ボタンは、当初から<form></form>内に直接記載されているボタンです。 <500購入>ボタンは、<追加表示ボタン>を押した際、AJAXにより、<form></form>内に新たに設置されるボタンです。 問題点 <100購入>ボタンは問題なく稼働します。 しかしながら、AJAXにより新たに設置された<500購入>ボタンを押しても、Formが稼働しません。 どのようにすれば、AJAXにより新たに設置された<500購入>ボタンが稼働するようになるでしょうか? よろしくお願いいたします。 +++++++++++++++++++++++++++++++++++++++++++++++++++ 当方が作ったソース <script type="text/javascript" src="./js/jquery.js"></script> <form action="abc.cgi" method="post" name="form1" id="form1"> <div id="msg">ここへ出力</div> <button class="button8" type="submit" name="volume" value="100">100購入</button </form> <BR> <button id="btn0">追加表示</button> <script type="text/javascript"> jQuery(function($){ $("#btn0") .click(function () { $.ajax({ beforeSend:function(BTN){ $("#msg").append("<BR>新規ボタンを表示します<BR>"); }, complete: function (BTN, textStatus) { $("#msg").append("<button class=\"button8\" type=\"submit\" name=\"volume\" value=\"500\">500購入</button><BR>"); } }); }); }); </script>

  • jqeryについて

    [script] $(function() { $(".btn").on('click',function(){ Tmp=$(this).attr('id').replace('button','p'); $(".box").hide(); $("#"+Tmp).show(); }); }); [css] .box{ display:none; } [html] <p id="p1" class="box">テスト1</p> <p id="p2" class="box">テスト2</p> <p id="p3" class="box">テスト3</p> <input type="button" id="button1" value="ボタン1" class="btn" /> <input type="button" id="button2" value="ボタン2" class="btn" /> <input type="button" id="button3" value="ボタン3" class="btn" /> 上記のコードのボタン部分、表示部分を変えたいのですがうまくいかないので教ええてください。 <input type="button" id="button1" value="ボタン1" class="btn" />ここの部分を<p id="tab1 class="tab">に変更し、 <p id="p1" class="box">テスト1</p> ここの部分を <div class="">(cssでアイテム(ul)全体を右に寄せています。) <ul> <a href="/"><li><img src="hoge/hoge1.png"><p>hogehoge</p></li></a> <a href="/"><li><img src="hoge/hoge2.png"><p>hoge</p></li></a> </ul> </div> よろしくお願いします。

  • AJAXの書き方について

    <script type="text/javascript"> $( function() { $( '#ajax-button' ) .click( function() { $.ajax({ url: 'http://localhost:8080/app/family', type:'GET', data: {test1 : 'aaa', test2 : 'bbb' }, dataType: 'jsonp', success: function(data) { alert("ok"); }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert("ng"); } }); }); } ); </script> この部分は何を意味しているのでしょうか? $( '#ajax-button' ) .click( またここの部分をIDにして二つ別々のIDを書いてblur(fn()にしたい場合はどうすればいいのでしょうか? $("[id$=NO]").blur(function(){ $("[id$=NM]").blur(function(){ function() { $.ajax({ url: 'http://localhost:8080/app/family', type:'GET', data: {test1 : 'aaa', test2 : 'bbb' }, dataType: 'jsonp', success: function(data) { alert("ok"); }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert("ng"); } }); }); }); }); このようにしても動きません。 正しい書き方を教えていただきたいです。

  • Ajaxをつかってデータを取得

    いつもお世話になっております。 今回はAjaxを使ってデータを取得する方法をお聞きしたいです。 たとえばログリストのようなものがあるとして、サーバー側にそのデータがあります。 そのリストを開いたとき、サーバーからデータを得て、リストに追加します。 そこで「次へ」のようなボタンを押した際、非同期で次の分を取得する方法はありますか? またこれは「パース」という方法になるのでしょうか? ご教授願います。

    • ベストアンサー
    • CGI
  • 要素をソートしてその要素を三つずつ表示するには

    お世話になっております。 最近、jQueryを使い始めたjavascript初心者です。 以下の動作を実装したいのですが、どうすればいいでしょうか? 1.カテゴリーボタン(中華、和食、洋食)を押すとそのカテゴリー要素の上位三つのみが表示される。 2.もっと見るボタンを押す度に表示させているカテゴリー要素が三つずつ増えていく。 各カテゴリー要素の上位三つを表示させるのは jQueryのltフィルターを使うことでできたのすが、もっと見るボタンで三つずつ表示要素を増やしていく動作がうまくいきません。 $(".chinese:lt(3)").show();のli()の数値部分を変数にし、 もっと見るボタンを押すたびに変数Numに値を+3してltの数値を動的に変更することができればうまくいくと思ったのですが $(".chinese:lt(Num)").show(); これでは動作しません。 以下ソースです。 ご回答よろしくお願いいたします。 http://foofoo77.web.fc2.com/imagechange/sort.html <head> <script type="text/javascript" src="js/jquery-1.4.4.min.js"></script> <script type="text/javascript"> $(function(){ var Num = 3; $("#chinese-btn").click(function(){ $("li").hide(); $(".chinese:lt(Num)").show(); }); $("#japanese-btn").click(function(){ $("li").hide(); $(".japanese:lt(2)").show(); }); $("#european-btn").click(function(){ $("li").hide(); $(".european:lt(2)").show(); }); $("#add-seeing").click(function(){ Num +=2; alert(Num); }); }); </script> <style type="text/css"> li { display: none; } </style> </head> <h1>ソート</h1> <button id="chinese-btn">中華</button> <button id="japanese-btn">和食</button> <button id="european-btn">洋食</button> <ul> <li class="chinese">中華</li> <li class="japanese">和食</li> <li class="european">洋食</li> <li class="chinese">中華</li> <li class="japanese">和食</li> <li class="european">洋食</li> <li class="chinese">中華</li> <li class="japanese">和食</li> <li class="european">洋食</li> <li class="chinese">中華</li> <li class="japanese">和食</li> <li class="european">洋食</li> <li class="chinese">中華</li> <li class="japanese">和食</li> <li class="european">洋食</li> <li class="chinese">中華</li> <li class="japanese">和食</li> <li class="european">洋食</li> </ul> <button id="add-seeing">もっと見る</button>

  • Ajax データが取得できない

    現在、AJAXを勉強中です。以下のhtmlを実行し、pref.jsを呼び出すコードをサイトから引用して記述しました。 しかし、「データを取得する」ボタンを押すと、【処理中です・・・】というメッセージが出るだけで、いっこうに該当データを取得できません。(本来であれば、指定されたxmlファイル内のデータが表示されるはずなのですが・・) 何が原因なのでしょうか。 解決策がわかる方がいらっしゃいましたらご教授ください。 よろしくお願いします。 ■pref.html --------------------------------- <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="../lib/prototype.js"></script> <script type="text/javascript" src="pref.js"></script> <link href="pref.css" rel="stylesheet" type="text/css"> <title>pref</title> </head> <body> <div> <input type="button" id="btnData" value="データ取得" /> <input type="button" id="btnClear" value="クリア" /> </div> <div id="state"></div> <div id="result"></div> </body> </html> --------- ■pref.js ---- onload = init; var state; var result; function init() { $("btnData").onclick = prefDisp; $("btnClear").onclick = clearDisp; state = $('state'); result = $('result'); } function prefDisp() { state.innerHTML = "処理中です・・・<br />\n"; var url = "http://ws.bzen.net/pgtop/pref.xml"; var paramList = ""; new Ajax.Request(url, { method: 'get', onSuccess: getData, onFailure: showErrMsg, parameters: paramList }); function getData(data){ var response = data.responseXML.getElementsByTagName('Response'); var item = response[0].getElementsByTagName('Item'); var tmpHtml=""; for(i = 0; i < item.length; i++){ var prefCd = item[i].getElementsByTagName('PREF_CD'); var prefCdValue = prefCd[0].firstChild.nodeValue; var prefName = item[i].getElementsByTagName('PREF_NAME'); var prefNameValue = prefName[0].firstChild.nodeValue; tmpHtml += prefCdValue + " " + prefNameValue + "<br />\n"; } result.innerHTML = tmpHtml; state.innerHTML = "データを取得しました。<br />\n"; } function showErrMsg(){ clearDisp(); state.innerHTML = "データを取得できませんでした。<br />\n"; } } function clearDisp() { state.innerHTML = ""; result.innerHTML = ""; } ---

    • ベストアンサー
    • AJAX
  • ボタンを押すとデータ表示、再度押すと非表示

    ボタンを押すとデータが表示されるjqueryを利用したjavascriptがあります。 このボタンを再度クリックすると非表示にしたいと考えています。 奇数回クリック=表示 偶数回クリック=非表示 という形です。 ご教授いただきたくお願いいたします。 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <script type="text/javascript"> jQuery(function($){ $("#btn0").click(function (e) { e.preventDefault(); $("#data").show(); }); </script> <button class="button18" id="btn0">ボタン</button> <div id="data" style="display:none"> データ </div>

  • jQueryのclickイベントハンドラ

    最近jQueryを勉強中でして、練習の意味で自分で以下のようなページを作ってみました。 【ページの内容】 犬、猫、鳥の画像ボタンを配置して、クリックすると各ボタンのalt属性をアラート表示する 【実際のhtml】 <div class="header"> <ul class="menu"> <li><a href="index.html" id="btn1"><img src="dog.png" alt="Dog"></a></li> <li><a href="index.html" id="btn2"><img src="cat.png" alt="Cat"></a></li> <li><a href="index.html" id="btn3"><img src="bird.png" alt="Bird"></a></li> </ul> </div> 【実際のscript】 $(function(){ var btn1 = $('#btn1'); var photo1 = btn1.find('img'); var name1 = photo1.attr('alt'); btn1.click(function(){ alert(name1); }); var btn2 = $('#btn2'); var photo2 = btn2.find('img'); var name2 = photo2.attr('alt'); btn2.click(function(){ alert(name2); }); var btn3 = $('#btn3'); var photo3 = btn3.find('img'); var name3 = photo3.attr('alt'); btn3.click(function(){ alert(name3); }); }); 上記で一応やりたいことは再現はできるのですが、scriptが冗長なのでもっと短くしたいです。 しかしどんなスクリプトにすればよいかわかりません。 宜しければアドバイスお願いいたします。

  • jQueryでajax

    ajax(jQuery使用)を使った以下のサンプルは、 セレクトボックスを選択すると、ボタンを表示するのですが、 そのボタンをクリックしても、アラート(This is success!)が表示されません。 ajaxで吐き出した<button>ボタン</button>のボタンのクリックイベントが 検知しないような感じですが、いったいどこが間違っているのかわかりません。 どなたか、ご教授いただけると助かります。 htmlソース ------------------------------------------- <meta http-equiv="content-script-Type" content="text/javascript" /> <meta http-equiv="content-style-Type" content="text/css" /> <link rel="stylesheet" href="./photo.css" media="all" /> <title> テスト</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function() { $("button").click(function() { alert("Test is success!"); }); $(".first").change(function() { var param = ''; $.ajax ({ type: "POST", url: "ajax.php", data: param, cache: false, success: function(res) { $("#result").html(res); } }); }); }); </script> </head> <body> <select name="first" class="first" id="first"> <option value="1">項目1</option> <option value="2">項目2</option> </select> <p>結果:</p> <div id="result" style="width:808px;"></div> </body> </html> phpソース ---------------------------------------- <?php echo '<button>ボタン</button>'; ?>

    • ベストアンサー
    • AJAX

専門家に質問してみよう