Исключить повторяющиеся записи - PullRequest
0 голосов
/ 23 декабря 2009

Я использую следующий javascript для динамической загрузки содержимого внешней страницы в пределах родительской страницы. Внешняя страница находится в том же домене, что и родительская страница, и запрашивает в базе данных записи блога. Я использую переменную «eeOffset», чтобы передать значение в запрос к базе данных на внешней странице, чтобы компенсировать возвращаемые результаты, т. Е. Если eeOffset равен «5», то запрос возвращает следующие записи базы данных из шестой. Переменная «eeLimit» устанавливает общее количество элементов, возвращаемых с каждым запросом. У меня проблема в том, что записи, отображаемые на родительской странице, дублируются - это как если бы URL страницы шаблона не обновлялся до того, как запрос на новые элементы будет запущен. У кого-нибудь есть предложения, как преодолеть эту проблему?

var eeLoading; // Declare variable "eeLoading"
var eeTemplate = "http://www.mydomain.com/new_items/query"; // URL to template page
var eeOffset; // Declare variable "eeOffset"
var eeLimit = "5"

//Execute the following functions when page loads
$(function (){
    scrollAlert();
    $("#footer").append("<div id='status'></div>"); //Add some html to contain the status and loading indicators
    updateStatus(); // Update the total number of items displayed
    });

//Update Status
function updateStatus(){
    var totalItems = $("ul.column li").length;
    eeOffset = totalItems;
    eeURL = eeTemplate+"/"+eeOffset+"/"+eeOrderby+"/"+eeSort+"/"+eeLimit+"/"; // Build the template page url
    }

//Scoll Alert 
function scrollAlert(){
    var scrollTop = $("#main").attr("scrollTop");
    var scrollHeight = $("#main").attr("scrollHeight");
    var windowHeight = $("#main").attr("clientHeight");
    if (scrollTop >= (scrollHeight-(windowHeight+scrollOffset)) && eeLoading !== "false"){
        $("#status").addClass("loading");
        $.get(eeURL, function(newitems){ //Fetch new items from the specified url
            if (newitems != ""){ //If newitems exist...
                $("ul.column").append(newitems); //...add them to the parent page
                updateStatus(); //Update the status
                }
            else {
                eeLoading = "false"; //If there are no new items...
                $("#status").removeClass("loading"); //Remove the loading throbber
                $("#status").addClass("finished");  //Add some text
                }
            });
        }
    if (eeLoading !== "false") { //If there are still new items...
        setTimeout("scrollAlert();", 1500); //..check the scollheight every 1500ms
        }
    }

1 Ответ

0 голосов
/ 23 декабря 2009

Похоже, что в вашем коде есть условие гонки. Если запрос на новые элементы занимает более 1,5 секунд, вы отключите следующий запрос перед вызовом updateStatus (). Я думаю, что самый простой способ это исправить - переместить этот код:

if (eeLoading !== "false") { //If there are still new items...
    setTimeout("scrollAlert();", 1500); //..check the scollheight every 1500ms
    }

Внутри оператора if после вызова updateStatus () обновляется URL-адрес для запроса:

if (newitems != ""){ //If newitems exist...
   $("ul.column").append(newitems); //...add them to the parent page
   updateStatus(); //Update the status
   // Move setTimeout here

Таким образом, статус всегда будет обновляться при запросе нового URL.

...