2015-03-23 2 views
0

Я использовал PHP для создания HTML-страницы, которая компилирует список точек данных и выталкивает их в массив, объявляет массив в заголовке, а также echo - огромный список ввода формы объекты в тело. Список, с которым я работаю, составляет менее 15 000 строк, которые помещаются в 1 массив.Страница зависает, слишком много, чтобы искать

Я более или менее создал окно поиска, когда при размывании() предполагается, что действие должно выполняться, функция Javascript должна искать по массиву и скрывать непревзойденные параметры формы и отображать совпадения. Кажется, что это работает до 5000, но если я пропустил все элементы массива 15000, он зависает и зависает.

Я в настоящее время принимаю его на свободном месте в то время как я проверяю ... вот ссылка на фактическую страницу TEST PAGE that hangs up

Я в том числе фрагмента кода JS с вырезанным массивом таким образом Вы не Вам нужно прокручивать тысячи строк.

\t \t <script type="text/javascript" > 
 
\t \t \t 
 
\t \t \t var array_ICDDx = new Array('[ICD Code] Diagnosis','[001.0] Cholera due to vibrio cholerae','[001.1] Cholera due to vibrio cholerae el tor','[001.9] Cholera, unspecified','[002.0] Typhoid fever','[002.1] Paratyphoid fever A','[002.2] Paratyphoid fever B','[002.3] Paratyphoid fever C','[002.9] Paratyphoid fever, unspecified','[003.0] Salmonella gastroenteritis','[003.1] Salmonella septicemia','[003.20] Localized salmonella infection, unspecified','[003.21] Salmonella meningitis','[003.22] Salmonella pneumonia','[003.23] Salmonella arthritis','[003.24] Salmonella osteomyelitis',[...GOES ON FOREVER ~15000 ARRAY VALUES...]); 
 
\t \t \t 
 
\t \t \t function searchICDDx(ICDDx,line_start,line_end) { 
 
\t \t \t \t for (var a = line_start; a < line_end; a++) { 
 
\t \t \t \t \t var ICDDx_check = array_ICDDx[a].toLowerCase(); 
 
\t \t \t \t \t var Row = "R" + a; 
 
\t \t \t \t \t if (ICDDx_check.search(ICDDx) >= 0) { 
 
\t \t \t \t \t \t document.getElementById(Row).style.display = "block"; 
 
\t \t \t \t \t } 
 
\t \t \t \t \t else { 
 
\t \t \t \t \t \t document.getElementById(Row).style.display = "none"; 
 
\t \t \t \t \t } 
 
\t \t \t \t } 
 
\t \t \t \t if (line_end < array_ICDDx.length) { 
 
\t \t \t \t \t line_end += 1000; 
 
\t \t \t \t \t if (line_end > array_ICDDx.length) { line_end = array_ICDDx.length; } 
 
\t \t \t \t \t var timer = setTimeout(searchICDDx(ICDDx,a,line_end),100); 
 
// \t \t \t \t \t searchICDDx(ICDDx,a,line_end); 
 
\t \t \t \t } 
 
// \t \t \t \t else if (line_end >= array_ICDDx.length) { 
 
// \t \t \t \t \t clearTimeout(timer); 
 
\t \t \t \t \t return; 
 
// \t \t \t \t } 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t function searchICD() { 
 
\t \t \t \t var find_ICD = Coder.elements['ICD'].value; 
 
\t \t \t \t if (find_ICD != "") { 
 
\t \t \t \t \t document.Coder.Dx.value = ""; 
 
\t \t \t \t \t find_ICD = find_ICD.toLowerCase(); 
 
\t \t \t \t \t searchICDDx(find_ICD,1,1000); 
 
\t \t \t \t } 
 
\t \t \t } 
 

 
\t \t \t function searchDx() { 
 
\t \t \t \t var find_Dx = Coder.elements['Dx'].value; 
 
\t \t \t \t if (find_Dx != "") { 
 
\t \t \t \t \t document.Coder.ICD.value = ""; 
 
\t \t \t \t \t find_Dx = find_Dx.toLowerCase(); 
 
\t \t \t \t \t searchICDDx(find_Dx,1,1000); 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t 
 
\t \t </script>

Это не кажется, проблема с код не работает. Как я уже упоминал, если я ограничиваю поиск только 1000 значениями массивов, то это, похоже, работает, это массивное количество значений массива, которое убивает страницу.

Любые предложения? Спасибо заранее!

+2

Обработка больших наборов данных внутри браузера станет проблемой в какой-то момент, несмотря ни на что. Однако в вашем коде может быть потенциал для оптимизации. Прежде всего, вы не должны использовать 'search', который будет выполнять _правильное соответствие expression_, которое, насколько я вижу, вам не нужно. Вместо этого используйте 'indexOf'. – CBroe

+0

Во-вторых, применение 'toLowerCase' снова в каждом поиске может быть не самым быстрым способом - возможно, было бы лучше, если бы вы определили это значение один раз заранее и сохранили его как дополнительное свойство ваших записей. (Но поскольку это увеличит размер данных для хранения в памяти, это нужно было бы увидеть, если это действительно улучшит производительность.) Если оба эти действия не приведут к улучшению, вы можете дополнительно рассмотреть возможность использования _web workers_ для этого. – CBroe

+1

И, возможно, лучшей лучшей идеей может быть не пересылка этого количества данных клиенту в первую очередь - но вместо этого выполнить поиск на автокомплекте на сервере и передать только результаты этого клиенту. – CBroe

ответ

0

С помощью этого множества точек данных вы должны, вероятно, сделать это на сервере. Тем не менее, вы можете попробовать следующее:

  • вместо того, чтобы использовать для цикла (который полностью замерзает браузер до тех пор, пока не будет сделано), использовать setInterval, который проверяет новый результат каждые 5 мс или около того. Периодически проверяйте, были ли найдены все результаты, и очистите интервал, если это так. По-прежнему потребуется немного поиска, но не затормозит браузер.

  • поиск только до тех пор, пока вы не установили количество результатов (40 или около того) и сохраните последний индекс массива, который был обыскан. Дождитесь загрузки большего количества запросов, пока пользователь не прокрутит страницу вниз.

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

Обновление:, если вы не хотите, чтобы отображаемые элементы отображались до тех пор, пока вы не выполните поиск, вы не должны иметь никаких элементов на странице и добавить их, когда они соответствуют поиску. Это предотвращает первоначальное отставание, не позволяет вам изменять видимость каждого элемента и уменьшает количество элементов на странице (что вызывает проблемы).

+0

Спасибо за ответы. Моя кодировка довольно рудиментарна, в идеале я хочу, чтобы NONE из перечисленных элементов отображалось до начала поиска. Но когда я «скрываю» или «отображаю: нет» все элементы, которые страница зависает с самого начала от меня. –

+0

Я пытался изучить серверный поиск, например автозаполнение в поиске Google. Много всего, что я нашел, это использование mysql и поиск такой базы данных ... и я просто потерялся в направлениях и видео. Мои навыки в этом довольно слабы. –

+0

_ «В идеале я хочу, чтобы NONE из перечисленных элементов отображалось до тех пор, пока поиск не начался» _ - ну, тогда вы должны действительно заняться поисковым сервером, чтобы полностью избежать этой проблемы. – CBroe

0

Благодарим вас за все ваши замечания и предложения.

Я вернулся и вынул все записи, перечисленные в форме. Затем я создал JS список входных данных флажка на основе всех положительных результатов и element.innerHTML результатов. Массив по-прежнему является огромным списком на стороне клиента, через который JS ищет совпадения. Я обновил код в ссылке из моего исходного сообщения, чтобы показать более быстрый и рабочий результат.

\t \t <script type="text/javascript" > 
 
\t \t \t 
 
\t \t \t var array_ICDDx = new Array('[icd code] diagnosis','[001.0] cholera due to vibrio cholerae','[001.1] cholera due to vibrio cholerae el tor','[001.9] cholera, unspecified','[002.0] typhoid fever','[002.1] paratyphoid fever a',[...etc...]); 
 
\t \t \t 
 
\t \t \t function searchICDDx(array_Results,ICDDx,line_start,line_end) { 
 
\t \t \t \t for (var a = line_start; a < line_end; a++) { 
 
\t \t \t \t \t if (array_ICDDx[a].indexOf(ICDDx) >= 0) { 
 
\t \t \t \t \t \t array_Results.push("<span style='display:block' ><input type='checkbox' value='"+array_ICDDx[a]+"' >"+array_ICDDx[a]+"</span>"); 
 
\t \t \t \t \t } 
 
\t \t \t \t } 
 
\t \t \t \t if (line_end < array_ICDDx.length) { 
 
\t \t \t \t \t line_end += 1000; 
 
\t \t \t \t \t if (line_end > array_ICDDx.length) { line_end = array_ICDDx.length; } 
 
\t \t \t \t \t searchICDDx(array_Results,ICDDx,a,line_end); 
 
\t \t \t \t } 
 
\t \t \t \t else if (line_end >= array_ICDDx.length) { 
 
\t \t \t \t \t var string_Results = array_Results.join("\n"); 
 
\t \t \t \t \t document.getElementById("Results_here").innerHTML = string_Results; 
 
\t \t \t \t \t return; 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t function searchICD() { 
 
\t \t \t \t var array_Results = new Array(); 
 
\t \t \t \t var find_ICD = Coder.elements['ICD'].value; 
 
\t \t \t \t if (find_ICD != "") { 
 
\t \t \t \t \t document.Coder.Dx.value = ""; 
 
\t \t \t \t \t find_ICD = find_ICD.toLowerCase(); 
 
\t \t \t \t \t searchICDDx(array_Results,find_ICD,1,1000); 
 
\t \t \t \t } 
 
\t \t \t } 
 

 
\t \t \t function searchDx() { 
 
\t \t \t \t var array_Results = new Array(); 
 
\t \t \t \t var find_Dx = Coder.elements['Dx'].value; 
 
\t \t \t \t if (find_Dx != "") { 
 
\t \t \t \t \t document.Coder.ICD.value = ""; 
 
\t \t \t \t \t find_Dx = find_Dx.toLowerCase(); 
 
\t \t \t \t \t searchICDDx(array_Results,find_Dx,1,1000); 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t 
 
\t \t </script>

В прошлом у меня были плохие результаты с формами и innerHTML добавлены опции, которые я займусь в другой раз, когда я пытаюсь перенести этот код в более крупный проект.

Еще раз спасибо

Смежные вопросы