1artes1 | Отредактировал 1artes1 - Воскресенье, 23 Декабря 2012, 16:58 Дата: 24 Декабря 2012, 11:52 | Сообщение # 1 | ● ● ● ● ● 9 сообщений Статус: Offline | В общем создаю фильтр, чтобы можно было с помощью формы отфильтровать материалы каталога статей.
Идея довольно проста: через адресную строку передаются параметры на страницу каталога, где в зав-ти от параметров переданных формой и происходит отсеивание данных.
Сайт это по сути это доска объявлений по квартирам, по-этому в форме использованы 3 параметра: адрес метро, цена, кол-во комнат. Последний параметр это по сути адрес категории каталога статей(они разделены по кол-ву комнат).
Проблема собственно вот в чём: т.к. на юкозе нельзя передать параметры на главную каталога где бы были все материалы таким образом "http://vgostispb.ru/publ/0-?Какие-то_параметры" то пришлось создать отдельный раздел. И нужно получается поочерёдно открывать каждый раздел узнавать сколько всего материалов в этом разделе, чтобы узнать сколько страниц нужно открывать, открывать каждую эту страницу и извлекать все материалы которые там имеются проверяя на наличие в этих материалах адекватных фильтру данных, и потом все совпадения отобразить на странице, на которой находимся. Получился таким образом довольно глубокий многоуровневый цикл. Код ниже это код обработчика который находится на главных страницах каталога, и первую его половину занимает обработка случая когда нужно вывести все материалы со всех категорий. Причём сразу отмечу что вторая половина когда выбран точный вариант кол-ва комнат работает исправно.
Так вот по поводу этой первой половины, первым этапом выясняется в какой категории мы находимся, если в категории "все", то создаём цикл (for i ...) длина которого равна длине массива со значениями вариантов категории, в этом же цикле открываем главную страницу каждой категории, узнаем число материалов, делим на 15(кол-во материалов на странице) и округляем в большую сторону, получаем число страниц каждой такой категории, и в следующем цикле(for g ...) начинаем их открывать поочерёдно и с помощью третьего цикла (for l ...) сразу же проверяем данные материалы на адекватность переданным значениям из формы. При этом данные вытаскиваются get запросом во втором цикле.
Вообще эта половина работает, то есть ошибок в синтаксисе нет. Но не выводятся отфильтрованные материалы. Стал проверять в чём же дело, ставил alert() внутри разных циклов, и судя по рез-там складывается ощущение что циклы работают отдельно от функции $get, как будто цикл как считает так и идёт а $get не успевает открыть страницу и получить инфу, как уже значение цикла изменилось.
Скажите, пожалуйста, в чём может быть проблема.
Я понимаю, что понять что-то будет сходу тяжело, так что задавайте вопросы, уточню.
Код $(document).ready(function() {
var xhrf=location.href;
var xprc=location.href;
var xprc2=location.href;
var xarr =["http://vgostispb.ru/publ/1", "http://vgostispb.ru/publ/2_kh_komnatnye_kvartiry/2", "http://vgostispb.ru/publ/3_kh_komnatnye_kvartiry/3", "http://vgostispb.ru/publ/4_kh_komnatnye_kvartiry/4", "http://vgostispb.ru/publ/5_komnatnye_kvartiry/5", "http://vgostispb.ru/publ/komnaty/6", "http://vgostispb.ru/publ/vse/7"]; // массив вариантов категории в которой мы находимся
var cntvar;
if(xhrf.indexOf("http://vgostispb.ru/publ/1")!==-1){ cntvar=0;}
if(xhrf.indexOf("http://vgostispb.ru/publ/2_kh_komnatnye_kvartiry/2")!==-1){ cntvar=1;}
if(xhrf.indexOf("http://vgostispb.ru/publ/3_kh_komnatnye_kvartiry/3")!==-1){ cntvar=2;}
if(xhrf.indexOf("http://vgostispb.ru/publ/4_kh_komnatnye_kvartiry/4")!==-1){ cntvar=3;}
if(xhrf.indexOf("http://vgostispb.ru/publ/5_komnatnye_kvartiry/5")!==-1){ cntvar=4;}
if(xhrf.indexOf("http://vgostispb.ru/publ/komnaty/6")!==-1){ cntvar=5;}
if(xhrf.indexOf("http://vgostispb.ru/publ/vse/7")!==-1){ cntvar=6;
if(xprc.indexOf('price=')==-1){ xprc="";} else{ xprc=xprc.substr(xprc.indexOf('price=') + 6); }
if(xprc2.indexOf('metro=')==-1){ xprc2=""; } else{ xprc2=xprc2.slice(xprc2.indexOf('metro=') + 6, xprc2.indexOf('&price=')); xprc2=decodeURI(xprc2); }
if(xprc!=""){
$("#entrtab").css("display", "none"); $("#sortmen").css("display", "none"); $("#pgsel1").css("display", "none"); $("#pgsel2").css("display", "none");
var alentr;
document.getElementById('xbody').innerHTML ="";
for(i=0;i<xarr.length-1;i++){
alert(xarr[i] + " " + i)
$.get(xarr[i], function(data2){
alert(xarr[i] + " " + i)
alentr=$("#entrnum", data2).text(); alentr=Math.ceil(alentr/15);
for(g=0;g<alentr;g++){
if(g==0){g++;}
alert(xarr[i] + "-" + g);
$.get(xarr[i] + "-" + g, function(data){ // адрес последней страницы с темой
alert(xarr[i] + "-" + g);
var zz = $(".eBlock", data).parent();
for(l=0;l<zz.length;l++){
var inelem = $(".eBlock .eMessage", data);
var inelem2 = $(".eBlock .eTitle", data);
if(Number($(inelem[l]).html().slice($(inelem[l]).html().indexOf('от ')+ 3,$(inelem[l]).html().indexOf(' руб./сутки')))<=Number(xprc)){ // проверяем содержимое материала на соотв. условию цены
if(xprc2!=""){
if($(inelem2[l]).html().indexOf(xprc2)!=-1){
document.getElementById('xbody').innerHTML = document.getElementById('xbody').innerHTML + $(zz[l]).html() + "<br />";
}
} else{
document.getElementById('xbody').innerHTML = document.getElementById('xbody').innerHTML + $(zz[l]).html() + "<br />";
} } //if
} // for l
}); // $get внутренний
} // for g
}); // $get внешний
} // for i } // if xprc else{
if(xprc2!=""){
alentr=$("#entrnum").text();
var alentr=43; // сюда нужно динамическую переменную поместить
$("#entrtab").css("display", "none"); $("#sortmen").css("display", "none"); $("#pgsel1").css("display", "none"); $("#pgsel2").css("display", "none");
alentr=Math.ceil(alentr/15);
document.getElementById('xbody').innerHTML ="";
for(i=0;i<xhrf.length-1;i++){
for(g=0;g<alentr;g=g+1){
if(g==0){g++};
$.get(xhrf[i] + "-" + g, function(data){ // адрес последней страницы с темой
var zz = $(".eBlock", data).parent();
for(l=0;l<zz.length;l++){
var inelem2 = $(".eBlock .eTitle", data);
if($(inelem2[l]).html().indexOf(xprc2)!=-1){
document.getElementById('xbody').innerHTML = document.getElementById('xbody').innerHTML + $(zz[l]).html() + "<br />";
}
} // for l
});
} // for g
} // for i } // if xprc } // else }
////////////////////////////////// Вторая половина кода
else{ // основной else
if(xprc.indexOf('price=')==-1){ xprc="";} else{ xprc=xprc.substr(xprc.indexOf('price=') + 6); }
if(xprc2.indexOf('metro=')==-1){ xprc2=""; } else{ xprc2=xprc2.slice(xprc2.indexOf('metro=') + 6, xprc2.indexOf('&price=')); xprc2=decodeURI(xprc2); }
if(xprc!=""){
var alentr=$("#entrnum").text();
$("#entrtab").css("display", "none"); $("#sortmen").css("display", "none"); $("#pgsel1").css("display", "none"); $("#pgsel2").css("display", "none");
alentr=Math.ceil(alentr/15);
document.getElementById('xbody').innerHTML ="";
for(g=0;g<alentr;g=g+1){
if(g==0){g++};
$.get(xarr[cntvar] + "-" + g, function(data){ // адрес последней страницы с темой
var zz = $(".eBlock", data).parent();
for(l=0;l<zz.length;l++){ var inelem = $(".eBlock .eMessage", data);
var inelem2 = $(".eBlock .eTitle", data);
if(Number($(inelem[l]).html().slice($(inelem[l]).html().indexOf('от ')+ 3,$(inelem[l]).html().indexOf(' руб./сутки')))<=Number(xprc)){
if(xprc2!=""){
if($(inelem2[l]).html().indexOf(xprc2)!=-1){
document.getElementById('xbody').innerHTML = document.getElementById('xbody').innerHTML + $(zz[l]).html() + "<br />";
}
} else{
document.getElementById('xbody').innerHTML = document.getElementById('xbody').innerHTML + $(zz[l]).html() + "<br />";
} } //if
} // for l
}); // $get
} // for g
} // if xprc else{
if(xprc2!=""){
alentr=$("#entrnum").text();
$("#entrtab").css("display", "none"); $("#sortmen").css("display", "none"); $("#pgsel1").css("display", "none"); $("#pgsel2").css("display", "none");
alentr=Math.ceil(alentr/15);
document.getElementById('xbody').innerHTML ="";
for(g=0;g<alentr;g=g+1){
if(g==0){g++};
$.get(xarr[cntvar] + "-" + g, function(data){ // адрес последней страницы с темой
var zz = $(".eBlock", data).parent();
for(l=0;l<zz.length;l++){
var inelem2 = $(".eBlock .eTitle", data);
if($(inelem2[l]).html().indexOf(xprc2)!=-1){
document.getElementById('xbody').innerHTML = document.getElementById('xbody').innerHTML + $(zz[l]).html() + "<br />";
}
} // for l
});
} // for g
} // if xprc } // else }
}); // ready Добавлено (24 Декабрь 2012, 11:51) --------------------------------------------- Попробую упростить задачу. В общем мне нужно знать возможно ли такое, что цикл внутри которого находится $get запрос будет выполняться не смотря на то завершено ли выполнение этого $get запроса, то есть не дожидаясь его выполнения начинать следующий цикл. Добавлено (24 Декабрь 2012, 11:52) --------------------------------------------- Если да, то как с этим быть? | | |
|