(jquery): После Ajax: успех, как ограничить разбор по частям и вставлять по частям в DOM (трюк, чтобы ускорить) - PullRequest
2 голосов
/ 31 марта 2010

Допустим, в случае успеха ajax вызывается функция: xmlParser (xml), а ответ XML содержит около 1500 элементов xml (например: ...)

Внутри это выглядит так:

function xmlParser(xml){
    var xmlDOM = $(xml);  // dom object containing xml response

    xdom.find("book").each(function(){
        var $node = $(this);
        // parsing all the <book> nodes
    });
}

Как вы можете сказать: анализируйте только первые 20 узлов из ответа xml, что-то с ними сделайте. И у вас есть кнопка ... при нажатии анализирует следующие 20 узлов ... и т. Д.

В общем, есть ли что-то вроде: children (20) .... и функция, которая будет анализировать следующие 20 узлов на клике.

1010 * ТНХ *

Ответы [ 3 ]

3 голосов
/ 31 марта 2010

Вы можете реализовать простое разбиение на страницы в функции xmlParser. Попробуйте что-то вроде этого:

function xmlParser(xml, page, perpage){
    // dom object containing xml response
    var xmlDOM = $(xml);

    // From what index to start showing
    var start = (page - 1) * perpage;

    // Find elements starting from start point using .gt() up to end point using .lt()
    xmlDOM.find("book").gt(start - 1).lt(perpage).each(function() {
        var $node = $(this);
        // Do your stuff
    });
}

// Usage
xmlParser(xml, 1, 20);

Это будет обрабатывать только указанное количество элементов на данной странице. Обратите внимание, что этот пример не учитывает минимальное и максимальное количество страниц и т. Д., Но должен дать вам кое-что для работы.

Но, как отметил Дэвид В. в комментариях, вам действительно нужно просто получить правильное количество результатов с сервера, а не анализировать их в JS. В настоящее время вы загружаете все 1500 записей, даже если пользователь хочет только первые 20.

2 голосов
/ 31 марта 2010

Это должно сделать работу:

xdom.find("book:gt(lowerBound):lt(upperBound)").each(function(){
    var $node = $(this);
    // parsing all the <book> nodes
});

Где нижняя граница и верхняя граница - ваши границы.

1 голос
/ 31 марта 2010

Я бы сохранял эти данные глобально либо в переменной, либо в jQuery'ish с данными.

function xmlParser(xml){
    $.data(document.body, 'xmlDOM', $(xml));  // dom object containing xml response      
});}

, а затем вторая функция, такая как

function getBooks(start, end){
  return($.data(document.body, 'xmlDOM').slice(start, end));
});

использование:

var books = getBooks(0,20);
 $.each(books, function(i){
   // do anything with objects, $('#something').append($(this));
 });
...