Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Повторить поиск... (https://javascript.ru/forum/misc/16903-povtorit-poisk.html)

ale19 27.04.2011 19:38

Повторить поиск...
 
Господа профессионалы!!!
Если есть такая возможность то помогите уже добить этот скрипт до конца)))

Вот скрипт
function loadCheck(){
 var bquery = $("#ldF999").text().match(/([а-яёa-z]){4,}/gi);
 var query = bquery[0];
 $('#ressearch').show().html('<span id="searchload"><img src="/loader.gif" border="0"></span>');
 $.post('/load/', {query: query, a: 2},
 function(rez){
 var norez = $(".newslink:first", rez).attr("href");
 if (norez==undefined){
 $('#ressearch').hide();return;}
 window.count = 0;
 $(".newslink", rez).each(function(){
 window.count = window.count + 1;
 if (window.count > 5) return;
 var hrf = $(this).attr("href");
 var txt = $(this).text();
 if(hrf != location.href){
 var hrfs = '<table style="width:100%;"><tbody><tr><td><a href="'+hrf+'" class="newpotem">'+txt+'</a></td></tr></tbody></table>';
 }
 $("#searchload").hide().after(hrfs);
 });});}
 setTimeout("loadCheck()",1);

Возможно ли,и если возможно то как при условии что if (norez==undefined) повторить поиск с query = bquery[1],если и здесь undefined ,то с query = bquery[2] и так далее до последнего query = bquery[n]

walik 27.04.2011 19:47

if (norez == undefined) {
     i = 0;
     do {
          i++;
          query = bquery[i];
     } while(query == undefined && i <= n);
}

Наверное как то так.

ale19 27.04.2011 20:01

walik,
Спасибо,но ищет только до query = bquery[1] включительно,а дальше нет

walik 27.04.2011 21:19

var i = 0, n = 5, bquery = [], query, norez;
bquery[4] = 'query';

if (norez == undefined) {
	do {
		i++;
		query = bquery[i];
	} while(query == undefined && i<= n);
}
alert(query);

ale19 27.04.2011 21:57

может я что не так делаю,но не выходит ничего
query почемуто при norez == undefined не присваивает значение следуещего bquery[i] и поиск
$.post('/load/', {query: query, a: 2}
в архиве с материалами с новым query не производится

ale19 27.04.2011 23:56

НУ ПОМОГИТЕ ЖЕ КТО-НИБУДЬ....УЖ ГОЛОВУ СЛОМАЛ!!!!

melky 28.04.2011 17:58

var i = 0, n = 5, bquery = [], query, norez

bquery[4] = 'query';

if ( !norez ) {
	do {
		query = bquery[i++];
	} while(query == undefined && i<= n);
}
alert ( i );


он не до 1 ищет

ale19 28.04.2011 18:27

Не хочет и так,выводит материалы если только нашел похожие при query =bquery[0],если же нет то должен искать с query = bquery[1] , материали с таким словом в названии я знаю что точно есть,а он не находит...не говоря уже о query = bquery[2] и дальше...

как уже заставить заново выполняться при norez ==undefined
$.post('/load/', {query: query, a: 2}
c query равным следующему bquery[]
я не знаю...вернее у меня ума не хватает и знаний

ale19 28.04.2011 18:29

Подсказывали еще так
function loadCheck(num){
num = num || 0;
...
 var query = bquery[num];
...
if (norez==undefined){loadCheck(num+1); return false;}

тоже не вышло...:-?

melky 28.04.2011 18:37

тот скрипт,что вышел,отлично ищет

какова строка поиска и что вы ищете???


var bquery = $("#ldF999").text().match(/([а-яёa-z]){4,}/gi);


не пойдет

дайте нормальную строку. так же с query

ale19 28.04.2011 19:07

Есть архив материалов на сайте.В виде материалов всеназвания имеют вид
<a href="ссылка на страницу материала" class="newslink">Название материала</a>

На странице материала его название имеет вид
<div id="ldF999" >Название материала</div>

и припомощи скрипта в первом посте вывожу похожие материалы

Допустим название такое
<div id="ldF999" >Это название этого материала</div>
этим получаю массив из слов названия
bquery = $("#ldF999").text().match(/([а-яёa-z]){4,}/gi);
отбросив ненужное,т.е. цифры,знаки препинания и слова менее чем из четырех букв
Присваиваю
query = bquery[0] и ищу похожие слова в архиве с помощью поиска
$.post('/load/', {query: query, a: 2},
...
Но так ищет только по первому слову из массива bquery
Когда query меняю в срипте на другое значение ,к примеру bquery[2] ищет нормально,но вот не получается сделать так чтоб при отсутствии схожих материалов по названию в архиве,атоматически при norez==undefined присвоить query значение следующего слова из массива и повторить поиск схожих материалов

Результаты поиска выводятся в
<div style=" display: none;overflow: hidden;" id="ressearch"></div>

melky 28.04.2011 20:44

надо было расписать так ( я про первые строчки,до $.post )

тогда и понять было бы легче


и почему-то у меня неуверенность насчет переменной func и самой рекурсии

// это массив [ название, этого, материала ]
var bquery = "Это название этого материала".match(/([а-яёa-z]){4,}/gi)


// номер слова в массиве
var n = 0;



// ищем "название"

$.post('/load/', {query: bquery[n], a: 2}, function(data){

                
       // ссылка на обработчик результата. т.е. на эту анонимную функцию
       var func = arguments.callee;
      
       if( !norez ){

      /*  что приходит при верном или неверном слове из архива?
           у меня будет слово Error */

                 if( data == 'Error' ) {
  
                              // проверка на наличие такого индекса в массиве
                              if( n < bquery.length ){
 
                         /*  через половину секунды отсылаем POST-запрос серверу со следующим словом
                                                      ++n <- это 1. тоесть слово ---> "этого"
                         важно отметить,что обработчик будет ТАКОЙ ЖЕ, т.е. опять вызовет POST-запрос, но уже с увеличенным "n" ( 3 , слово -> "материала")     */

                         setTimeout( function(){   $.post('/load/', {query: bquery[++n], a: 2}, func);  }, 500 );

                             // мы прошли все элементы массива, поиск неудачен
                              } else {   
                                          
                                      alert( 'НЕ НАЙДЕНО' );
   
                              }

                }

      }

});

ale19 28.04.2011 20:50

melky,
Получается - ничего не выйдет?

melky 28.04.2011 20:56

Ты попробовал ? по логике должно работать

ale19 28.04.2011 21:00

пробовал работает отлично,только с одним из любых заданных query=bquery[]

melky 28.04.2011 21:23

Строчку проверки, верный или неверный результат пришел, изменил?

Data=="errOr"


нет, верно?

ale19 28.04.2011 21:38

заменить norez==undefined на Data=="errOr" ?

так не получается

melky 28.04.2011 22:32

facepalm

как происходит проверка, нашли ли мы или нет?

Цитата:

query = bquery[0] и ищу похожие слова в архиве с помощью поиска
$.post('/load/', {query: query, a: 2},
т.е. ответ из "архива"

ale19 28.04.2011 22:49

ну как...сдесь же
if (norez==undefined)...

melky 28.04.2011 23:07

что отвечает архив? по нем надо сверяться, верен ли результут?

ale19 28.04.2011 23:09

отвечает undefined

melky 28.04.2011 23:21

ничем не могу почомь


тяжелый случай

читайте

удачи

ale19 29.04.2011 01:30

Блин вон оно...
когда query = 'слово' в таком виде то возвращает undefined
а когда в таком...query = bquery[0] то - location.href

ale19 29.04.2011 09:51

находит же и "себя" так сказать,только не показывает
if(hrf != location.href)
поэтому undefined не может быть,так как новость существует

ale19 29.04.2011 10:38

вот так заработало
function loadCheck(i){
 i = i || 0;
 var bquery = $("#ldF999").text().match(/([а-яёa-z]){4,}/gi);
 var query = bquery[i];
 $('#ressearch').show().html('<span id="searchload"><img src="/loader.gif" border="0"></span>');
 $.post('/load/', {query: query, a: 2},
 function(rez){
 var norez = $(".newslink:first", rez).attr("href");
 if (norez==location.href)
 {loadCheck(i+1); return false;}
 window.count = 0;
 $(".newslink", rez).each(function(){
 window.count = window.count + 1;
 if (window.count > 5) return;
 var hrf = $(this).attr("href");
 var txt = $(this).text();
 if(hrf != location.href){
 var hrfs = '<a href="'+hrf+'" class="newpotem">'+txt+'</a>';
 }
 $("#searchload").hide().after(hrfs);
 });});}
 setTimeout("loadCheck()",1);


только нужно еще прекратить поиск,когда закончатся bquery[i];

а еще лучше было бы если б убрать if(hrf != location.href) и присвоить условие что если
hrf==location.href то <a href="'+hrf+'" class="newpotem">'+txt+'</a> не отображается в результатах (display:none)
и если результат является единственным,т.е. только hrf==location.href то тогда loadCheck(i+1); return false;

тогда бы и
...
if (norez==undefined)
{loadCheck(i+1); return false;}
...

тоже работало бы...хотя это выражение уже и не было бы нужным,т.к. результат есть всегда хотя бы один,где hrf=location.href

вобщем возможно ли вот для такого вида
function loadCheck(i){
 i = i || 0;
 var bquery = $("#ldF999").text().match(/([а-яёa-z]){4,}/gi);
 var query = bquery[i];
 $('#ressearch').show().html('<span id="searchload"><img src="/loader.gif" border="0"></span>');
 $.post('/load/', {query: query, a: 2},
 function(rez){
 window.count = 0;
 $(".newslink", rez).each(function(){
 window.count = window.count + 1;
 if (window.count > 5) return;
 var hrf = $(this).attr("href");
 var txt = $(this).text();
 if(hrf == location.href){var hrfs = '';}
 else {var hrfs = '<a href="'+hrf+'" class="newpotem">'+txt+'</a>';
 }
$("#searchload").hide().after(hrfs);
 });});}
 setTimeout("loadCheck()",1);

задать условие что при единственном результате где hrf == location.href будет выполняться loadCheck(i+1); return false;


Часовой пояс GMT +3, время: 02:47.