Скрипт подгрузки контента не правильно работает на нескольких страницах, битрикс.
Добрый день, нужна помощь при работе со скриптом.
Скрипт подгружает контент следующей страницы, в данном случае по 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, время: 21:36. |