JQuery TableSorter + AJAX Div обновления контента проблема - PullRequest
5 голосов
/ 05 апреля 2009

У меня проблемы с обновлением содержимого таблиц и ajax div. После перезагрузки Ajax все функции TableSorter теряются. Я пробовал livequery, но, похоже, он не работает после первого перечисления таблицы.

<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);
} 

Ответы [ 9 ]

24 голосов
/ 03 июля 2009

Вместо повторного вызова .tablesorter () вы можете вместо этого инициировать обновление без каких-либо дополнительных затрат на вызов .tablesorter ():

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

Я успешно использовал это в своем собственном проекте. Вы можете вызвать триггер () в вашем: success обработчике.

НТН

7 голосов
/ 05 апреля 2009

После загрузки результата вам нужно сделать $("#table").tablesorter() еще раз, чтобы пересортировать его. Кроме того, вместо того, чтобы писать свой ajax-код вручную, используйте $.get или $.post из jquery

2 голосов
/ 26 сентября 2011

У меня была такая же проблема, и я нашел этот метод.

$("#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");

Это не очень красиво, но работает!

2 голосов
/ 05 апреля 2009

Ваша первоначальная проблема заключалась в том, что Live Query может обнаруживать только изменения в документе, который начался с вызова jQuery.

Непосредственная установка innerHTML не вызовет его срабатывание. Изменение этой строки на $("#"+divid).html(xmlHttp_one.responseText) решило бы вашу проблему.

Рад слышать, что вы нашли решение! Имейте в виду, однако, что Live Query должен сканировать документ каждый раз, когда он изменяется - это удобно, но приводит к значительному снижению производительности. Было бы лучше поместить вызов на tablesorter() в вашей функции jQuery.ajax(success:).

1 голос
/ 11 февраля 2012

Используйте функцию ajaxStop, и код будет запущен после завершения вызова ajax.

$("#DivBeingUpdated").ajaxStop(function(){ 
    $("table").tablesorter()
});
1 голос
/ 29 августа 2009

Как уже упоминалось, использование 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();
        }
    });
});
1 голос
/ 05 апреля 2009

Нашел решение с помощью функции jQuery .ajax. намного проще и работает отлично.

0 голосов
/ 17 марта 2016

Ответ не имеет отношения к заданному вопросу, но может кому-то помочь.

В случае загрузки содержимого таблицы с помощью вызова AJAX, функция tablesorter () должна вызываться после успешного выполнения вызова AJAX. Код, объясняющий то же самое ->

        $(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.");
        });         
    });

Содержимое файла nutrition.xml:

<?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>
0 голосов
/ 12 июня 2009

Я новичок в программировании на java / ajax, но у меня точно такая же проблема - когда я обновляю содержимое div (используя ajax) в своей таблице, tableorter не работает. Если я загружаю таблицу непосредственно на самую первую страницу (не в div), то работает tableorter.

Итак, я был бы рад, если бы вы могли более подробно объяснить, как именно вы изменили свой код для его решения.

Спасибо, Боян

...