Вход

Просмотр полной версии : Скрипт подгрузки контента не правильно работает на нескольких страницах, битрикс.


Js_Skriptor
12.02.2015, 13:07
Добрый день, нужна помощь при работе со скриптом.
Скрипт подгружает контент следующей страницы, в данном случае по 9 элементов.
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<?CJSCore::Init(array("jquery"));?>
<?
$arResult["NavQueryString"] = str_replace('&amp;','&',$arResult["NavQueryString"]);
$do = preg_match('/.*bxajaxid=(\S+).*/',$arResult["NavQueryString"],$bxajaxid);
?>

<script>
var ajax_nav = {'NavShowAlways':true,'NavTitle':'Товары','N avRecordCount':'31','NavPageCount':'4','NavPageNom er':'4','NavPageSize':'9','bShowAll':false,'NavSho wAll':false,'NavNum':'1','bDescPageNumbering':fals e,'add_anchor':'','nPageWindow':'5','bSavePage':fa lse,'sUrlPath':'/catalog/3567/','NavQueryString':'bxajaxid=eb7a0314a992bd489b709 fe055063bee','sUrlPathParams':'/catalog/3567/?bxajaxid=eb7a0314a992bd489b709fe055063bee&','nStartPage':'1','nEndPage':'4','NavFirstRecordS how':'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+'='+(p arseInt(ajax_nav.NavPageNomer)+1)+'&bxajaxid='+bxajaxid+'&'+ ajax_nav.NavQueryString;
}
else
{

url = location.pathname+'?PAGEN_'+ajax_nav.NavNum+'='+(p arseInt(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 запроса! Подскажите в каком направлении двигаться.
В одном разделе все работает правильно в другом нет, возможно что то не предусмотрел.

Js_Skriptor
12.02.2015, 15:10
Заметил еще такой момент, если внести в get параметр значение
?PAGEN_1=10 тогда все последующие страницы начинают подгружаться, если значения от 1 до 9 подгрузки не происходит. А на страницах где подгружается все как положено, если указать get от 2 до 9 то подгрузки тоже не происходит.

Js_Skriptor
16.02.2015, 12:23
Нужна помощь в отладке.

<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 перестал делать запросы
//именно здесь я не знаю что сделать
}

Подскажите как сделать

laimas
16.02.2015, 21:29
> как сделать так что бы пока отправляется запров, второй запрос не отправлялся

Самое простое, это добавить флаг, то есть условие на запрос не только позиция прокрутки документа, но и разрешение этого флага:

var perm = 1; //изначально запрос разрешен
//перед запросом сбрасываем флаг
perm ^= 1;
//получили ответ сервера, обработали, разрешаем следующий запрос
perm ^= 1;

То что элементы закончились клиент должен знать, значит тоже следить за этим надо. Можно при первом запросе выдать общее его количество за минусом порции, а при каждом вычитать эту порцию. Либо последний запрос вернул пустой результат, запомнить его.