При создании компонент интерфейса часто нужен 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() ?
Я думаю, что вы должны написать больше на эту тему, это не может быть запретной темой, но обычно людей недостаточно, чтобы говорить на такие темы. candy crush soda saga
Most people know methods for getting new klingeltöne kostenlos from their cell phone carrier. Throughout the day . give you a great many of great mobile ringtones to choosefrom, however it really isn't quick cash place to find new ringers. There are a lot of websites that pay attention to mobile phone ringtones. This informationexplores top-of-the-line mobile ringtone sites out there, called Myxer. Really popular and and for good reason: custom made use and has a great selectionof ringtones.
Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены. Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
спасибо хорошая статья
спасибо
Сюда бы еще архивчик в конце со всеми исходниками, и было бы вообще просто супер.
А как сделать 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 не с нуля, а с единицы.
Я думаю, что вы должны написать больше на эту тему, это не может быть запретной темой, но обычно людей недостаточно, чтобы говорить на такие темы.
candy crush soda saga
Ну так iconv есть для этого. Сам им все строки перегоняю между браузером и БД. порно Онлайн
The way you Integrate AJAX into the interface is simple and effective. Very good way. I appreciate your way of doing this.
word games
I really like your site and especially this post with lots of good and informative information. Very helpful to me.
fnaf
Your article content is being very much interested, I am very impressed with your post. I hope to receive more great posts. atari breakout
This is a great thing, I think everyone feels this information is very valuable, thank you 8 ball
I need to to thank you for this great read!! I absolutely enjoyed every bit of it. I have you book-marked to look at new things you post… 먹튀검증
This article is really a fastidious one it assists
new internet people, who are wishing in favor of blogging. 직장인대출
Most people know methods for getting new klingeltöne kostenlos from their cell phone carrier. Throughout the day . give you a great many of great mobile ringtones to choosefrom, however it really isn't quick cash place to find new ringers. There are a lot of websites that pay attention to mobile phone ringtones. This informationexplores top-of-the-line mobile ringtone sites out there, called Myxer. Really popular and and for good reason: custom made use and has a great selectionof ringtones.
Great sexy chat experience only at niedersachsenladies
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.