При создании компонент интерфейса часто нужен AJAX. Например - SELECT с подгружающимся списком, поле с автозаполнением, дерево с подгружающимися узлами и т.п.
Эта статья посвящена конкретному примеру удобной и универсальной реализации AJAX для компонента интерфейса. Она дает общие рамки, можно даже сказать "фреймворк" для создания таких виджетов.
Например, рассмотрим селект, загружающий данные с сервера. С точки зрения AJAX он почти ничем не отличается от подгружающегося дерева или таблицы.
Общий поток выполнения при AJAX-подгрузке данных, начиная от пустого селекта:
Список телодвижений при загрузке:
Подготовить компонент для загрузки. Для нас - очистить селект
Включить индикацию AJAX (loading...)
Отправить асинхронный вызов
Получить ответ сервера. Обработать ошибку, если она произошла.
Использованы стандартные методы работы с DOM (new Option).
onLoadError(error)
Обрабатывает любые ошибки. Объект error должен содержать свойство errcode - код ошибки, например "timeout" или "15541" и, дополнительно, может предоставлять более подробное описание ошибки в свойстве message.
В нашем примере - выдает форматированное сообщение об ошибке.
Следующие два метода являются коллбэками для AJAX-запроса.
onSuccess(data)
Вызывается при успешном выполнении AJAX-запроса, получает прибывшие данные. Функция $.ajax автоматически интерпретирует их как JSON.
Чтобы сообщить о произошедшей ошибке, серверу достаточно передать, например, такой ответ:
{
errcode: 500,
message: "Апдейт базы данных. Повторите запрос через 10 минут"
}
Обратите внимание на последовательность вызовов. Если все в порядке, то сначала вызывается обработка данных onLoaded - и только потом отключается индикация showLoading(false), чтобы посетитель увидел сразу заполненный селект.
Если произошла ошибка - удобнее сделать наоборот: сначала убрать индикацию загрузки, а затем вывести сообщение.
onAjaxError(xhr,status)
Коллбэк для ошибки при AJAX-запросе. Получает проблемный XmlHttpRequest и статус.
Вызов $.ajax автоматически интерпретирует ответ сервера как JSON - и если с этим проблемы, то хотя XmlHttpRequest выполнился успешно, но $.ajax вызывает коллбэк для ошибки и ставит status="parsererror".
Удобно то, что где бы ни произошла ошибка: во время выполнения XmlHttpRequest-запроса, или на сервере, или при разборе JSON - вызовется единый обработчик onLoadError.
Можно поподробнее насчет добавления CSS-класса к родительскому элементу select'а? Как сделать его неактивным в начале работы, когда кнопка еще не нажата?
У меня вот другая проблема. Не могу заставить работать этот пример в модальном окне facebox. Илья, подскажите пожалуйста путь решения или в каком направлении копать?
Недавно делал загрузку опшенов с сервера. Одному комбобоксу по воле судьбы полагалось 24000 оных. Вставка через дом происходила немыслимо долго в IE8 (после минуты ждать не стал). В итоге пожертвовал траффиком и идеологическими соображениями, стал грузить готовый html (строку с опшенами) и использовать вставку через innerHTML, это отрабатывает почти мгновенно.
ребят, у меня проблема. Мне нужно как то установить соединение клиента с сервером что получать текстовые обновления на экран для первого. Первое что пришло в голову это сделать так чтобы клиент каждые 5 сек запрашивал у сервака информацию об обновлении, отсюда трафик лишний. Вопрос, как сделать так чтобы при появлении обновления сервак сам отправил клиенту данные? это вопрос синхронизации(асинхронизации), или какие то широковещательные посылки должны быть, я хз. Кто понял о чём я ,отзовитесь плиз!
$("#los_save").click(function ()
{
/*
var data1 = $('#faz1').val();
var data2 = $('#faz2').val();
var data3 = $('#faz3').val();
var data4 = $('#faz4').val();
......
var data15 = $('#faz15').val();
*/
var fl=0;
var fl2=15;
for (var i = fl; i <= fl2; i++)
{
var data[i] = $("#faz[i]").val(); /// ???
var arr = ["data[i]", i, true]
}
$.ajax({type: "POST",url: "proba.php", data:"arr", });
});
'#faz1' - id input. Подскажите как правильно написать $("#faz[i]").val() ?
AJAX (Asynchronous JavaScript and XML) позволяет отправлять запросы к серверу и получать данные асинхронно, fnf что делает веб-страницы более интерактивными.
спасибо хорошая статья
спасибо
Сюда бы еще архивчик в конце со всеми исходниками, и было бы вообще просто супер.
А как сделать options.php что бы он возвращал массив в стиле js?
Можно использовать кодировщик в JSON. При этом для windows-1251 лучше кодировать самому, а в UTF-8 можно из PECL взять.
Данные возвращаются в непонятной кодировке
Для работы с аяксом необходимо использовать только UTF, к сожалению. Сам от этого страдаю, все сайты в 1251 сделаны.
Ну так iconv есть для этого. Сам им все строки перегоняю между браузером и БД.
Можно поподробнее насчет добавления CSS-класса к родительскому элементу select'а? Как сделать его неактивным в начале работы, когда кнопка еще не нажата?
Не пойму, почему не работает тогда код:
Как заставить это работать?!
Почему не работает? - очень даже работает. Проверьте в файле ajaxselect.js в строках:
пути к файлам options.php и error.php
У меня вот другая проблема. Не могу заставить работать этот пример в модальном окне facebox. Илья, подскажите пожалуйста путь решения или в каком направлении копать?
Недавно делал загрузку опшенов с сервера. Одному комбобоксу по воле судьбы полагалось 24000 оных. Вставка через дом происходила немыслимо долго в IE8 (после минуты ждать не стал). В итоге пожертвовал траффиком и идеологическими соображениями, стал грузить готовый html (строку с опшенами) и использовать вставку через innerHTML, это отрабатывает почти мгновенно.
А как реализовать подгрузку данных сразу а не по нажатию на кнопку ?
$(function(){
/* здесь запускаем подгрузку */
});
или window.onload/DOMContentLoaded
Вот так работает, правда тока в IE6 =))
options.php :
<?php
$result='{1:"Дыня",2:"Яблоко"}';
header("Content-type: text/html; charset=windows-1251");
echo $result;
?>
под OPERA и FF
нехочет заводиться пишед данные не нравятся с сервера
Выдаёт ошибку Uncaught ReferenceError: $ is not defined, строка 55 в первом листинге.
Что вообще там обозначает коммент "для краткости - jQuery"?
---
Заранее спасибо!
библиотеку jQuery подключи!
Да и так почитай о ней, полезно
jQuery.com
ребят, у меня проблема. Мне нужно как то установить соединение клиента с сервером что получать текстовые обновления на экран для первого. Первое что пришло в голову это сделать так чтобы клиент каждые 5 сек запрашивал у сервака информацию об обновлении, отсюда трафик лишний. Вопрос, как сделать так чтобы при появлении обновления сервак сам отправил клиенту данные? это вопрос синхронизации(асинхронизации), или какие то широковещательные посылки должны быть, я хз. Кто понял о чём я ,отзовитесь плиз!
Доброго времени суток
$("#los_save").click(function ()
{
/*
var data1 = $('#faz1').val();
var data2 = $('#faz2').val();
var data3 = $('#faz3').val();
var data4 = $('#faz4').val();
......
var data15 = $('#faz15').val();
*/
var fl=0;
var fl2=15;
for (var i = fl; i <= fl2; i++)
{
var data[i] = $("#faz[i]").val(); /// ???
var arr = ["data[i]", i, true]
}
$.ajax({type: "POST",url: "proba.php", data:"arr", });
});
'#faz1' - id input. Подскажите как правильно написать $("#faz[i]").val() ?
Тьфу. Туплю.Вот:
$("#faz"+i).val();
И у тебя нет идентификатора "faz0", поэтому начинай i не с нуля, а с единицы.
Ну, с этого и следовало начинать!
Спасибо за крутую идею
Читать стоит, однозначно рекомендую. Отличная работа
AJAX (Asynchronous JavaScript and XML) позволяет отправлять запросы к серверу и получать данные асинхронно, fnf что делает веб-страницы более интерактивными.