повторный autocomplete
Здравствуйте, уважаемые форумчане.
Осваиваю javascript и программирование в целом. Столкнулся со следующей задачей: при выводе автокомплитом списка из БД необходимо реализовать функцию просмотра полной строки при нажатии на один из результатов выдачи, без перезагрузки страницы. В приведенном ниже коде в автокомплите выводятся только id, тайтл и теги страниц; выводить всё содержимое строки для просмотра при количестве строк более 50 посчитал нерациональным способом (загружать страницу большим объёмом данных). В качестве решения предположил, что можно воспользоваться ещё раз методом автокомплит, запускаемым событием onclick, но с поиском значения в БД по выбранному id и выводом уже полной строки sql. Т.е. результаты первого поиска автокомплита остаются на странице, а второй поиск поочерёдно выводит данные в отдельный блок при нажатии на одну из строк-результатов первого поиска. Вопрос: как передать переменную (id) выбранной строки в другой обработчик автокомплита (в другую форму на index.php).
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Title</title>
<style type="text/css">@import url("style.css");</style>
<script src="jquery.js"></script>
<script>
$(document).ready(function(){
$("#query").keyup(function(){
var numChars = $(this).val().length;
if (numChars>=3){
var queryString = $(this).val();
$.post(
"search.php",
{
queryString: queryString
},
function(data){
if (data !=""){
$("#autocomplete").show();
$("#autocomplete").html(data);
}
else{
$("#autocomplete").show();
$("#autocomplete").html("<i>Нет результатов по введеному запросу)</i>");
}
}
);
}else if (numChars<3){
$("#autocomplete").hide();
} else if(numChars == 0){
$("#autocomplete").html("");
}
});
});
</script>
</head>
<body>
<input type="text" placeholder="Поиск" id="query" />
<div id="autocomplete"></div>
<div id="onclickautocomplete"></div><!--предполагаемый блок вывода второго автокомплита-->
</body>
</html>
Обработчик файла search.php
if(isset($_POST["queryString"])){
$connect = mysql_connect("localhost", "root", "");
mysql_select_db("testtwo");
mysql_query("SET NAMES cp1251");
$string = iconv("UTF-8","cp1251",$_POST["queryString"]);
$query = mysql_query("SELECT id,newtegs,title FROM dataz WHERE title LIKE '%$string%' ") or die (mysql_error());
if($myrow = mysql_num_rows($query) > 0){
$myrow = mysql_fetch_array($query);
do{
echo '<br>' .
"<table id='table'><tr><a href='#'>
<td id='id'>".$myrow[id]."</td>",
"<td id='newtegs'>".$myrow[newtegs] ."</td>",
"<td id='title'>".$myrow[title]."</td>
</a></tr></table>";
}
while ($myrow = mysql_fetch_array($query));
}
}
Благодарю, что уделяете время моему вопросу. |
Цитата:
|
как тогда реализовать выборку по конкретному условию одной записи без перезагрузки страницы на основе результатов автокомплита?
|
Автокомплит, а вообще есть русское более правильное название этому - живой поиск. Пусть результатом вашего поиска пусть будет таблица, а не куча таблиц, если не список:
//если search.php обрабатывает только ajax запросы, то условие if(isset($_POST["queryString"])){ } убрать
//здесь уж тогда нужна проверка наличия запроса со своей страницы
//после соединения выполнять выполнение определяемое ключом запроса, можно switch, можно и if()
switch(key($_POST)) {
case 'queryString': $string = addCslashes(iconv("UTF-8", "cp1251", mysql_real_escape_string($_POST["queryString"])), '\%_'); //перереводите базу в utf
$query = mysql_query("SELECT id,newtegs,title FROM dataz WHERE title LIKE '%$string%' ") or die ( 'Ошибка базы данных'); //нельзя вываливать ошибки SQL клиенту
if(mysql_num_rows($query)) {
//цикл do ... while увиденный в каком-то мультике здесь совсем не нужен
$t = '<table id="table">';
while($row = mysql_fetch_object($query)) $t .= '<tr data-ids="'.$row->id.'"><td>'.$row->id.'</td><td>'
.htmlspecialchars($row->newtegs).'</td><td>'
.htmlspecialchars($row->title).'</td></tr>';
exit($t . '</table>');
}
break;
case 'id': if($id = (int)$_POST['id']) {
//запрос на выборку записи по id
}
}
$myrow[newtegs] - то, что так работает, не означает, что так можно писать. Просто вашу ошибку РНР исправит сам, правильно $myrow['newtegs']. На клиенте при получении списка по поиску, можно так:
function(data){
if(!!data) {
$("#autocomplete").html(data)
.show()
.find('table')
.on('click', 'tr', function() {
$.post("search.php", {id : $(this).data('ids')}, function(data) {
//получение полной запрошенной записи
})
})
} else $("#autocomplete").html("<i>Нет результатов по введеному запросу)</i>").show();
}
|
Уважаемый laimas, благодарю вас за помощь и детальное пояснение.
Спасибо! |
| Часовой пояс GMT +3, время: 14:37. |