Скрипт подгрузки контента не правильно работает на нескольких страницах, битрикс.
Добрый день, нужна помощь при работе со скриптом.
Скрипт подгружает контент следующей страницы, в данном случае по 9 элементов.
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<?CJSCore::Init(array("jquery"));?>
<?
$arResult["NavQueryString"] = str_replace('&','&',$arResult["NavQueryString"]);
$do = preg_match('/.*bxajaxid=(\S+).*/',$arResult["NavQueryString"],$bxajaxid);
?>
<script>
var ajax_nav = {'NavShowAlways':true,'NavTitle':'Товары','NavRecordCount':'31','NavPageCount':'4','NavPageNomer':'4','NavPageSize':'9','bShowAll':false,'NavShowAll':false,'NavNum':'1','bDescPageNumbering':false,'add_anchor':'','nPageWindow':'5','bSavePage':false,'sUrlPath':'/catalog/3567/','NavQueryString':'bxajaxid=eb7a0314a992bd489b709fe055063bee','sUrlPathParams':'/catalog/3567/?bxajaxid=eb7a0314a992bd489b709fe055063bee&','nStartPage':'1','nEndPage':'4','NavFirstRecordShow':'28','NavLastRecordShow':'31'};
var bxajaxid = "";
</script>
<?
if(!$do)
{?>
<div id ='ajax_nav'></div>
<script type="text/javascript">
/* isset for javascript */
window.isset = function()
{
if (arguments.length===0) return false;
var buff=arguments[0];
for (var i=0; i<arguments.length; i++)
{
if (typeof(buff)==='undefined') return false;
buff = buff[arguments[i+1]];
}
return true;
}
BX.ready(
function()
{
$(window).scroll(
function()
{
if($(window).scrollTop()+$(window).height()+100>=$('#ajax_nav').offset().top)
{
if (ajax_nav.NavPageCount > ajax_nav.NavPageNomer )
{
//ajax_nav.NavPageCount содержит количество страниц
//ajax_nav.NavPageNomer всегда 1
//ajax_nav.NavNum всегда 1
//bxajaxid уникальный идентификатор
if(bxajaxid.length == "")
{
bxajaxid = $('#ajax_nav').parents("div[id*='comp_']").attr('id').replace('comp_','');
url = location.pathname+'?PAGEN_'+ajax_nav.NavNum+'='+(parseInt(ajax_nav.NavPageNomer)+1)+'&bxajaxid='+bxajaxid+'&'+ ajax_nav.NavQueryString;
}
else
{
url = location.pathname+'?PAGEN_'+ajax_nav.NavNum+'='+(parseInt(ajax_nav.NavPageNomer)+1)+'&'+ ajax_nav.NavQueryString;
}
if (!isset(window, "ajax_sent"))
{
ajax_sent = true;
$('#ajax_nav').addClass('bx-core-waitwindow');
$.get(url,function(data)
{
$('#ajax_nav').removeClass('bx-core-waitwindow');
bxajaxid = $('#ajax_nav').before(data);
ajax_sent = false;
});
}
else if (ajax_sent == false)
{
ajax_sent = true;
$('#ajax_nav').addClass('bx-core-waitwindow');
$.get(url,function(data)
{
$('#ajax_nav').removeClass('bx-core-waitwindow');
bxajaxid = $('#ajax_nav').before(data);
ajax_sent = false;
});
}
}
}
});
}
);
</script>
<?}?> Проблема состоит в том, что на некоторых страницах происходит подгрузка только 2-3 страниц, а на самом деле их больше, или не происходит ajax запроса! Подскажите в каком направлении двигаться. В одном разделе все работает правильно в другом нет, возможно что то не предусмотрел. |
Заметил еще такой момент, если внести в get параметр значение
?PAGEN_1=10 тогда все последующие страницы начинают подгружаться, если значения от 1 до 9 подгрузки не происходит. А на страницах где подгружается все как положено, если указать get от 2 до 9 то подгрузки тоже не происходит. |
Нужна помощь в отладке.
<div id="insertContent">
<?$APPLICATION->IncludeFile("/catalog/element.php");?>
</div>
<a class="show-more" href="#" ></a>
</div>
<script>
$(document).ready(function(){
//путь к файлу с компонентом. Указываем параметр
var path = "/catalog/element.php?ajax=Y";
//счетчик страниц
var currentPage = 1;
var SECTION_ID = <?=CUtil::PhpToJSObject($_REQUEST["SECTION_ID"])?>;
var SECTION_CODE = <?=CUtil::PhpToJSObject($_REQUEST["SECTION_CODE"])?>;
var ELEMENT_SORT_FIELD = <?=CUtil::PhpToJSObject($_REQUEST["ELEMENT_SORT_FIELD"])?>;
var ELEMENT_SORT_ORDER = <?=CUtil::PhpToJSObject($_REQUEST["ELEMENT_SORT_ORDER"])?>;
var PAGE_ELEMENT_COUNT = <?=CUtil::PhpToJSObject($_REQUEST["PAGE_ELEMENT_COUNT"])?>;
var NavPageCount = <?=CUtil::PhpToJSObject($_REQUEST["NavPageCount"])?>;
var pageGet = <?=CUtil::PhpToJSObject($_GET)?>;
$(window).scroll(function(e){
var inProgress = false;
if($(window).scrollTop()+($(window).height()+900)>=$(document).height() && !inProgress)
{
inProgress = true;
$(".show-more").addClass("WaitWindow");
$.get(
path,
{PAGEN_1: ++currentPage, SECTION_ID: SECTION_ID, SECTION_CODE: SECTION_CODE, ELEMENT_SORT_FIELD:ELEMENT_SORT_FIELD, ELEMENT_SORT_ORDER:ELEMENT_SORT_ORDER, PAGE_ELEMENT_COUNT: PAGE_ELEMENT_COUNT, NavPageCount: NavPageCount, pageGet: pageGet},
function(data){
$("#insertContent").append(data);
inProgress = false;
$(".show-more").removeClass("WaitWindow");
});
}
e.preventDefault();
});
});</script>
При данной работе скрипта, если пользователь резко дергает страницу происходит много запросов, и сервер отключает такого пользователя на 5 минут, подскажите как сделать так что бы пока отправляется запров, второй запрос не отправлялся. Пробовал добавить переменную inProgress. И второй вопрос, как остановить запросы к файлу если все элементы уже выведены? код примерно такой
if(!isset($_GET["NavPageCount"]) || ($_GET["NavPageCount"] >= $_GET["PAGEN_1"])){
//выполняем запрос и возвращаем на страницу элементы
}
else{
//закончились элементы
//вернуть параметр, что бы script js перестал делать запросы
//именно здесь я не знаю что сделать
}
Подскажите как сделать |
> как сделать так что бы пока отправляется запров, второй запрос не отправлялся
Самое простое, это добавить флаг, то есть условие на запрос не только позиция прокрутки документа, но и разрешение этого флага: var perm = 1; //изначально запрос разрешен //перед запросом сбрасываем флаг perm ^= 1; //получили ответ сервера, обработали, разрешаем следующий запрос perm ^= 1; То что элементы закончились клиент должен знать, значит тоже следить за этим надо. Можно при первом запросе выдать общее его количество за минусом порции, а при каждом вычитать эту порцию. Либо последний запрос вернул пустой результат, запомнить его. |
| Часовой пояс GMT +3, время: 14:50. |