|
Тема
|
бързо търсене в текстово поле
|
|
Автор |
putnik (непознат
) |
Публикувано | 10.02.09 10:17 |
|
Привет на всички !
Имам скромен формуляр, в който едно от полетата е текстово и съдържа име. Искам при попълването, когато потребителя въведе символ в това поле да му се появи подсказка, която да показва записано вече име, започващо с този символ (разбира се ако има такова в базата). И ако има такова име, то потребителя просто да го избере от подсказката, а не да го дописва, а ако няма - да може да го въведе в полето.
Базата данни е на MySQL и връзката с нея е чрез РНР.
Бихте ли ми дали идеи за решението на този проблем ?
Благодаря предварително
| |
Тема
|
Re: бързо търсене в текстово поле
[re: putnik]
|
|
Автор |
croesus (?!?) |
Публикувано | 12.02.09 19:56 |
|
Не е толкова лесно, както изглежда, даже да призная (понеже съм го правил няколко пъти) си е направо кошмар ако полетата са повече от 1. Използва се AJAX. Първо в полето на събитието "onkeyup" (точно това, а не onkeydown onkeypress) закачаш функция, която трябва да изглежда по подобен начин:
if (!httpReq)
{
httpReq = createRequestObject ();
}
httpReq.open("GET", "receiver.php?req=hint&qry=" + txtField, true);
httpReq.onreadystatechange = loadHint;
httpReq.send(null);
Където createRequestObject () ти е създало HTTPRequest. Тук няма да прилагам код, защото читавия който работи на разнообразни браузъри е доста обемен.
След това във въпросния receiver.php файл си правиш заявка към MySQL базата и резултата връщаш например в този вид:
hint1||hint2||hint3||hint4 Аз ползвам обикновено разделители "||", но ти ако искаш ползвай други или връщай като XML резултата.
След това върнатия резултат се обработва от javascript:
function loadHint ()
{
if (checkReadyState (httpReq))
{
if (httpReq.responseText)
{
var hintUl = document.getElementById ("ulHint_" + hintId);
var tmpLi;
txtHints = httpReq.responseText.split ("||");
//alert (txtHints.length);
for (var i = 0;i < txtHints.length;i++)
{
tmpLi = document.createElement ("LI");
tmpLi.innerHTML = txtHints[i ] ;
tmpLi.className = "cHintVisible";
try
{
tmpLi.addEventListener("click", useHint, false);
}
catch (e)
{
tmpLi.attachEvent("onclick", useHint);
}
hintUl.appendChild (tmpLi);
}
hintUl.style.zIndex = 2;
}
}
}
С две думи: под полето имам сложен един UL, с един единствен LI на който е зададено display:none.
След като върнатия резултат е сплитнат в редица горната функция създава на всеки член по един UL елемент и го прави видим.
Дотук с показването. Оттук насетне имаш функцията useHint, която "използва" подсказките - като кликнеш на някоя от тях другите изчезват а съдържанието на полето става като нея. После - за да е читаво подсказването трябва ако юзъра излезе от полето без да е избрал някоя от подсказките те да се скриват. Тук вече навлизам в тъмните дебри на умопомрачителния Javascript защото аз съм решил проблемите оттук на сетне с setInterval и clearInterval, но за тяхната читавост не мога да гарантирам.
В общи линии въпросния проблем си е доста сложен и изисква доста напъване с php, javascript, css и даже html.
Късмет
| |
Тема
|
Re: бързо търсене в текстово поле
[re: croesus]
|
|
Автор |
putnik (непознат
) |
Публикувано | 12.02.09 21:15 |
|
благодаря ти за идеята !
аз се хванах да сътворя нещо с Javascript и php, но резултатите никак не ми харесват все още.
Струва ми се, че скоро няма да си реша проблема
| |
Тема
|
Re: бързо търсене в текстово поле
[re: putnik]
|
|
Автор |
Viper X (just a snake...) |
Публикувано | 15.02.09 20:52 |
|
бих ти препоръчал да използваш готово решение от клиентската страна \javascript\
това, което търсиш е autocomplete, ползвай гугъл и ще намериш.. аз съм ползвал отдавна някакви готови решения и не помня точно как се казваха, така че конкретно не мога да ти препоръчам, но експериментирай, дори и 1 ден да загубиш в разглеждане на различни такива, пак ще е по-бързо от колкото да си го пишеш сам
-------------
КЗЛ
| |
Тема
|
Много ти благодаря
[re: Viper X]
|
|
Автор |
putnik (непознат
) |
Публикувано | 19.02.09 00:04 |
|
удари право в целта с това !
Наистина има доста функции в решението, което намерих, обаче бързо ги адаптирах към конкретните неща при мен и сега всичко си работи през клиентската страна.
Жив и здрав да си !!!
| |
|
|
|
|