PDA

Просмотр полной версии : автодополнение с Ajax


NEFILIM
16.10.2006, 11:43
Люди кто может помогите сделать такую фичу как дополнение результатов ввода в <select> с базы даных.... Очень надо

madnet
16.10.2006, 13:45
Такие фичи хорошо описаны в книге

Ajax в действии
В сети ее легко найти, здесь например
http://www.rsdn.ru/res/book/web/ajax.xml

NEFILIM
16.10.2006, 14:46
спасибо но я вобще нихрена нережу в жаба скрипт у меня даже есть эта книга на столе но мне надо уже... а книгу придется читать с нуля и не только эту если есть гдето какиэто готовые экзамплы

Trinux
16.10.2006, 20:35
выкинь книгу по ajax и купи книгу по javascript. В частности тут тебе нужна инфа по DOM - Document Object Model.
если сильно надо и сам нихера не шаришь - пиши в личку конкретно что и как, как будет время - распишу.

madnet
17.10.2006, 10:51
Trinux, че у тя за такая нелюбовь к термину Ajax, не первый раз вижу.
Это всего лиш одно слово, которое заменяет, выучи JS DOM CSS асинхронные запросы.

NEFILIM
17.10.2006, 11:50
выкинь книгу по ajax и купи книгу по javascript
В принципе я так и делаю потому что шев сильно увлекся JS а я пишу на PHP

Trinux
17.10.2006, 13:56
Trinux, че у тя за такая нелюбовь к термину Ajax, не первый раз вижу.
Это всего лиш одно слово, которое заменяет, выучи JS DOM CSS асинхронные запросы.
потому что "ajax" стал модным и это сильно бесит. AJAX это не js, css, dom и прочие технологии. Это абривиатура юзания объекта xmlhttprequest на js.
А вот js, css2, dom и прочие технологии, это концепция web 2.0 проектов. Но никак не ajax.

Бесит что люди ставят ajax движки и считают себя модными и прочее. В обшем просто бесит.

ЭТО НЕ НЕЛЮБОВЬ к xmlhttprequest`у. Я рад этой технологии и изучаю я ее самостоятелно уже более года, у меня несколько своих движков, я разобрал все "беды" с кодировками и прочее. Просто мода эта тупая достала.

Так же достала мода на BMW. и многое еще чего. Это не значит что я не люблю BMW.

nerezus
17.10.2006, 18:25
Trinux, че у тя за такая нелюбовь к термину Ajax, не первый раз вижу.
Это абривиатура юзания объекта xmlhttprequest на js.
То, что обычно называют аяксом - это xmlhttprequest. Но это отнюдь не главная часть аякса.

А вот самое интеремное — имхо DOM.

Trinux
17.10.2006, 18:48
То, что обычно называют аяксом - это xmlhttprequest. Но это отнюдь не главная часть аякса.

А вот самое интеремное — имхо DOM.
DOM это очень далеко не ajax, ну очень далеко. DOM это объект документа, представление всей html страницы в виде дерева всех ее элементов и доступа к этому дереву через js. При чем тут ajax? DOM был описан лет 6 назад.

nerezus
17.10.2006, 19:15
Кстати. Слышал еще давно, что Трин говорил, про "не покупайте книги про аякс".
Неделю назад купил... лучше бы книгу Полю Дюбуа купил про БД. Ибо в книге про аякс была одна хрень.
Хороший справочник по Js все разрулит.
Или "Энциклопедия Xml" Холзнера. Все клиентские технологии(+ основы джавы) рассмотрены детально. Еще бы: 1100 страниц A4 мелким шрифтом.

Trinux
17.10.2006, 19:52
Кстати. Слышал еще давно, что Трин говорил, про "не покупайте книги про аякс".
Неделю назад купил... лучше бы книгу Полю Дюбуа купил про БД. Ибо в книге про аякс была одна хрень.
Хороший справочник по Js все разрулит.
Или "Энциклопедия Xml" Холзнера. Все клиентские технологии(+ основы джавы) рассмотрены детально. Еще бы: 1100 страниц A4 мелким шрифтом.
насчет справочника по JS - вот это правильно. У самого на 1500 страниц A4, все досконально рассмотрено.

NEFILIM
18.10.2006, 11:12
Я поддержываю Trinux мне тоже кажется что технологии которые просто входят как "модно" ничо иное как просто хорошо продуманый алгоритм и ничо нового там грубо сказать нет... например я на старой роботе розработал (даже неподозревая того) свою систему MVC, когда пришел на нынешнюю фирму меня начили лечить что надо розобраться в Model View Controler я от одного названия испугался...

NEFILIM
18.10.2006, 11:44
ну то как знатоки Js кто то поможет мне такое сделать???

[hidden]
19.10.2006, 06:41
Обязательно SELECT? Предлагаю просто текстовое поле меню выбора ...если будет. Если этого хватит (посмотри хотя бы на http://homefarm.ru ) - готов помочь.
Если нет.... то тоже готов=)

[hidden]
19.10.2006, 11:45
Короче, вот примерный вариант действий.

Файл get.php - скрипт, который будет брать данные из БД:


<?
// ACHTUNG!!! В скрипте присутствует потенциальная уязвимость!
// данные JS поступают в кодировке UTF-8, если у тебя БД в той же кодировке, можно оставить.
// У меня база в cp1251, приходится переконвертировать.
$req_ = iconv("utf-8", "windows-1251", $req);

mysql_connect("localhost", "root");
mysql_select_db("db_name");

$response = "";

$res = mysql_query("SELECT `name` FROM `table` WHERE `name` LIKE '" . $req_ . "%'");

while($row = mysql_fetch_array($res)) {
$name = $row['name'];

// как видно, скрипт выдает значения, обрамленные <option>
$response .= "<option>" . $name . "</option>";
}

print($response);
?>


А это файл ajax.html, в котором размещается логика "приложения" и верстка:


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>select check</title>

<script language="javascript">

var req;
var mouseOver;
var choose;

// Собстно, сердце AJAX
if(window.XMLHttpRequest)
req = new XMLHttpRequest();
else
if(window.ActiveXObject)
req = new ActiveXObject("Microsoft.XMLHTTP");

// эти функции (omo и omov) служат только одной цели - при щелчке мыши вне списка список должен закрыться, так? Придется отслеживать положение мыши.
function omo() {
mouseOver = false;
}

function omov() {
mouseOver = true;
}

// та самая проверка клика...
document.onclick = function() { // блядь, во жесть...
if(!mouseOver) {
document.getElementById('div_res').style.display = "none";
}
}

// кликнули по списку (выбрали какое-то значение) - копируем его в текстовое поле и в переменную choose.
function selectfield_click() {
document.getElementById('textfield').value = document.getElementById('selectfield').options[document.getElementById('selectfield').selectedInd ex].text;
document.getElementById('div_res').style.display = "none";
choose = document.getElementById('textfield').value;
}

function textfield_change() {
var val = document.getElementById("textfield");

mouseOver = true;

if(req) {
try {
req.open('GET', 'http://myserver/get.php?req=' + encodeURI(val.value), true); // кодируем символы в UTF-8, иначе скрипту передастся бред.

req.onreadystatechange = function() {
if(req.readyState == 4) {
if(req.responseText.length > 10) {
div_res.style.display = "";
div_res.innerHTML = "<select name='selectfield' id='selectfield' size='4' onMouseOver='javascript:omov();' onMouseOut='javascript:omo();' onClick='javascript:selectfield_click();' multiple>" + req.responseText + "</select>";
}
else {
div_res.style.display = "none";
}
}
}
}
catch(err) {
alert(err);
}

// посылаем запрос.
req.send(null);
}
}

</script>
</head>

<body>
<!-- в HTML нет элемента под названием "список", который к тому же мог бы редактироваться - или я просто не знаю, если знаете - скажите, буду благодарен; поэтому можно схитрить - поставить текстовое поле, а под ним - select с параметром multiple, что значит что список будет скроллируемый, но всегда открытый. -->
<!-- теперь надо подобрать шрифт и размер поля, а так же подумать о максимальной длине возвращаемого значения из БД. -->
<input type='text' id='textfield' size='20' onBlur='javascript:omo();' onKeyUp='javascript:textfield_change();'>

<!-- изначально слой невидим, положение его "относительно" - то есть он будет сдвигать остальные элементы на странице. Это некрасиво, рекомендую сделать position:absolute, но для примера достаточно и этого. -->

<div style='display:none;position:relative;' id='div_res'></div>
</body>

</html>


// Я не думаю, что это идеал, но это хоть что-то...

SMiX
19.10.2006, 12:25
Насчет скрипта на php: во-первых, переменную $req надо сначала брать из $_GET['req']; воизбежание ошибок при отключенной REGISTER_GLOBALS, во-вторых, ;куй_ надо фильтровать, т.к. там sql-инъекция, явная, никакая не "потенциальная", ну и в-третьихя, это мелочь, но все же: в данном случае вместо mysql_fetch_array используй mysql_fetch_assoc, т.к. при таком использовании первой, без доп. параметров, генерятся еще помимо элементов $array['name'], элементы $array[номер].