>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Проблемы с сайтами http://forum.mozilla-russia.org/viewforum.php?id=24 >Проблема со скриптами автокомплита на локальном вэб-сервере http://forum.mozilla-russia.org/viewtopic.php?id=25557 |
Tranclugator > 08-08-2008 23:12:08 |
Проблема: в текстовом поле страницы по мере ввода текста должен автоматически ниспадать список всех совпадающих доступных вариантов, полный список которых введен в исходный код вэб-страницы. Также эта страница использует скрипт "autocomplete.js". При работе с этой страницей через MS IE эти функции работают, а при работе через Firefox 2.0.0.16 и 3.0.1 (как и Опера 9.5) - дроп-даун список не появляется Исходный код сохраненной страницы и скрипт прилагаю (фамилии пациента, адрес и прочая личная инфа изменены на вымышленные!). ОС : WinXP HE SP2, Firefox 3.0.1 с одним дополнением в виде Сановской Java, java 6u6 Что за сайт: система электронных медицинских карт, созданная в виде локального вэб-сервер медицинского учреждения. Данная страница производит формирование специального рецепта на препарат, выписываемый в рамках системы ДЛО (дополнительного лекарственного обеспечения). Дроп-даун лист должен выводить список всех доступных для выписки по ДЛО препаратов и их лекарственных форм, ища совпадения по первым вводимым буквам. Например, вы ввели "А" и выпадает список с амлодипином и др. препаратами на букву А. При дальнейшем вводе список ограничивается совпадениями по 2, 3, 4-м первым буквам и т.д. Разработчики системы ("Витакарта" называется ) не смогли подсказать, в чем дело, хотя в учебной комнате ГорЗдрава стояли Firefox, как я помню . Я уже сломал мозг,копаясь в настройках Файрфокса, Оперы и IE, но как че ни меняй - результат один - в ИЕ работает, в остальных браузерах - нет Казалось бы, не проблема работать в ИЕ, ан нет - ИЕ переглючивает параметры страницы при каждой новой распечатке рецепта (говорят, это давнишняя неистребимая ошибка ИЕ, никак не связанная с вэб-узлом). Код страницы ввода рецепта не помещается на страницу, через загрузку не получается выложить - размер 170 кб . Но похоже, фокус в том, что файрфокс не может нормально подгрузить и выполнить скрипт autocomplete.js - вот он Выделить код Код:var matches = new Array(); var cur_sel = -1; var esc_hidden = false; var last_nav_key = false; var chosen = false; var keypad_blocked = false function getPlatf(obj) { while(obj&&!(obj.nodeName=="DIV"&&obj.className=="container")) obj=obj.parentElement; if(!obj) return null; var x=0, y=0, tg=obj; while(obj) { x+=obj.offsetLeft; y+=obj.offsetTop; obj=obj.offsetParent; } return {target: tg, x: x, y:y}; } function init(textbox, layer, width, height){ textbox.style.width = width+"px"; textbox.style.height = height+"px"; layer.style.width = (width-2)+"px"; layer.style.top = getPositionY(textbox)+height+"px"; layer.style.left = getPositionX(textbox)+"px"; } function getPositionX(obj) { var x=0; while(obj) { x+=obj.offsetLeft; obj=obj.offsetParent; } return x; } function getPositionY(obj) { var y=0; while(obj) { y+=obj.offsetTop; obj=obj.offsetParent; } return y; } function findMatches(textbox, data){ var str = textbox.value; matches = new Array(); for (var i=0; i<data.length; i++){ if (str.length<=data[i].length) for (var j=0; j<str.length; j++){ if (str.toLowerCase().charAt(j)==data[i].toLowerCase().charAt(j)) { if (j==str.length-1){ matches.push(data[i]); } } else break; } } matches.sort(); return matches; } function generateIds(textbox){ var id = new Array(); var _id = ""; for (var i=0; i<matches.length; i++){ _id = "row"+textbox.id+i; id.push(_id); } return id; } function selectItem(resLayer, textbox){ var bounds = matches.length; var chrcode = event.keyCode; var ids = generateIds(textbox); if (chrcode == 27){//escape key hide(resLayer); esc_hidden=true; return; } else esc_hidden=false; if (chrcode == 38){//up key last_nav_key = true; if (cur_sel>0){ cur_sel--; if (cur_sel!=-1) document.getElementById(ids[cur_sel]).style.background="#F6D5FA"; if (cur_sel!=bounds) document.getElementById(ids[cur_sel+1]).style.background="#E9F3F9"; textbox.value=document.getElementById(ids[cur_sel]).innerText; return; } } else if (chrcode == 40){//down key last_nav_key = true; if (cur_sel<bounds-1){ cur_sel++; if (cur_sel<=bounds){ document.getElementById(ids[cur_sel]).style.background="#F6D5FA"; if (cur_sel!=0) document.getElementById(ids[cur_sel-1]).style.background="#E9F3F9"; } textbox.value=document.getElementById(ids[cur_sel]).innerText; return; } } else if (chrcode == 13){//enter key hide(resLayer); last_nav_key=false; chosen = true; return; } else { last_nav_key=false; cur_sel=-1; chosen = false; return; } } function hide(resLayer){ resLayer.style.visibility = "hidden"; matches = new Array(); cur_sel=-1; } function cancelHiglight(textbox){ var ids = generateIds(textbox); for (var i=0; i<ids.length; i++) document.getElementById(ids[i]).style.background="#E9F3F9"; } function selectText(textbox_id, inner){ document.getElementById(textbox_id).value = inner; } function displayResults(textbox_id, resLayer, resDiv, data){ if (event.keyCode==38 || event.keyCode==40) return; if (document.getElementById(textbox_id).value!="" && !esc_hidden && !chosen){ resLayer.style.visibility = "hidden"; var arr = findMatches(document.getElementById(textbox_id), data); var rslt = ""; var tbb = "<table onmouseover=\"keypad_blocked=true; last_nav_key=false\" onmouseout=\"keypad_blocked=false\" width=\"100%\" cellpadding=0 cellspacing=0>"; var rwb1 = "<tr id=\"row"; var rwb2 = "\" onmouseover=\"cancelHiglight(document.getElementById('"+textbox_id+"')); cur_sel=-1; this.style.background='#F6D5FA'\" onmouseout=\"this.style.background='#E9F3F9'\">"; var rwe = "<\/tr>"; var clb1 = "<td onmouseover=\"document.getElementById('"+textbox_id+"').value=this.innerText\">"; var cle = "<\/td>"; var tbe = "<\/table>" if (arr.length>0){ rslt+=tbb; for (var i=0; i<arr.length; i++){ rslt+=rwb1+textbox_id+i+rwb2; rslt+=clb1; rslt+=arr[i]; rslt+=cle; rslt+=rwe; } rslt+=tbe; resDiv.innerHTML = rslt; resLayer.style.visibility = "visible"; } } else { matches = new Array(); resLayer.style.visibility = "hidden"; } } В чем грабли? Если необходимо, попробую выложить и код страницы, но придется вырезать из нее почти весь список препаратов, а то сообщение форума не держит такой большой код. |
ViRUS > 11-08-2008 02:27:25 |
Что пишет в консоли ошибок? ЗЫ: http://forum.mozilla-russia.org/upload.php
|
Tranclugator > 12-08-2008 01:44:36 |
При открытии файла ошибок не возникает, записи об ошибках появляются в момент набора текста в графе названия препарата, вот такие (сорри за русское название файла Рецепт): Ошибка: event is not defined Ошибка: event is not defined И все ошибки ссылаются на 77 или 137 строку, новые записи об ошибках появляются при вводе каждой новой буквы. Добавлено Tue Aug 12 01:47:30 2008 : |
Tranclugator > 12-08-2008 21:12:58 |
На рабочем компе та же ошибка |
arka > 13-08-2008 13:39:46 |
Потому что используется event - это не для FF. Тем таких уже было полно. Гугли event firefox |
Tranclugator > 13-08-2008 22:17:16 |
Надо же... А как же в учебной комнате FF стояли? То есть, никак FF не настроить под такой скрипт? Гуглить event мне бесполезно, так как я даже слова такого не знаю , и Java для меня - это просто красивое слово . Просто, если такая страница с FF никак не сможет правильно работать, то просто скажите, пожалуйста, мне об этом, чтобы я понял, что дальше мучаться нечего. Если все же какой-то способ есть, то хоть намекните, какой. |
arka > 14-08-2008 10:48:02 |
В нормальных браузерах это работать не будет. Расширение IETab вам в помощь - устанавливаем и работаем через него с кривыми разработками. |
Tranclugator > 14-08-2008 20:33:02 |
arka, Спасибо, похоже, что этот способ работает! Только называется это расширение, похоже, с пробелом: IE Tab |