Показать сообщение отдельно
  #1 (permalink)  
Старый 10.08.2014, 14:01
Профессор
Посмотреть профиль Найти все сообщения от newobject
 
Регистрация: 10.07.2014
Сообщений: 145

помогите соптимизировать алгоритм для V8
Проблема наблюдается только на V8. На слабом железе при быстром вводе наблюдается зависание инпута. Буквы не печатаются, а потом выскакивают разом по нескольку штук. Также, когда несколько раз жмешь бекспейс. Мое предположение, изначально, было в том, что при вводе следующего символа продолжает выполняться цикл внутри функции search, отсюда и тормоза. Я добавил что-то типа прерывания, однако ситуация не изменилась. Помогите, пожалуйста.
search=function(pattern){
   var out=[]
   var re=new RegExp(pattern, "i")
   var current_flag=window.flag
   for(var i=0; i<base.length; i++){
      if(current_flag!==window.flag) return;//вот тут прерывание
      if(base[i].match(re)) {
      base[i]=base[i].replace(/((\d{4} \d{2}-\d{3})|(\d{4} \d{2}-\d{3} \d{1}-\d{2}-\d{2}))$/, "<b>$1</b>")
      out.push(base[i])
   }
 }
return out
}

firstSearch=function(){
   d.innerHTML=""
   input.style.color=null
   var out=search(input.value)
   if(out.length<1) return secondSearch()
   var str=out.join("<br><br>")
   d.innerHTML=str
}

secondSearch=function(){
   input.style.color="red"
   d.innerHTML="Нет результатов для <b>"+input.value+"</b>"
}
onload=firstSearch
input.oninput=firstSearch
input.focus()
onkeydown=function(){input.focus(); window.flag=new Date().getTime()}


UPD:
d -- это див на странице
input -- input на странице
base -- массив ~900 строк

UPD2:
Вот возможная причина:
Насколько я себе это представляю, js однопоточен, и когда я ввожу следующий символ в input, он не может сразу отреагировать, не дождавшись завершения предыдущего поиска. Чтобы прервать этот цикл, внутри search, я устанавливаю флаг на событие нажатия клавиши, если следующяя клавиша была нажата, условие выполняется и мы выходим из цикла на текущей итерации. Это было мое предположение, но не помогло. Похоже я лоханулся в том, что событие нажатия само по себе не может наступить, не дождавшись выполнения цикла, поэтому пока цикл не выполнится, прерывание лфаг не изменится, вот в чем ошибка наверное. Но как это фиксить -- хз

Последний раз редактировалось newobject, 10.08.2014 в 14:53.
Ответить с цитированием