2009-04-05 16 views
5

私はtablesorterとajax divのコンテンツ更新に問題があります。 AJAXがリロードされると、すべてのテーブル・ファンクションが失われます。私はライブクエリーを試みましたが、それはテーブルの最初のリストを越えて機能していないようです。結果をロードした後jquery tablesorter + ajax divコンテンツ更新の問題

<script type="text/javascript"> 
    $(document).ready(function(){ 
     $(".tabs > ul").tabs(); 
     $("#sortabletable").tablesorter({ 
      headers: { 
       4: { sorter: false }, 
       5: { sorter: false } 
      }, 
      widgets:['zebra'], 
      sortlist:[[0]] 
     }); 
    }); 
    $("#sortabletable").livequery(function(){ 
     $(this).tablesorter({ 
      headers: { 
       4: { sorter: false }, 
       5: { sorter: false } 
      }, 
      widgets:['zebra'], 
      sortlist:[[0]]       
     }); 
    }); 

</script> 


// The AJAX function... 
function AJAX(){ 
    try{ 
     xmlHttp=new XMLHttpRequest(); // Firefox, Opera 8.0+, Safari 
     return xmlHttp; 
    } 
    catch (e){ 
     try{ 
      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); // Internet Explorer 
      return xmlHttp; 
     } 
     catch (e){ 
      try{ 
       xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); 
       return xmlHttp; 
      } 
      catch (e){ 
       alert("Your browser does not support AJAX."); 
       return false; 
      } 
     } 
    } 
} 

// Timestamp for preventing IE caching the GET request (common function) 
function fetch_unix_timestamp(){ 
    return parseInt(new Date().getTime().toString().substring(0, 10)) 
} 

//////////////////////////////// 
// 
// Refreshing the DIV TIMEDIV 
// 
//////////////////////////////// 

function events_listings(){ 

    // Customise those settings 
    var seconds = 5; 
    var divid = "tab01"; 
    var url = "events_listings.php"; 

    // Create xmlHttp 
    var xmlHttp_one = AJAX(); 
    // No cache 
    var timestamp = fetch_unix_timestamp(); 
    var nocacheurl = url+"?t="+timestamp; 

    // The code... 

    xmlHttp_one.onreadystatechange=function(){ 
     if(xmlHttp_one.readyState==4){ 
      document.getElementById(divid).innerHTML=xmlHttp_one.responseText; 
      setTimeout('events_listings()',seconds*1000); 
     } 
    } 
    xmlHttp_one.open("GET",nocacheurl,true); 
    xmlHttp_one.send(null); 
} 

// Start the refreshing process 
window.onload = function startrefresh(){ 
    setTimeout('events_listings()',seconds*1000); 
} 

//////////////////////////////// 
// 
// Refreshing the DIV TIMEINWASHINGTON 
// 
//////////////////////////////// 
var formvar = ""; 
function view_job(temp){ 

    // Customise those settings 
    var seconds = 8; 
    var divid = "tab02"; 
    var url = "view_job.php"; 
    formvar = temp; 

    // Create xmlHttp 
    var xmlHttp_two = AJAX(); 

    // No cache 
    var timestamp = fetch_unix_timestamp(); 
    var nocacheurl = url+"?t="+timestamp+"&"+formvar; 
     // The code... 
    xmlHttp_two.onreadystatechange=function(){ 
     if(xmlHttp_two.readyState==4){ 
      document.getElementById(divid).innerHTML=xmlHttp_two.responseText; 
      setTimeout('view_job(formvar)',seconds*1000); 
     } 
    } 
    xmlHttp_two.open("GET",nocacheurl,true); 
    xmlHttp_two.send(null); 
} 

// Start the refreshing process 
window.onload = function startrefresh(){ 
    setTimeout('view_job(formvar)',seconds*1000); 
} 

答えて

7

、あなたはそれを再ソートするもう一度$("#table").tablesorter()を行う必要があります。また、jQueryの$.getまたは$.post

+0

感謝メイト。私はちょうどそれを考え出し、jquery .ajaxを使っています。それは完全に動作します。 – Nalla

+0

心配はありません:)私が答えたとおりに –

+1

がtrigger()メソッドを呼び出すようにしたい場合は、アップホートして回答を受け入れることができます。私はそれがオーバーヘッドより少ないオーバーヘッドを持つかもしれないと思う.tablesorter()を呼び出す。 –

1

からjQuery .ajax関数を使用して見つけました。はるかに簡単で、完璧に動作します。

2

あなたの元の問題は、ライブクエリがjQuery呼び出しで開始されたドキュメントの変更のみを検出できることでした。

innerHTMLを直接設定しても起動されません。その行を$("#"+divid).html(xmlHttp_one.responseText)に変更すると、問題は解決されました。

解決策が見つかりましたことをうれしく思います!ただし、Live Queryはドキュメントが変更されるたびにスキャンする必要があることに注意してください。これは便利ですが、パフォーマンスが大幅に向上します。あなたのjQuery.ajax(success:)機能でtablesorter()に電話をかける方が良いでしょう。

+0

シドニーのアイデアをありがとうございました。成功の中でtablesorterを呼び出すことで、私のコードを更新しました。そして、実行がはるかに良くなり、ライブクエリーに起因するちらつきもなくなりました。もう一度感謝します。 – Nalla

0

私はjava/ajaxプログラミングではかなり新しいですが、まったく同じ問題があります。私のテーブルでdivの内容を(ajaxを使って)更新すると、tablesorterは機能しません。最初のページ(divにではなく)に直接テーブルをロードすると、tablesorterは完全に機能します。

これを解決するためにコードをどのように変更したのかを詳しく説明することができれば幸いです。

おかげで、ボヤン

24

代わりの.tablesorter()を呼び出すと、再び、あなたは)(.tablesorter呼び出しのオーバーヘッドのいずれかなしで、代わりに更新をトリガすることができます

("#table").trigger("update"); 

私が使用しましたこれは自分のプロジェクトで成功しました。あなたは:successハンドラでtrigger()を呼び出すことができます。

HTH

+2

ありがとうございます。それは本当に役立ちます! カスタムパーサを作成する場合は、正しい型(数値またはテキスト)が返されていることを確認します。そうしないと、その列では機能しません。 –

+2

OMG、あなたはちょうど私の人生を救った。ありがとう、ありがとう、ありがとう。 – dsummersl

+0

テーブル本体を更新した後の私のプロジェクトでは、一度列のソーターをクリックすると、本文が最後の内容に置き換えられました。しかし、このソリューション(トリガー(「更新」)を使用することは魅力的な働きをしました。ありがとう – Ehsan

1

としては、行くために最善の方法をjqueryのAJAX呼び出しをされて使用して言及した:Pが、私はので、ここで私は私のプロジェクトで使用されるコードです初心者のために少し曖昧であることを記事を見つけました:

は、
$('input.user').click(function() { 
    var getContact = $(this).val(); 
    $.ajax({ 
     url: 'contact_table.php', 
     data: 'userID='+getContacts, 
     success: function(result) { 
      $('#UserContactTable').append(result); 
      $("#contact-list").tablesorter(); 
     } 
    }); 
}); 
2

私は同じ問題があり、この方法を見つけました。

$("#table tbody tr").addClass("to-delete"); 
$("#table tbody").append(data); 
$("#table").trigger("update"); 
$("#table").trigger("appendCache"); 
$("#table").trigger("sorton",[[[2,1],[0,0]]]); 
$("#table tbody tr.to-delete").remove(); 
$("#table").trigger("update"); 

非常にかわいいですが動作します。

1

ajaxStop関数を使用すると、コードはajax呼び出しの完了後に実行されます。

$("#DivBeingUpdated").ajaxStop(function(){ 
    $("table").tablesorter() 
}); 
0

答えは質問とは無関係ですが、誰かを助けるかもしれません。

AJAX呼び出しでテーブルの内容を読み込む場合、AJAX呼び出しの実行が成功した後にtablesorter()関数を呼び出す必要があります。同じことを説明し コード - nutrition.xmlファイルの>

 $(document).ready(function(){ 
     //once the document is loaded make the AJAX call to required url 
     $.ajax({ 
      url : 'nutrition.xml', //I have accessed nutrition.xml file 
      type : 'GET', 
      dataType : 'xml' //return type is xml 
     }) 
     .done(function(xml){ 
      //after successful call 
      /*here i have created an html string but, 
      one call also use appendTo() like : 
      $("<thead></thead>").appendTo("table"); and so on.. */ 

      var str = "<thead><tr><th>Name</th><th>Calories</th></tr></thead><tbody>"; 

      //loop through each element of xml filer 
      $(xml).find('food').each(function(i){ 
       var name = $(this).find('name').text(); 
       var calories = $(this).find('calories').attr('total'); 
       //append to string 
       str = str + "<tr><td>"+name+"</td><td>"+calories+"</td></tr>"; 
      }); 
      str = str + "</tbody>"; 
      //set html for <table> 
      $("table").html(str); 

      //the main part call tablesorter() once contents are set successfully 
      $("table").tablesorter({debug: true}); 
     }) 
     .fail(function(xhr,status,errorThrown){ 
      //on ajax call failure 
      alert("An error occurred while processing XML file."); 
     });   
    }); 

内容:

<?xml version="1.0"?> 
    <nutrition> 
    <food> 
     <name>Avocado Dip</name> 
     <calories total="110" fat="100"/> 
    </food> 
    <food> 
     <name>Bagels, New York Style </name> 
     <calories total="300" fat="35"/> 
    </food> 
    <food> 
     <name>Beef Frankfurter, Quarter Pound </name> 
     <calories total="370" fat="290"/> 
    </food> 
    </nutrition>