css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
15 Фев
Нам осталось познакомиться еще с несколькими возможностями работы с Ajax, которые предоставляет javascript-библиотека jQuery…
jQuery.ajaxSetup( options ) – позволяет выполнить установку глобальных настроек для выполнения ajax-запросов. Принимает один аргумент в виде набора пар ключ/значение чтобы сконфигурировать настройки ajax-запросов по умолчанию. Все настройки опциональны.
Не буду повторять еще раз описания всех доступных опций, поскольку их можно посмотреть в статье jQuery и Ajax: запросы, а приведу только небольшой поясняющий пример:
$.ajaxSetup({
url: "/handler.php",
timeout: 3000,
type: "POST"
});
$.ajax({ data: myData });
Настройки по умолчанию определяют отправку ajax-запроса к url «/handler.php», устанавливают тайм-аут 3 секунды и определяют использование POST-запроса вместо GET для всех ajax-запросов (если настройки не будут переопределены для конкретного запроса).
Следующий же ajax-запрос содержит только некоторые данные, которые передает, руководствуясь глобальными настройками.
serialize( ) – упорядочивает набор элементов input в строку данных. Начиная с версии jQuery 1.2 корректно работает с формами.
Пример:
Упорядочиваем данные из формы в строку запроса, которая может быть передана на сервер с помощью ajax-запроса.
Вы можете скачать исходный код примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.
Не буду приводить HTML и CSS для этого примера, тем более, что его можно скачать. Посмотрим только javascript-код:
<script type="text/javascript">
$(document).ready(function(){
function showValues() {
var str = $("form").serialize();
$("#results").text(str);
}
$(":checkbox, :radio").click(showValues);
$("select").change(showValues);
showValues();
});
</script>
Функция showValues() – в переменную str пишем строку запроса, которую получаем с помощью serialize() для jQuery-селектора form. Вторая строка там добавлена только для того, чтобы показать эту самую упорядоченную строку запроса в элементе #results, т.е. только для примера.
Более интересны следующие строки:
$(":checkbox, :radio").click(showValues);
Выбираем все элементы input типа checkbox и radio и по клику на любом из них вызываем функцию showValues().
$("select").change(showValues);
То же самое проделываем для элементов select, только с той разницей, что вызовать функцию showValues() будем в случае изменений в элементах select.
showValues();
Просто вызываем функцию showValues() в момент готовности объектной модели документа.
serializeArray( ) – упорядочивает все формы и элементы форм (очень похоже на .serialize() метод), но возвращает данные в виде, который можно использовать для их представления в структуре JSON.
Пример очень похожий. Мы получаем данные из форм, прогоняем через цикл, добавляя их в элемент #result (для наглядности).
Вы можете скачать исходный код примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.
Так же не буду приводить HTML и CSS, а рассмотрим только javascript-код:
<script type="text/javascript">
$(document).ready(function(){
function showValues() {
var fields = $(":input").serializeArray();
$("#results").empty();
jQuery.each(fields, function(i, field){
$("#results").append(field.value + " ");
});
}
$(":checkbox, :radio").click(showValues);
$("select").change(showValues);
showValues();
});
</script>
Последние три строки абсолютно такие же как и в предыдущем примере, изменилась только функция showValues().
var fields = $(":input").serializeArray();
В переменную fields пишем массив, состоящий из значений полей форм. Обратите внимание, jQuery-селектор :input отбирает все элементы input, textarea, select и button, а не только input.
$("#results").empty();
Удаляем все содержимое элемента #results.
jQuery.each(fields, function(i, field){
$("#results").append(field.value + " ");
});
Для каждого элемента массива fields выполняем одну и ту же операцию – добавляем значение этого поля (с пробелом после него) в элемент #results (это опять же для примера, а могли бы делать и что-то другое).
Буду рад, если эта информация кому-нибудь пригодится…
Отзывов (27) на «jQuery и Ajax: разное»
В Интернете кстати очень много информации про то что связка JSON и AJAX сильно повдержена XSS атакам, и при невнимательном подходе может появиться множество уязвимостей в разрабатываемом Веб 2.0 приложении. Атакующий может увести кукисы с браузера, установленных другими доменами, подделать ответ сервера, красть пароли и .т.д. Есть ли у Вас информация по этому поводу?
Вы же сами начали с того, что написали: «В Интернете кстати очень много информации про то…». А вопросы безопасности широкая тема и должна освещаться не походу, а серьезно. Я не планирую никаких статей на эту тему, если честно.
Ниче, разберемьс, и на том спасибо что такие статьи отличные создаете! Сам уже кучу примеров применяю для нового диза.
Спасибо Вам за информацию, статьи, действительно, незаменимые!
Почему serialize( ) не работает с контролом файлов input type=»file» ?
Просто текстовую форму обрабатывает, а именно тип формы файл – нет.
Или я гоню…, подскажите пожалуйста…
file – это единственный тип элемента input с которым метод serialize() не работает.
Gennady, а как тогда можно получить значения из input file и отправить их на сервер? Самих input’ов file – n’ое множество?
Получить доступ к значению поля можно, и даже если множество, тоже не проблема. Примерно так:
var val = newArray();
$(«:file»).each(function() {
val[] = $(this).attr(«value»);
});
таким образом, массив val будет содержать значения атрибутов value всех элементов input. Конечно необходимы еще операции для того, чтобы подготовить данные к отправке, но все равно при таком раскладе на сервер будут отправлены только имена файлов…
Чтобы не заморачиваться, я на практике для этого использую плагин jQuery Form. Правда про использование input=»file» лучше почитать тут: http://www.malsup.com/jquery/form/
Привет всем.
Помогите решить проблему.
Рассказываю все как есть.
1. Запускаю браузер Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)
2. По умолчанию открывается сайт http://www.неважнокакой.ру.
3. прямо на главной странице index.php есть форма авторизации, с кнопкой при нажатии на которую отсылается запрос через ajax в скрипт validateuser.php в котором проверяется на валидность пользователь и в сессию присваивается переменная login. кроме того скрипт возвращает эту переменную в массиве и js получает это переменную уже на странице index.php.
4. теперь если перейти с этой страницы (index.php)на любую другую страницу сайта(например index.php?mod=test) эта переменная сессии не сохраняется и появляется опять авторизации как будто в сессии и небыло ничего, однако если просто обновить страницу то переменная сессии никуда не исчезает и все ок.
В IE такого не происходит, там нормально сохраняются переменные сессии заданные на стороне сервера.
подскажите комрады чтож за беда такая, конечно могу сделать проще чтобы на аякс отправлял запрос а просто по кнопке происходил post чтраницы, но нехочу так хочу чтоб вход пользователя был без перезагрузки страницы.
Жду с нетерпением вашей помощи. спасибо.
Вот еще что: получается так что первый раз после запуска браузера и авторизации переменная в сесии не сохраняется, но если еще раз авторизоваться то переменная нормально сохраняется. Такая фигня замечена в иозмлле и в сафари, в ие и в опере без такого глюка
Спасибо разобрался )
оказывается мозилла оч странно реагирует
если войти на сайт какоетоназвание.ru а потом с него перейти по ссылке на такой же сайт только http://WWW.какоетоназвание.ru то мозилла не находит идентификатор сессии и создает новый.
Сделал ссылки относительные и все нормально, однако в IE работало и в опере работало!
Здравствуйте!
Объясните пожалуйста вот такую ситуацию, а то сам чего то не понимаю.
Пишу как в примерах:
$(‘#lpanel’).load(‘ajaxh.php’, {do: «showsections»})
В firefox все работало замечательно, начал проверять в opere выдает ошибку:
Syntax error while loading: line 3 of linked script …
Expected token: ‘}’
$(‘#lpanel’).load(‘ajaxh.php’, {do: «showsections»})
————————————^
Написал строчку вот так и заработало:
$(‘#lpanel’).load(‘ajaxh.php?do=showsections’)
В чем причина такого поведения браузера и что с этим делать?
А если в конце строки точку с запятой? Правда без нее обычно IE начинает бастовать…
Здравствуйте!
Я пытаюсь научиться обновлять отдельные элементы на странице ajax-ом. Функция load может подгружать в элемент элементы DOM. А как подгрузить в элемент содержимое определенного элемента DOM?
Я пытаюсь примерно так:
$(document).ready(function(){
$(‘#ajaxupdate’).click(function(){
$(this).load(window.location+’ #ajaxupdate’);
});
});
Тогда не load() Вам нужна, а $.ajax(options), почитайте про нее, возможностей гораздо больше и Вы сможете ответ обработать как Вам необходимо.
Добрый день. Я так понимаю, вывести информацию можно только в контейнер с определенным идентификатором? А как в таком случае вписать полученный результат в тег (например, для формирования динамической ссылки?)
<a href=»сюда нужно вставить результат запроса»
Добрый. Нет, Вы понимаете несколько неправильно. Информацию можно вывести практически куда угодно. В Вашем случае, для изменения значения атрибута href, алгоритм примерно такой – сначала ищем элемент (по id, имени класса или еще как – не так уж важно), затем меняем значение атрибута. Примерно так:
$(‘a:first’).attr(‘href’,'новое значение’);
В примере будет изменено значение href для первой ссылки на странице.
Вы почитайте статьи про селекторы jQuery – это самые основы. Постигните их – станет все просто.
Спасибо, изучил. Действительно помогло:)
Подскажите, а нельзя ли забиндить вывод результата на кнопку? Дабы избежать постоянной нагрузки на сервер.
Например, выбираем параметры, после чего кликаем кнопку «применить» и видим полученный результат.
Почему нельзя? Можно конечно. Опять посоветую почитать статьи, но теперь про события – статьи на сайте есть. А если небольшой пример кода, то:
$('button').click(function(){ // тут выполняются какие-либо действия });При клике по button можно выполнить какие-либо действия, например отправить ajax-запрос к серверу (это уже статьи про ajax-запросы), получить ответ и вставить результат в нужное место DOM.
Здравствуйте. Я использую $.ajax(options). Как можно разобрать HTML ответ от сервера? Например когда мне нужен не весь HTML документ, а только содержимое какого нибуть div’a. Пробую так:
$(data).find(‘#id дива’).html();
невыходит..
Притом в data должен храниться весь полученный HTML документ чтобы можно было обратиться к другим частям HTML
Может проще использовать load(), который может грузить фрагменты html? Или чтобы серверная сторона отдавала только то, что необходимо?
Но, оно конечно, если на запросах хотите экономить тогда лучше весь data вставлять в какой-либо скрытый элемент, а потом, по необходимости тянуть оттуда, то что надо…
Спасибо, попробую сделать через скрытый элемент
немного не потеме, но перерыв весь интернет я так и не смог найти ответ на волнующий меня вопрос.
Суть приложения не большой телефонный справочник. Необходимо динамически отсеивать записи из таблицы, первые символы которых не совпадают с текстом введённым в инпуты. Записи должы сортироваться без дополнительного нажатия кнопок на форме.
к таблицам подключен модуль сортировки записей ui.tablesorter.
форма:
Бугалтерия
*****
ИТ отдел
Скрипт:
function ax_ex() {
$.ajax({
data: «dept=» + $(«#deportament option:selected»).text() +
«&fistname=» + $(«form input#fistname»).val()*****,
beforeSend: function(){
$(«#process»).css(«display»,»inline»).text(«timeout ajax-запрос»);
},
success:
function(answ){
$(«tbody»).empty();
$(«tbody»).append(answ);
}
});
}
$(document).ready(function(){ ax_ex()
// ajax-запрос c timeout 1000
setInterval(‘ax_ex()’, 1000);
}
//
в результате получаем большую загруженность ЦП.
ui.tablesorter не запоминает поле по которому ведётся сортировка.
Может вы подскажите более адекватное решение стоящих передомной задач.
КАК ЖЕ ПРАВЕЛЬНО ФИЛЬТРОВАТЬ ЗАПИСИ В РЕЖИМЕ ОНЛАЙН ???????
Может для решения стоит попробовать Autocomplete? Правда статейка старовата, но суть-то осталась.
А то у Вас получается, что сразу грузите сервер запросами раз в секунду и каждый раз заставляете браузер отрисовывать таблицу, когда юзер может еще и не ввел ничего?
А так, Вы большУю часть работы переложите на сервер и при этом не сильно его загрузите-то.
а каким образом мне может быть полезен Autocomplete. он полностью заточен под выпадающий список….
Полезен он может быть самой по себе идеей – ожидание ввода, отправка данных серверу, получение ответа… А вывод можно отформатировать и по-другому. Да, может сложно, но не боги горшки обжигают
Обсуждение статьи можно продолжить на форуме jQuery.