Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха информатор 3.1
Еще более удобное оповещение о флуде!

Краснодарское время: 25 Май, 2012, 09:17:00

Страниц: [1] 2 3 ... 20
Печать
Автор Тема: Интерактивный select без перезагрузки страницы  (Прочитано 30525 раз)
0 Пользователей и 1 Гость смотрят эту тему.
zaxar    ↓ 
07 Август, 2007, 12:24:52
НЕ ХУЕТА! ХУЕТА!
Группа: Жмурики

Карма: 4
Сообщений: 29
Сила слова: 13.79

В последнее время часто спрашивают, как сделать «интерактивный select». Это когда есть два списка, и набор вариантов во втором списке зависит от того, что выбрано в первом. При этом, разумеется, все это должно происходить без перезагрузки страницы.
 
Все это можно реализовать на чистом JavaScript, перечислив необходимые параметры в скрипте. Но что делать, если данные хранятся где-нибудь в базе или в другом месте? Тогда без дополнительного запроса на сервер не обойтись. Тогда нужно написать отдельный скрипт на PHP, который будет возвращать нужные данные, и делать к нему отдельный запрос без перезагрузки страницы.
 
Делается это при помощи технологии AJAX.
 
А мы рассмотрим «утилиту» для создания AJAX приложений — JsHttpRequest.
 
Подробную информацию, а также исходные коды можно найти на странице http://dklab.ru/lib/JsHttpRequest/
 
Жмите «Скачать исходные коды». Из скачанного архива нам понадобятся два файла: JsHttpRequest.js и JsHttpRequest.php. Как нетрудно догадаться, первый подключается к странице, откуда будет производиться запрос, а второй — к PHP-скрипту.
 
Прежде чем начать, рассмотрим принцип действия. В странице, с которой идет запрос, нужно написать функцию на Javascript (предварительно подключив скачанную билиотеку). Эта функция как раз и будет посылать запрос на сервер и получать результат.
 
Эта функция будет вызываться при помощи события onchange тега select.
 
Схема такая: при изменении варианта в select срабатывает функция, посылает запрос на сервер, при этом в запросе передается то, что выбрано в select`e. PHP-скрипт на сервере, в зависимости от того, что было выбрано, подготавливает необходимый HTML-код другого select`a (да и не только select`a, а вообще, всего, что угодно), возвращает подготовленный HTML-код, и наша функция выведет этот код в нужное место.
 
Что за «нужное место»? Все просто. На своей странице мы вставляем тег <div> с идентификатором, например, "result", в то место, где должен появиться второй select, а в функции указываем этот самый идентификатор.
 
Теперь перейдем от слов к делу. Напишем пример сценария выбора сотового оператора в зависимости от страны.
 
Пишем страницу select.php
 
HTML
<script src="JsHttpRequest.js"></script>
 
<!-- Здесь мы подключили библиотеку. А теперь пишем функцию, которую назовем doload() -->
 
<script>
function doload(value){
var req=new JsHttpRequest();
req.onreadystatechange=function(){
if(req.readyState==4) document.getElementById("result").innerHTML=req.responseText;}
req.open(null,"select2.php",true);
req.send({country:value});}
</script>
 
<!-- Нетрудно догадаться, что мы сделали. Смотрите: ниже мы объявим тег select, в котором пропишем вызов функции doload с параметром this.value, то есть с выбранным в select`e значением. А вышенаписанная функция посылает запрос в скрипт select2.php и передаст ему значение country=value. Затем результат выведет в элемент с id=result. Итак, поехали... -->
 
<!-- Создаем форму -->
 
<form action="sript.php" method="POST">
 
<!-- Теперь пихаем в нее первый select -->
 
<select name="country" onchange="doload(this.value);">
<option value="no" selected>Выберите страну...</option>
<option value="russia">Россия</option>
<option value="ukraine">Украина</option>
</select>
 
<br><br>
 
<!-- Вставляем тэг с нашим идентификатором, вместо которого у нас будет появляться второй select -->
 
<div id="result"></div>
 
<br><br>
 
<!-- Теперь вставляем кнопку и закрываем форму. -->
 
<input type="submit" value="Отправить">
 
</form>

Все. Готово. Теперь, если открыть эту страницу и повыбирать разные значения в select`e, то... конечно же, получим ошибку, потому что у нас нет скрипта select2.php, в который мы передаем данные. Чтож, займемся его созданием.
 
PHP
<?
require("JsHttpRequest.php"); //Подключаем библиотеку
$JsHttpRequest=new JsHttpRequest("windows-1251"); //Создаем экземпляр класса, указываю рабочую кодировку.
 
//Далее все просто. В зависимости от выбранного параметра в первом select`e, заполняем переменную $html необходимым кодом.
 
switch($_REQUEST["country"]):
 
//Поехали...
 
case "russia":
$html="<select name=\"provider\">
<option>МТС</option>
<option>Билайн</option>
<option>Мегафон</option>
</select>"
;
break;
 
// С Россией разобрались. Переходим к Украине
 
case "ukraine":
$html="<select name=\"provider\">
<option>KievGSM</option>
<option>UKRGSM</option>
</select>"
;
break;
 
//С Украиной тоже разобрались. Далее можно понапихать еще чего-нибудь (не забывая редактировать первый select в первом файле). Но мы пока закончим на этом.
 
default: $html=null;
endswitch;
 
//В общем-то, все. Теперь просто выводим переменную $html, которую успешно "поймает" наша функция doload().
 
echo $html;
?>

Вот теперь готово.
 
Как видите, HTMl-код второго select`a мы забиваем непосредственно в программу. Естественно, такое поведение не является обязательным. Ничего не мешает брать данные, например, из базы и подставлять их в нужное место. Я не буду расписывать, как это делается, так как эта тема выходит за рамки данной статьи.
 
Так же я не буду расписывать, как навести «марафет». Например, как грамотно расположить элементы, чтобы ничего не разъезжалось и т.д. (по той же причине).
 
Надеюсь, что статью писал не зря и она Вам поможет.
 
Успехов!
 
Автор статьи: Байдюк Захар
Автор библиотеки JsHttpRequest: Котеров Дмитрий
« Последнее редактирование: 07 Август, 2007, 02:13:09 от zaxar » Записан

if($today=="day of zarplata") $i_am=":)";
dimitr    ↓ 
13 Октябрь, 2007, 07:26:59 , спустя 66 дней 19 часов 2 минуты 7 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 1
Сила слова: 0

А каким образом выдрать переменной provider, в файле script.php?
Записан
zaxar    ↓ 
16 Октябрь, 2007, 03:21:10 , спустя 3 дня 7 часов 54 минуты 11 секунд
НЕ ХУЕТА! ХУЕТА!
Группа: Жмурики

Карма: 4
Сообщений: 29
Сила слова: 13.79

Text
echo $_POST["provider"];
Записан

if($today=="day of zarplata") $i_am=":)";
FOBOS    ↓ 
12 Апрель, 2008, 03:57:41 , спустя 179 дней 36 минут 31 секунду
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 1
Сила слова: 0

zaxar, хорошая статья!
Сделал в такой стилистике, только с базой. Только возникла такая ситуация: в моей задаче от значения в селекте зависят несколько (3,4) значения на форме в виде лейбл-ов, которые динамически меняються при смене опшена у селекта. Связь один селект + один лейбл я сделал, как лучше сделать связь к примеру один селект с 3-мя лейбл-ами к примеру?... или как лучше передать эти значения?
 
Пока сделал несколько функций долоад , которые обрабатывают разные запросы с файлов и при ончейнже селекта вызывается несколько функций аякса.... но это как то не очень красиво, т.к. избыточный код появляется. Ещё вопрос: возможна ли заместь req.open(null,"select2.php",true);
вызов функции которая осуществляет обработку, т.е. к примеру в select.php находятся функции запросы к базе, и я вызываю в каждой функции аякса doload отдельную функцию из файла select.php... ?
Зарание спасибо.
« Последнее редактирование: 12 Апрель, 2008, 04:17:29 от FOBOS » Записан
adw0rd    ↓ 
12 Апрель, 2008, 10:42:46 , спустя 6 часов 45 минут 5 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17633
Сила слова: 1.67

Ещё вопрос: возможна ли заместь req.open(null,"select2.php",true);
конечно поменять можно
req.open(null,"tra-ta-ta.php",true);
почитай http://dklab.ru/lib/JsHttpRequest/, там все доступно для понимания :)
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
Alco    ↓ 
17 Декабрь, 2008, 12:51:35 , спустя 248 дней 15 часов 8 минут 49 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 21
Сила слова: 0

<form action="sript.php" method="POST"> что нужна написать в ентом файле?
Записан
adw0rd    ↓ 
17 Декабрь, 2008, 12:57:34 , спустя 5 минут 59 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17633
Сила слова: 1.67

Alco, это тебе решать, сюда придут данные из формы по сабмиту...
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
DmityrV    ↓ 
03 Апрель, 2009, 07:00:49 , спустя 107 дней 5 часов 3 минуты 15 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 2
Сила слова: 0

Хорошая статья но вот непойму как сделать если нужно чтоб было 3 и более зависимых селекта на странице.. если не трудно можно привести пример, и ещё допустим на сервере идёт большая выборка с таблицы как сообщить об этом пользователю - типа : подождите идёт загрузка..
« Последнее редактирование: 03 Апрель, 2009, 07:04:45 от DmityrV » Записан
NRG    ↓ 
03 Апрель, 2009, 07:06:15 , спустя 5 минут 26 секунд
НЕ ХУЕТА! ХУЕТА!

Headshot!MultiKill!
Группа: нинзя

Карма: 777
Сообщений: 4700
Сила слова: 16.81

как сообщить об этом пользователю - типа : подждите идёт загрузка
можно по разному.
можно точечки рисовать, можно рисунок отдавать аля spinner.gif .....
все зависит от диза
Записан

Буратино дрочил, дрочил и сгорел
Java и JavaScript это абсолютно разные вещи !!!
Господа, вы хуйня.
девушки краснели, отворачивались но порнуху продолжали смотреть
DmityrV    ↓ 
03 Апрель, 2009, 07:10:37 , спустя 4 минуты 22 секунды
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 2
Сила слова: 0

можно по разному.

Можно пример с кодом если не трудно, я понимаю что можно надпись можно точки... расмотрим вариант с надписью например..
Записан
NRG    ↓ 
03 Апрель, 2009, 07:23:18 , спустя 12 минут 41 секунду
НЕ ХУЕТА! ХУЕТА!

Headshot!MultiKill!
Группа: нинзя

Карма: 777
Сообщений: 4700
Сила слова: 16.81

Javascript
$.ajax({type: "GET", url:'/dir/ajax.file.php?param_1='+param_1+'&param_2='+param_2,
            beforeSend: function(){
                                   /* здесь ставиш картинку(точечки) */
            },
            complete: function(){
 
            },
            success:function(data) {
                                   /* здесь убираешь картинку(точечки) */
            },
            error:function(){
                console.log('Some error happened');
            }
    });

подробнее на http://docs.jquery.com/Ajax
Записан

Буратино дрочил, дрочил и сгорел
Java и JavaScript это абсолютно разные вещи !!!
Господа, вы хуйня.
девушки краснели, отворачивались но порнуху продолжали смотреть
NRG    ↓ 
03 Апрель, 2009, 07:24:11 , спустя 53 секунды
НЕ ХУЕТА! ХУЕТА!

Headshot!MultiKill!
Группа: нинзя

Карма: 777
Сообщений: 4700
Сила слова: 16.81

удачи
Записан

Буратино дрочил, дрочил и сгорел
Java и JavaScript это абсолютно разные вещи !!!
Господа, вы хуйня.
девушки краснели, отворачивались но порнуху продолжали смотреть
Juicy    ↓ 
13 Апрель, 2009, 02:36:43 , спустя 9 дней 19 часов 12 минут 32 секунды
НЕ ХУЕТА! ХУЕТА!

Карма: 1
Сообщений: 14
Сила слова: 7.14

Здравствуйте! Статья отличная, как раз то,что нужно!
Я еще совсем новичок в этом деле, так что не ругайтесь, если что-то элементарное спрошу)))
Вытащить данные в первом select-е из 1 таблицы удалось. У меня такой вопрос: теперь нужно чтобы во втором select-е вышли данные из 2 таблицы (отсортированные по ID первого списка).
Записан
adw0rd    ↓ 
13 Апрель, 2009, 02:56:23 , спустя 19 минут 40 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17633
Сила слова: 1.67

Juicy, код в студию, посмотрим - подскажем
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
Juicy    ↓ 
13 Апрель, 2009, 03:04:24 , спустя 8 минут 1 секунду
НЕ ХУЕТА! ХУЕТА!

Карма: 1
Сообщений: 14
Сила слова: 7.14

Это то что в select2.php:
PHP

$db = mysql_connect ("localhost", "root", "qazxcvb");
mysql_query ("set character_set_client='cp1251'");
mysql_query ("set character_set_results='cp1251'");
mysql_query ("set collation_connection='cp1251_general_ci'");
mysql_select_db("ales_tech",$db);
 
PHP

require("JsHttpRequest.php");
$JsHttpRequest=new JsHttpRequest("windows-1251");
switch($_REQUEST["country"]):
 
case "0":
$html="<label name=\"provider\">
$result1 = mysql_query("
Gr1_Name FROM sub_grlev1 WHERE Gr1_ID like '0%'");
$myrow1 = mysql_fetch_array($result1);
do
    {
printf ("
ID: %s  %s<br>",$myrow1['Gr1_ID'],$myrow1['Gr1_Name']);
    }
 while ($myrow1 = mysql_fetch_array($result1));   
</label>"

break;
 
case "1":
$html="<label name=\"provider\">
$result1 = mysql_query("
Gr1_Name FROM sub_grlev1 WHERE Gr1_ID like '1%'");
$myrow1 = mysql_fetch_array($result1);
do
    {
printf ("
ID: %s  %s<br>",$myrow1['Gr1_ID'],$myrow1['Gr1_Name']);
    }
 while ($myrow1 = mysql_fetch_array($result1));
</label>"

break;
 
default: $html=null;
endswitch;
 
Записан
Страниц: [1] 2 3 ... 20
Печать
 

Перейти в:  

Этот топик скрыли: adw0rd, artoodetoo, mario