css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
13 Фев
Разработчики библиотеки jQuery дали возможность использовать прелести ajax запросов без глубокого понимания процессов, которые происходят во время этого. Хорошо это или плохо, вопрос неоднозначный. Но, если такая возможность есть, давайте будем ей пользоваться и для начала ближе познакомимся с запросами ajax…
… вернее с тем, как их реализовать с помощью jQuery. Ниже я привожу перечень возможных запросов и постараюсь все пояснять на примерах.
load( url, [data], [callback] ) – загружает HTML из файла и вставляет его в объекную модель документа (DOM). По умолчанию (без [data]) выполняется как GET-запрос, однако, если будут переданы данные, выполнится как POST-запрос. Начиная с версии jQuery 1.2 в url можно определить селектор jQuery, например так:
$("#example").load("/ li.cat-item");
Результат выполнения Вы можете видеть ниже….
При выполнении этого запроса, были выбраны все элементы li с классом cat-item в запрашиваемом url и загружены в элемент #example, т.е. мы загрузили меню «Рубрики» этого сайта.
Здесь url – загружаемый url, data (опционально) – пары ключ/значение, которые могут быть переданы серверу, callback (опционально) – функция, которая может быть вызвана при окончании запроса (не требует обязательного успешного выполнения).
Еще пара примеров:
$("#feeds").load("feeds.html");
Загружает файл feeds.html в элемент с идентификатором feeds.
$("#feeds").load("feeds.php", {limit: 25}, function(){
alert("Последние 25 записей загружены");
});
То же самое, но дополнительно передается пара ключ/значение limit: 25 и задается функция, которая вызывается по окончании запроса.
jQuery.get( url, [data], [callback] ) – загружает страницу, используя GET-запрос. Это самый простой способ передачи GET-запроса серверу. Он допускает возможность использования одной функции, которая может быть вызвана при окончании запроса. Но в отличие от load, функция будет вызвана лишь при успешном выполнении запроса. Если необходимо определить функцию при ошибке запроса, лучше обратиться к $.ajax.
Несколько примеров:
$.get("test.php");
Запрашивает test.php page, но игнорирует возвращаемый результат.
$.get("test.php", { name: "Vasya", age: "27" } );
Запрашивает test.php и передает дополнительные параметры, но также игнорирует возвращаемый результат.
$.get("test.php", function(data){
alert("Данные загружены: " + data);
});
Передает результат запроса (без передачи параметров) к файлу test.php в alert (это может быть HTML или XML, зависит от того, что возвращает test.php).
$.get("test.php", { name: "Vasya", age: "27" }, function(data){
alert("Данные загружены: " + data);
});
Ну и полный набор: GET-запрос к файлу test.php с передачей каких-то параметров и возвращаемый результат передается в alert.
jQuery.post( url, [data], [callback], [type] ) – загружает страницу, используя POST-запрос. Все почти точно так же, как и в предыдущем случае, поэтому даже примеров приводить не буду. Обращу Ваше внимание разве что на еще один опциональный параметр – [type]. В нем можно определить тип передаваемых данных – JSON, XML и т.п.
jQuery.getJSON( url, [data], [callback] ) – загружает данные в формате JSON используя GET-запрос. Начиная с версии jQuery 1.2 Вы можете загружать данные в формате JSON, расположенные на другом домене. Пример загрузки фотографий с тэгом cat с Flickr JSONP API.
Вы можете скачать исходный код примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.
jQuery.getScript( url, [callback] ) – загружает и выполняет JavaScript файлы, используя GET запрос. Начиная с версии jQuery 1.2 Вы можете загружать и выполнять JavaScript файлы с любого домена.
Вот пример:
Вы можете скачать исходный код примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.
Мы загрузили и можем выполнить файл jquery.color.js – официальный jQuery Color Animation плагин.
jQuery.ajax( options ) – загружает страницу используя HTTP запрос. $.ajax() принимает один аргумент – объект, состоящий из пар ключ/значение, которые использует, чтобы инициализировать и обработать ajax-запрос. Ниже приведен список возможных значений.
Использование именно этой вспомогательной функции считается хорошим стилем, поскольку все остальные функции ($.get, $.post и т.п.) в конечном итоге используют именно $.ajax(options).
async – по умолчанию все запросы выполняются в асинхронном режиме (значение true). Если необходимо выполнить синхронный запрос, следует установить значение false для этой опции. Помните, что синхронный запрос может временно заблокировать браузер, запретив любые действия во время выполнения запроса.
beforeSend – может содержать функцию, которая должна быть вызвана до передачи запроса. beforeSend – это Ajax Event (события рассмотрены в другой статье).
cache – опция добавлена в jQuery 1.2. По умолчанию – true. Если установить в false, запрашиваемая страница не будет кэшироваться браузером.
complete – определяет функцию, которая будет вызвана по окончанию запроса (успешного и ошибочного выполнения). Принимает два аргумента: объект XMLHttpRequest и строку, описывающую «успешность» запроса. complete – это Ajax Event (события рассмотрены в другой статье).
contentType – при передаче данных серверу сообщает content-type. По умолчанию – application/x-www-form-urlencoded.
data – данные, передаваемые на сервер. Могут быть объектом или строкой. Конвертируются в строку запроса, если уже не представляют собой строку. Добавляются в URL GET-запроса. Если используется объект, он должен представлять собой пары ключ/значение. Если значения представлены в виде массива, jQuery сериализует значения с некоторым ключом. Например: {foo:["bar1", "bar2"]} будет представлено как «&foo=bar1&foo=bar2″.
dataType – строка, описывает тип данных, которые ожидаются в качестве ответа сервера. Если не определена, то jQuery сам попытается определить тип, основываясь на MIME-типе ответа сервера. Доступные типы:
- xml: вернет XML документ, который может быть обработан через jQuery.
- html: вернет HTML как plain text.
- script: расценивает ответ как JavaScript и возвращает его как plain text.
- json: расценивает ответ как данные в формате JSON и возвращает JavaScript объект.
- jsonp: загружает данные в формате JSON используя JSONP. Необходимо дополнительно добавить «?callback=?» в конец строки запроса в URL, чтобы определить вызов. (Добавлено в jQuery 1.2).
- text: строка plain text.
error – определяет функцию, которая будет вызвана в случае неуспешного выполнения запроса.
global – true или false. Вызывать или нет глобальные обработчики событий Ajax для этого запроса. Может быть использована для контроля различных Ajax событий. По умолчанию – true.
ifModified – запрос будет успешным только в случае, если данные ответа изменились со времени последнего запроса. По умолчанию – false.
processData – по умолчанию true. В опции data данные представлены в виде объекта, который преобразуется в строку запроса, подходящую для content-type по умолчанию – «application/x-www-form-urlencoded». Если необходимо иное, установите опцию processData в false.
success – указывается функция, которая будет вызвана в случае успешного завершения запроса. Функция принимает два аргумента: данные, возвращенные с сервера и отформатированные с учетом параметра dataType и строка, описывающая статус ответа.
timeout – устанавливает локальный тайм-аут для запроса в миллисекундах. Отменяет глобальный тайм-аут для этого запроса, если тот определен через $.ajaxSetup.
type – тип запроса, POST или GET. По умолчанию установлен GET. Типы запроса PUT или DELETE тоже могут быть использованы, но они поддерживаются не всеми браузерами.
url – просто url запроса.
Отзывов (141) на «jQuery и Ajax: запросы»
вы бы не могли представить пример выполнения запроса к базе данных, или пример запроса к файлу .php, в котором формируесться запрос к БД, и вывод етих данных?
Такой пример Вы можете посмотреть в статье про автозаполнение.
Там есть пример выполнения запроса к php-файлу, который выбирает необходимые данные из файла (Вы можете легко переделать его на запрос к БД) и осуществляет вывод этих данных.
Подскажите, как можно сделать что бы ajax запрос происходил через некоторое время, постоянно обращаясь к скрипту?
В javascript есть метод setInterval() – попробуйте воспользоваться им. Подробное описание метода и примеры его использования Вы наверняка найдете в сети…
Делаю запрос таким образом
$.get(‘test.php’, process );
Делал еще таким образом
$.getJSON(‘test.php’, process );
но почему-то ответ не пришел
ответ сервера передается в функцию
process(content), данные могут быть как JSON, так и XML, данные сгенерированы скриптом test.php.
Пример данных JSON
var marker = [{name: masha, age: 20}, {name: peter, age: 22}];
Пример данных XML
Так вот как мне с ними работать дальше после того как они были получены от сервера. Т.е. мне нужно что бы при запросе marker[0].name я получал «masha» (данные JSON) или marker[1].attr(‘name’) я получал «peter» (данные XML). Прошу прощения за неточности если они имеются.
Надеюсь, что Вам помогут вот эти статьи Что такое JSON? и Как работать с JSON?.
Если Вы с ними уже знакомились (думаю, что это так), то советы скорее общего плана. Попробуйте все-таки на 100% удостовериться, что Вы получаете ответ сервера (например, передайте, что-то совсем простое). А как обращаться с данными, полученными в формате JSON, как раз и описано в вышеуказанных статьях.
Здравствуйте! Могли бы помочь с решением одной задачки?
Сложность организовать обработку для данных, подргуженных через ajax
Вешаю обработчик onclick на ссылку
$(document).ready(function(){
$(‘a.op’).click(function(){
$(‘#op_’_this.id).load(‘data.php?id=’+this.id);
});
});
код html
…
+
….
Загружаемые данные также содержат a class=»op» и место для подгруза новых
данных, то есть рисуем раскрывающийся многоуровневый классификатор как здесь: http://www.tks.ru/db/tnved/tree
Gроблема в том, что в подгруженном html коде не срабатывает заданный обработчик click.
Я пробовал также добавлять определение этой ф-и еще на ajaxComplete, в итоге вроде-бы-что-то-работает,
но браузер зависает напрочь )
Вполне естественно, что у Вас не получается. Вы определяете функцию в момент готовности DOM, но потом добавляете в объектную модель документа дополнительные элементы, которые хотите обрабатывать. Решение – подгружать обработчики вместе с теми элементами, которые вставляются в DOM.
Геннадий,
здесь, возможно, опечатка:
===========================
sync – по умолчанию все запросы выполняются в асинхронном режиме (значение true). Если необходимо выполнить синхронный запрос…..
===========================
имхо, правильный параметр – «async»
Спасибо большое, Вы правы, конечно async. Исправлено.
Здравствуйте! А можна как то так сделать что бы по клику на заданый URL вызывался ПХП-скрипт? Типа этого $(‘any url’).click(function(){ $.get(‘any.php’)}). Помогите пожалуйста, заранее благодарен ))
Давайте для начала договоримся о терминах…. Надо четко понимать, что все, что написано на JavaScript выполняется в клиенте (т.е. в браузере), а все, что написано на PHP – выполняется на сервере и результат можно вернуть в браузер. Если это четко понять, то никаких проблем в решении Вашей задачи не вижу, только ее надо поставить несколько по-другому. Не по клику на заданный URL, а по клику на нужном элементе А в коде страницы Вы должны отправить ajax-запрос к php-скрипту на сервере, а полученный ответ обработать в браузере. И лучше этот запрос сделать все-таки через $.ajax().
Примерно так:
$(‘a’).click(function() {
var url = $(this).attr(‘href’);
$.ajax({
type: ‘GET’, // если хотите, сделайте POST
data: ‘foo=bar&foo2=bar2′, // данные (для примера)
url: url, // url мы взяли из атрибута href
beforeSend: function(){…}, // что-то сделать перед отправкой
success: function(){…}, // делаем что-то по получению ответа
error: function() {…} // и в случае ошибки..
});
});
type: ‘GET’,
data: ‘foo=bar&foo2=bar2′,
url: url,
beforeSend: function(){…},
success: function(){…},
error: function() {…} . извините, н6е пойму зачем все это. мне просто надо вызвать ПХП скрипт если нажатый URL соответствует эталонному URL, и ответ не надо обрабатывать в броузере. Таким образом мне надо сделать счетчик произвольной ссылки на сайте(припустим есть URL например mysite.net/mode/den/&opt=2 и надо вести счетчик кликов по этой ссылке). Спасибо!
В простейшем варианте для одной ссылки:
$(‘#id’).click(function() {
$.ajax({ url: ‘handler.php’ });
});
где id – идентификатор ссылки, в url указан адрес обработчика на сервере….
Gennady, мне в java-скрипт надо как то жорстко забыить даный мне URL, потому как у меня ссылка не статическая,-потому не могу дать ей ID. Можно ли так сделать? Спасибо!
Мы так друг друга никогда не поймем… Какой URL нужно «жестко забить»?
URL php-скрипта на сервере? Тогда $.ajax({ url: ‘handler.php’ }); где вместо handler.php подставляйте свой.
Или под URL имеется ввиду тэг А на странице, клики по которому надо подсчитывать? Я же id для примера привел…. Почему нельзя в селекторе написать просто $(’a’).click(function() {…}); или еще как-то…. Можно решить это 5-7 способами. Читайте доки и выбирайте любой подходящий способ.
Не обижайтесь dios, но Ваш вопрос говорит как раз о том, что Вы не очень внимательно читали документацию…
Такого $(’any url’).click(function(){ $.get(’any.php’)}) сделать не получиться, можно сделать иначе, да и таких способов как сказал Gennady можно придумать много.
Можно сделать так
Генерируем ссылку и прописываем в ней атрибут idd=20,
Далее при щелчке на ссылке выполняеться Jquery
$(’#counter’).click(function() {
var id = $(«#counter’»).attr(«idd»);
$.ajax({ url: ’script.php’, date: ‘idd=’+id});
});
Далее php скрипт обработывает запрос, что при idd=20 выводить такой то счетчик, также можно сделать через скрипт подгрузкку нужных файлов. При этом URL может быть любым хоть динамический, хоть статический
Полезно. Спасибо автору за статью. Занимаюсь разработкой модуля для Drupal, теперь открылись новые перспективы.
Gennady, сделал так как вы написали, все работает так как я хотел, но не работает конструкция $.ajax({ url: ‘handler.php’ }); тоесть не могу вызвать пхп-скрипт на сервере. вроди делаю все как в документации, но он все равно не подгружается. Подскажите в чем ошибка? $.ajax({ url: ‘/html/get/get_page_count.php’ });
Приветствую, dios!
Вот Вам рабочий пример. Все с исходниками и подробными пояснениями, а всю незначащую переписку выше я удалил.
Спасибо Вам огромное!!! Вы меня очень выручили!
Здравствуйте! Подскажите пожалуйста как с помощью джквери присваивать переменные. Например, мне нужно ответ от сервера при аякс запросе вставить в DIV. $(‘#mytext’) = data;(не работает) поидеи это ж как в джава скрипте (getElementById(‘mytest’) = …)Как?
Не понял еще как работать с функциями..функциям можно давать сообственные названия? Как сделать альтернативу setTimeOut()? Спасибо большое кто откликнулся!
Ответ от сервера в элемент вставляем:
$(’#mytext’).text(data); – как текст
или
$(’#mytext’).html(data); – как HTML
все это есть в мануалах по jQuery.
Про работу с таймерами расскажу в ближайшей статье.
День добрый!
Есть элементы формы: поле для редактирования и поле загрузки файла. Нужно загрузить файл с названием на сервер через Ajax.
Пытался использовать методы $.post() и $.ajax(). Текстовое поле отправляется, файл – нет. При отправки методом $.ajax() пытался менять параметр contentType: «multipart/form-data». Не помогает.
Подскажите пути решения задачи. Заранее благодарен!
Попробуйте воспользоваться каким-либо из этих плагинов:
http://plugins.jquery.com/project/ocupload
http://plugins.jquery.com/project/AjaxMultiFileUpload
http://plugins.jquery.com/project/jquploader
http://plugins.jquery.com/project/MultiFile
Классная статья, спасибо!
я никак не могу подгрузить страничку типа «index2.php?option=com_content&task=view&id=16&Itemid=52&no_html=1′ (joomla 1.0.12)
не подскажите что писать в data: ?)
делаю так
код:
эх..
$(‘#x’).click(function(){
$.ajax({
url: ‘index2.php?option=com_content&no_html=1′,
type: «POST»,
dataType: «HTML»,
data:’&task=view&id=16&Itemid=52′,
success: function(data){
$(«#result»).html(data);
}
}); })
не получается..((
—————————————————————————————–
Заранее СПС
На первый взгляд – все вроде верно… Попробуйте сначала поработать с тестовым файлом на сервере. Передавайте что-то простое и убедитесь, что серверный сценарий отрабатывает нормально. Что-то вроде этого напишите:
< ?php
header('Content-Type: text/html; charset=utf-8');
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
if($_POST) {
....................
}
}
?>
и проверьте.
эмм)) не совсем понял что надо сделать..
попробовал сделать тоже самое (то что я постил выше) на сервере (до этогого на локалке, денвер), то же самое «У Вас нет прав для просмотра этого ресурса.
Вы должны зайти как пользователь. »
Эх(( сейчас для аякса испульзую fullajax, хочу полностью на jquery перейти..
получилось!))) пишу так на всякий случай.. может кому пригодится)) прост в настройках джумлы включить SEF)) (сайт в примере локальный)
уря
$(‘#x’).click(function(){
$.ajax({
url: ‘http://k.ru/index2.php/content/view/16/52/’,
type: «POST»,
dataType: «HTML»,
success: function(data){
$(«#result»).html(data);
}
}); })
а как изменять заголовок (добавлять заголовок подгружаемой страницы), не нашел таких примеров…
FItz, Вы может уточните вопрос. Какой заголовок? Вы же подружаете что-то, уже куда-то. Т.е. в существующую страницу. Так какой заголовок?
Gennady, к заголовку существующей страницы, добовлять заголовок подгружаемой страницы.
например:
заголовок существующей страницы: Офф сайт ..
заголовок подгружаемой страницы: Анонсы: Макс Пейн
чтоб после подгрузки получилось: Офф сайт .. – Анонсы: Макс Пейн
Заголовок – это содержимое тэга title. Работайте с ним так же, как и с любым другим элементом.
// получаем заголовок
$(«title»).text();
Вот с установкой заголовка – вряд ли. Тот заголовок, что юзер видит в окне браузера не меняется.
спс!!))
Копайте в сторону объекта document, а конкретно document.title
Спасибо большое за статью
А если допустим на странице несколько элементов, которые отсылают ajax-запрос и ответ необходимо присоединять к элементу, отославшему запрос?
Вам надо повнимательнее прочитать разделы про селекторы jQuery. На самом деле можно привязать конкретное событие к конкретному элементу и результат возвращать именно туда, куда необходимо.
Да но если я привязываю к элементу ajaxSuccess допустим он реагирует на выполнение любого ajax-запроса, а не того, который этот же элемент послал. Я что-то делаю неправильно?
Эти события могут быть определены и как локальные, и как глобальные. Может быть у Вас дело именно в этом. Подробности можно посмотреть тут: http://docs.jquery.com/Ajax_Events
Т.е. на самом деле, если Вы используете локальные события никаких проблем возникать не должно. Могу привести кусок реального кода (ну, немного упрощенного для лучшего восприятия):
$(«input.titleRus»).change(function() {
var val = $(this).attr(«value»);
var id = $(this).parent().attr(«name»);
var data = ‘id=’ + id + ‘&val=’ + val;
var target = $(this);
$.ajax({
async: false,
timeout: 3000,
type: «POST»,
url: «editTitleRus.php»,
data: data,
beforeSend: function(){
target.attr(«value»,»Редактирую…»);
},
success: function(answ){
target.attr(«value»,answ);
}
});
});
тут редактируется текстовое поле некоего названия (на русском), и можно предположить, что на этой же странице есть поле для редактирования например названия на английском языке и т.д.
В итоге все сводится к jQuery-селектору input.titleRus в котором возникает событие change.
Ес-но совсем реальный код можно и нужно оптимизировать, но в данном случае не это главное…
Не очень внимательно прочитал Ваш пост. Можно было не писать такой большой ответ (хотя кому-то может пригодится). Дело в том, что ajaxSuccess – это глобальное событие. А локальное – success, как раз как в моем примере.
Большое спасибо, все замечательно работает
Здравствуйте!
Статья конечно отличная. Но вот что я ищу – так и не нашел. Интересуют функции jQuery .post и .getJSON. Нельзя ли привести пример PHP файла, где содержится обработчик событий? или, если возможно, киньте ссылку с примерами использования Ajax-функций jQuery.
Заранее благодарен!!
$.post() и $.getJSON – суть высокоуровневые абстракции, которые может и несколько проще для понимания, но не могут предоставить той функциональности, что даст использование $.ajax(options), которая может позволить произвести «тонкую настройку» запроса любого типа. Достаточно только внимательно изучить доступные опции.
Но теперь к сути вопроса – про серверный обработчик. Вот стандартный пример php-кода:
Надо отметить, что если используется $.getJSON, то надо проверять $_GET, если конечно тип запроса не переопределен на POST, что возможно опять же при использовании $.ajax(options).
Ну а как работать с JSON на сервере – можно посмотреть статьи в соответствующем разделе блога.
Добрый день, у меня возникла проблема с кодировкой. Делаю следующее: пишу тест в textarea, input и т.д., формирую ajax запрос:
$.ajax({
url: «../kernel/category.kernel.php»,
type: «POST»,
dataType: «HTML»,
data: «act=add&name=»+name+»&alt=»
+alt+»&descr=»+descr+»&keyw=»
+keyw+»&par=»+par+»&view=»+view
});
там на серверной стороне скрипт берет это все и пишет в бд самым обыкновенным образом, без каких либо преобразований. Кодировка у БД UTF-8.
Страницы у меня расчитаны на windows-1251. При загрузке страницы, строки добавленные через ajax выглядят следующим образом:
«РїСЂРёРІРµС‚» вместо «привет»
«РјРёСЂ» вместо «мир»
пока борюсь так:
iconv(«UTF-8″, «windows-1251″, $string);
подскажите как это побороть, пожалуйста.
Данные, которые Вы передаете на сервер, уходят ес-но в кодировке 1251. Перед записью в базу приведите их к UTF-8, при выводе данных из базы (сразу после создания соединения):
mysql_query(«SET CHARACTER SET ‘cp1251′»);
mysql_query(«SET NAMES ‘cp1251′»);
Добрый день. Поможите чем можете.
Есть такая строка запроса:
$(«#target_layer»).load(‘php_script_url’ + ‘?value=’ + $(«#input_field»).attr(‘value’));
Вызывается она при событии onKeyUp в текстовом поле и отправляет на сервер значение этого поля при каждом нажатии клавиши.
Результат Ajax-запроса записывается в соответствующий слой и показывает валидность заполнения этого поля.
Проблема: При вводе текста в текстовое поле Ajax-запросы «накладываются» друг на друга, то есть новый запрос отправляется, хотя еще не получен результат предыдущего запроса. В результате в целевом слое начинается «дурдом».
Вопрос: Как в jQuery можно отменить уже запущенный Ajax-запрос?
Здесь скорее надо просто использовать не асинхронные, а синхронные ajax-запросы. Т.е. перед отправкой следующего запроса дожидаться выполнения предыдущего. Попробуйте использовать опцию async метода jQuery.ajax( options ), установив ее в false.
Это решение конечно поможет, но, если мне не изменяет мой склероз, при синхронном запросе блокируется полностью вся страница, а это будет мешать пользователю свободно вводить данные.
Уже два часа копаюсь в сети… Неужели нельзя отменить посланный Ajax запрос?
Память Вам не изменяет – это действительно так. Попробуйте посмотреть как работает плагин autocomplete – может это поможет…
Добрый день. Статья замечательная, вроде все понятно, но вот вопрос: почему прм выполнении следующего кода:
$(«#newstext»).load(«newstext.html»);
отладчик выдет ошибку – «Разрешение отклонено» ?
Заранее благодарен.
Andy, это нормальный «прибабах» Ajax`а. Попробуй прописать полный адрес к запрашиваемой страничке и все будет нормально.
Например так:
$(”#newstext”).load(”http://www.domen.ru/newstext.html”);
Домен в адресной строке браузера и в адресе запрашиваемой страничке должны быть идентичны.
Геннадий, а я так и не смог найти ответ на свой вопрос… Пришлось весь алгоритм посадить на событие onBlur… Сдается мне, что отменить уже посланный Ajax-запрос напрямую отменить нельзя.
Если не ошибаюсь, то библиотека не предоставляет такой возможности (по крайней мере я не видел). Если уж это совершенно необходимо, то вероятно придется писать свой код, который реализует ajax-запрос, в котором (в коде) и отслеживать onreadystatechange. Но тогда просто потеряются все плюсы использования библиотеки.
Ндаа… Ну тогда будем подстраиваться под то что есть… Пасибки )))
danko-13 писал: Домен в адресной строке браузера и в адресе запрашиваемой страничке должны быть идентичны.
А это обязательное условие Ajax-а? Как быть, если мои данные лежат на другом сервере?
Необязательно. Необязательно писать путь с http…. В том коде скорее всего надо было просто слэш в начале прописать.
Что касается получения даных с другого домена – читайте, в блоге есть статьи на эту тему. Можно получать используя например jQuery.getJSON( url, [data], [callback] ) или jQuery.getScript( url, [callback] )…
Если же использовать свой серверный сценарий, который получает данные с другого домена, а уже потом возвращает Вам в клиент, то вообще проблем никаких.
В Викпедии, в статье – XMLHttpRequest сказано:
XMLHTTP работает только с файлами, находящимися на том же домене, что и использующая XMLHTTP страница. Как и в случае JavaScript, это сделано в целях безопасности (cross-site scripting).
Это комментировать не надо.
Поэкспериментировал я с get(), getJSON() и getScript() в Опере9.62 и в IE7. Выяснил следующее:
getJSON() и getScript() обходятся без XMLHTTP.
В Опере JQuery сильно глючит: не работает к примеру callback в getJSON() и getScript(), в версии JQuery1.2.6 последние совсем не работают, а что касается get() – работает нормально, но в соответствии со статьей из Викпедии.
В IE7 все на много лучше: ни каких глюков и ни каких ограничений – запросы уходят на любые домены.
Возможно в Опере 9.27 – в самой устойчивой версии глюков будет поменьше, но меня заинтересовал другой вопрос: если getJSON() и getScript() обходятся без XMLHTTP, то значит асинхронные запросы существовали и до Ajax, в иных формах?
To freeneutron: не забывайте, что статью в Вики может написать любой. Вы тоже. Написать, а потом скажем, не отредактировать ее по каким-то причинам. А время-то идет и многое меняется….
Так что Вики лучше читать для получения информации из серии «что такое … «. А вот конкретную информацию лучше брать все-таки из первоисточников – http://jquery.com.
Кстати, если Вы считаете, что действительно обнаружили в jQuery ошибки, то наверное лучше сначала сообщить об этом команде jQuery, и предоставить доказательства обнаружения этой ошибки. А уж потом результаты разбирательства, если есть желание, публиковать и на русскоязычных ресурсах.
Да, еще… AJAX – это не что-то новое – это всего лишь новый взгляд, если хотите использование определенным образом технологий, которые существовали и до того, как появился термин AJAX.
freeneutron, собери функционал на нулевом фрейме и не мучайся с кроссбраузерностью и т.п.
Gennady, спасибо за ответ…
Подскажите, плиз. Использую $.getJSON. Отправляю данные – получаю ответ. Не перегружая страницы, вновь отправляю данные. Ответ приходит как и в предыдущем случае. Причем повторно данные отправляются те же. Кеширование? Как можно побороть. Если можно на примере. Спасибо!
Не видя кода сложно давать советы. Если данные совершенно одинаковые – возможно действительно кэширование. Тогда можно просто добавлять какой-то параметр, который меняется каждый раз, либо поработать с заголовками на сервере. А если данные при следующей отправке отличаются от предыдущих – то скорее причина в чем-то другом.
передаются две переменные из формы. названия переменных одни и те же, значение разные.
Доброго времени муток, использую аякс запрос такого вида
jQuery(‘div#’+url[1]+’_info’).load(‘news.php?id=world’);
Не подскажете как можно реализовать чтобы во время загрузи была надпись Loading?
При использовании метода load() это не получится. Здесь нужно использовать jQuery.ajax( options ) – он даст возможность тонкой настройки ajax-запроса и в частности, то, что Вам нужно – опция beforeSend, в которой можно будет указать функцию, выполняющуюся перед отправкой запроса. Т.е. как раз «loading…», а после окончания запроса использовать опцию success, чтобы убрать этот самый «Loading…».
Добрый вечер, Геннадий!
Скажите, пожалуйста, есть ли возможность, используя метод $.ajax с параметром
contentType: ‘multipart/form-data’
отослать post-запрос на загрузку файла? При этом я не хочу использовать плагины oneclickupload и тому подобные.
Меня интересует именно функциональность метода $.ajax. Не совсем понятно, что именно передавать в параметр data, если на сервер загружается файл.
Допустим, есть поле
и кнопка
Насколько я понимаю, я должен написать что-то подобное:
$(document).ready(function() {
$(‘#btnAttachedFile’).click(function() {
$.ajax({
url: ‘ajax.attach-new-file.php’,
type: ‘post’,
contentType: ‘multipart/form-data’,
data: {file: $(‘#fbxAttachedFile’).val()},
success: function(data, textStatus) {
$(‘#divAttachedFile’).html(data);
}
});
});
});
Файл ajax.attach-new-file.php пусть тестово пишет мне содержимое $_POST и $_FILES.
Но я он, увы, ничего не получает. Значит, надо как-то отправлять именно форму? Я совсем запутался. Помогите, пожалуйста.
Могу честно признаться – такая задача и у меня была. Я ее не решил. Надо было делать быстро и поэтому просто использовал плагин. На самом деле было бы очень интересно узнать решение. Если кто-то осилил – может поделитесь?
Спасибо за подсказку, действительно работает)))
Тоже сталкивался с проблемой отправки файла на сервер по Ajax. После «расковырки» внутренностей нескольких плагинов оказалось, что отправить файл «чисто» Ajax’ом невозможно. Везде используется нулевой фрейм, в котором обычное поле input type=»file», а по Ajax’у отслеживается процесс загрузки файла.
Может конечно не сосем сюда, но …
Мне необходимо перегрузить картинку
Это возможно сделать с помощью Load?
кроме как с вариантом поместить ее в HTML и потом его загружать…
Можно и через load. Просто весь загружаемый файл по сути должен состоять из одного только тэга img. Можно через метод $ajax – тут практически никакой разницы в Вашем случае.
Добрый день, тоже возникла проблема с кодировкой.
Использую кодировку koi8-r, от сервера к браузеру все доходит нормально, однако когда загружаю текст post запросом с жаваскрипта в php, на сервере данные приходят в utf-8.
Roman, так и должно быть. Перекодируй на сервере. Если юзаешь PHP, то команда примерно такая:
$string = iconv(«UTF-8″, «windows-1251″, $_POST['string']);
Добрый день, Геннадий.
Не могу понять почему пример с кошечками у меня работает ( $.getJSON или $.get) , а
$.get(«http://www.panoramio.com/map/get_panoramas.php?
order=popularity&set=public&from=0&to=20&
minx=-180&miny=-90&maxx=180&maxy=90&size=medium»,
function(data){
alert(«Data Loaded: » );
});
не выполняется.
Вы внимательно читали описание их API? В принципе он отдает данные в формате JSON, но FireBug грешит на их некорректность. Может просто не хватает каких-то параметров в запросе? Или как и в ихних же Гуглевских картах, нужна регистрация и какой-нибудь ключ?
http://www.panoramio.com/api/
больше нет ничего.
Если взять те данные, что он отдает и тупо скопировав положить их на свой сервер, то с ними можно работать без проблем. Я правда использовал $getJSON, но получить от них данные корректно пока тоже не смог. Описание API видел – но детально не вчитывался, может где-то что-то и написано в Terms of use к примеру. Я просто по аналогичным API Google сужу – в картах ключ нужен, который к конкретному домену привязан, а этот сервис в общем-то на той же базе – вот и подумал, может тоже ключ нужен, других-то хитростей вроде не видно.
Кто в курсе – может подскажет?
Здравствуйте, не подскажите как можно обработать timeout ajax запроса? У меня получилась такая ситуация, что когда запрос отправляется на сервер Firefox и Opera ждут ответа сколько требуется, а IE похоже уничтожает XMLHTTPrequest? поэтому запрос повисает.
Опция timeout устанавливает предельное время ожидания ответа от сервера в миллисекундах. Если ответ не получен будет вызван обработчик события, определенный в опции error ajax-запроса.
В error – функция, которая может быть вызвана, если запрос потерпел неудачу. Функция принимает три аргумента: объект XMLHttpRequest, строку, описывающую тип ошибки, которая произошла и дополнительный объект исключения, если он имеется.
function (XMLHttpRequest, textStatus, errorThrown) {
// чтобы получить необходимую информацию, обычно используется
// либо только textStatus, либо только errorThrown
this; // опции этого ajax-запроса
}
Спасибо, тогда вопрос на ту же тему: в IE как нибудь можно продлить жизнь запроса (опция timeout не помогает)?
jQuery-то тем и хороша, что снимает большую головную боль в реализации ajax-запросов для разных браузеров (речь понятно, в основном об IE).
Знаете, Alex, по опыту работы с библиотекой – если что-то работает в FF и Opera и не пашет в IE – значит где-то в коде, в конце цепочки вызовов нету точки-запятой. Ну, по крайней мере я не раз сталкивался с этим. Проверьте на всякий случай.
Здравствуйте, не подскажете почему такой запрос
работает в FF и не работает в IE, никак не могу понять.
var bbb = $.ajax({
url: «list.xml»,
async:false
}).responseText;
Но Ваш код работает и в IE тоже, и в Opera, и в Google Chrome. Но вообще-то логичнее было бы не обращаться к свойству responseText объекта XMLHttpRequest, а назначить в опции success функцию-обработчик.
вот целиком код, в 7 ie не работает никак
<script type=»text/javascript»
function change(){
var bbb = $.ajax({
url: «list.xml»,
async:false
}).responseText;
$(«frut», bbb).each(function(i){
alert($(this).html());
}); }
Выберите
Апельсин
Спасибо, Gennady, Ваш совет про опцию error пригодился.
Настя, попробовал ваш код. То что было в первом посте должно работать во всех браузерах. Во втором есть несколько проблем.
Во первых селектор $(«frut») скорее всего ничего не вернет, попробуйте $(«#frut»).
Во вторых свойство responseText возвратит в Вашем случае полный текст xml файла. попробуте добавить alert(bbb); для проверки.
В третих такой селектор $(”frut”, bbb) тоже вероятно ничего не вернет.
Спасибо. проблема была как раз с селектором $(”frut”) он ниего не возвращал, как вы и сказали.
Здравствуйте, скажите, в IE не работает функция load загрузки html страницы, а в других браузерах работает, это проблема сервера?
Проверьте включена ли поддержка JS в IE – это первое. Второе – внимательно посмотрите свой код – может быть где-то в конце точку с запятой забыли? А сервер тут не при чем.
Спасибо за ответ, но в код простой:
$(document).ready(function(){
$(«#Div1″).load(«page.html»);
});
и поддержка js включена, на denvere, на локалхосте, работает прекрасно, а как закачиваю на сервер с unix – в ехplorer уже не работает. Сам понимаю, что сервер ни при чем, но что может быть? Неужели назад к фреймам переходить)). Адрес страницы для загрузки указывал уже всеми возможными способами.
А на этой странице, если смотрите в IE, у Вас пример работает? У меня без проблем, грузит, что положено.
Работать он обязан. Метод в библиотеку давно очень включен.
да, конечно, работает, и на моем сервере jquery прекрасно работает, кроме метода load в эксплорере, словно он не видит файл для загрузки, который я указывал и через точку (./page.html) и слешем (/page.html) и полным адресом с http – не видит, впрочем ajax форма тоже не видит файл поля method, первый раз такое вижу, почему именно в эксплорере…
У меня бывало, что проблемы с IE возникали, когда что-то отлаживаешь и забываешь в конце поставить точку с запятой или например, когда описываешь опции, после последней опции запятую забудешь убрать… В таких случаях FF съедает код нормально, а IE – нет.
Я об этом уже где-то упоминал.
Если не это, тогда имхо, останется только с бубном шаманить…..
Здравствуйте, спасибо за большое количество полезных примеров. Которые можно сразу же успешно применить.
У меня возник вопрос. Как можно в значение limit: 25, вместо 25 передавать другие значения переменной из php цикла чтобы всю конструкцию jquery не помещать в цикл?
$(«#feeds»).load(«feeds.php», {limit: }, function(){
alert(«Последние 25 записей загружены»);
});
while($row1 = $db->sql_fetchrow($res1)) {
$var_php=$row1[i];
echo <a href=’#’ rel=»nofollow»>$var_php</a>
}
Насколько я понимаю, у Вас выводится какое-то кол-во ссылок. При клике на такую ссылку, значение $var_php должно быть использовано в качестве значения для limit. Довольно просто:
$('a').click(function(){ var limit = $(this).text(); $('#feeds').load( 'feeds.php', {limit: limit}, function(){ alert('Последние 25 записей загружены'); } ); });Добрый день!
Очень понравилась эта статья и на ее фоне у меня возник один вопрос:
Можно ли как-то получить в jQuery переданные GETом странице параметры для их передачи вызываемому скрипту? К примеру пишу обращение:
jQuery.get(
‘test.php’,
{
first: blabla,
last: blabla,
third: тут нужно вставить переданную переменную странице методом GET
})
Можно конечно, почему нет?
third: < ?php print $_GET['somevar']; ?>
ну этот способ я знаю =)
а средствами javascript или jquery никак?
P.S.: Просто у меня движок со смарти и не хотелось бы заморачиваться со всеми литералами, делать множественное наслоение тегов…
Ну, а как еще можно передать значение переменной из PHP в JS?
Вы не совсем поняли задачу…
К примеру загружается страница на которой расположен скрипт.
Адрес страницы: http://somedomen.bla/somepage.html?somevariable=sometext
Меня интересовало как я могу получить средствами js переменную somevariable…
P.S.: В принципе решил уже задачу средствами Smarty используя {$smarty.get.somevariable}, но всеравно спасибо за оперативные ответы ^_^
Попробуйте
document.location.search
Должно возвращать то что после ? в URL
Геннадий, решил я свою проблему с функцией load в IE. Оказывается, IE слишком медленно выполняет $(document).ready, я решил проблему так:
гружу библиотеку через гугл:
google.load(«jquery», «1.2.6″);
и все работает)
Здравствуйте, Gennady. Подскажите, как в вашем примере про автозаполнение формы, сделать так чтобы передавалось не имя (поселка), а его идентификатор. Очень нужно.
В файле autocomplete.php есть такая строка:
print $row[1].’|’.$row[3].’|’.$row[2].’|’.$row[0].’\n’;
она повторяется в цикле и выводит те данные, которые Вы посчитаете нужным и в нужном порядке. Разделитель – | – вертикальный слэш. А на стороне клиента, в liFormat берите то, что нужно, и тоже в нужном Вам порядке.
Это я понял, но тогда в поле ввода окажется значение идентификатора, а мне нужно, чтобы отображалось название, а передавался идентификатор.
Но он передается даже в примере (пример 2) – при выборе названия из списка Вы можете увидеть сообщение с ID выбранного города…
К своему сожалению, я только недавно столкнулся с javascriptом, поэтому я не знаю метода передачи переменной в форму. Если Вас не затруднит, напишите кусочек кода, который помещает переменную в форму.
Попробую подробно (хоть комменты и не к той статье).
Когда на сервере мы выводим
print $row[1].’|’.$row[3].’|’.$row[2].’|’.$row[0].’\n’;
мы отдаем в клиент:
Название – Кол-во жителей – Область – ID
Функция liFormat в клиенте «рисует» нам что-то вроде выпадающего списка (он состоит из элементов li), где в row[0] находится уже название, а в row[1] – количество жителей (ведь именно в таком порядке мы получили эти данные в ответе).
Функция selectItem(li) работает с выбранной «опцией». Она получает некий объект li, в свойстве extra которого хранится массив данных. ID в li.extra[2].
Ну, еще понятнее я вряд ли смогу объяснить.
Gennady все это понятно. Я просто не могу найти метод, который бы позволил переменную sValue поместить в форму. Например в объект . Подсажите как это реализовать.
объект – .
извиняюсь за флуд. объект формы hidden.
доброго времени суток…у меня возникла такая проблема:
есть
function sOptionMenu(){
$(«#main_frame_admin»).load(«option_menu.php»);
}
вызывается из <a href=»#»>Изменить</a>,
в option_menu.php читаются из базы активные меню…
проблема в том что ie вродь как считывает его один раз при загрузке страницы и возвращает постоянно один и тот же результат…
в других браузерах все ок…
подскажи пожалуйста как обмануть его?
заранее благодарен…
function OptionMenu(){
$(”#main_frame_admin”).load(”option_menu.php”);
}
вызывается из ссылки на событие onclick
Вероятно кэширование запроса, поскольку метод load по умолчанию использует GET-запрос. Попробуйте вместо option_menu.php использовать что-то вроде option_menu.php?param=bla-bla, где bla-bla – какое-нибудь случайное значение каждый раз. А еще лучше: $(‘#selector’).load(option_menu.php,data) – передавая data, Вы заставляете метод отправлять POST-запрос. Вероятность его на попадание в кэш меньше…
спасибо большое… помогло…
В реальной ситации трабл: не могу получить генерируемый xml с сервера во всех браузерах кроме Safari 4.
http://www.kinomax.ru/?m=shedule&date=16.03.2009 (дата должна быть не ниже сегодня)
Собственно код:
$.get(«http://www.kinomax.ru», { m: «shedule», date: «16.03.2009″ }, function(data){
alert(«Данные загружены: » + data);
});
В чем причина?
Вы прямо в корень сервера обращаетесь? Может попробовать указать конкретный файл.
Помогите пожалуйста, надо сделать чтобы при на жатии на ссылку данные отправлялись пхп скрипту и возвращались в функцию javascript ссылок несколько на странице идентичных менются тока параметры для каждой ссылки, никак не получается… просто на alert реагируют а на все остальное нет
Несколько расплывчато – какие данные, какие параметры у ссылок меняются. Можно конечно в общих чертах показать. Примерно так:
$('a').click(function(){ var data = 'href=' + $(this).attr('href') + '&alt=' + $(this).attr('href'); $.ajax({ type: 'POST', data: data, url: 'someurl.php', success: function(answer){ $('#result').html(answer); } }); });По клику на любом элементе а на странице получаем содержимое его атрибутов href и alt, из которых строим строку запроса. Затем отправляем это с помощью вспомогательной функции ajax серверу, на someurl.php, используя метод POST. При успешном ответе сервера вставляем полученный ответ (подразумеваем, что это просто html-код) в виде html-кода в некий элемент с идентификатором result.
Спасибо,за хорошие статьи и живые примеры.
Хотелось бы обратиться к Вам Генадий, и попросить
привести небольшой пример (быть может в отдельной статье),как без применения JSON или XML,
можно распарсить ответ сервера, если движок отвечает на запросы html кодом.
и несколько вариантов (к примеру:
выделить в переменные из общего ответа,
чтобы потом воспользоваться
jQuery(‘div#…’).load(path)
На отдельную статью это не потянет – слишком просто…
Смотрите, сервер ведь не обязательно должен возвращать данные в JSON или XML, это может быть и HTML, и текст или например JS-код. Вот простенький пример сценария на сервере, который возвращает (например) три параграфа, которые в клиенте нужно вставить в разные места DOM.
< ?php
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
print '<p>Текст 1</p>::<p>Текст 2</p>::<p>Текст 3</p>';
}
?>
Обратите внимание на :: – это всего навсего разделители.
Теперь вернемся к обработке ответа от сервера в клиенте. Я не буду приводить много кода, просто предположим, что мы описываем callback-функцию в опции success ajax-запроса. Сделаем вот так:
success: function(answer){ var data = answer.split('::'); $('#target1).html(data[0]); $('#target2).html(data[1]); $('#target3).html(data[2]); }Думаю, смысл ясен – преобразуем ответ сервера в массив, воспользовавшись разделителем. Теперь в вымышленные элементы target1,2,3 мы можем вставить те параграфы, которые надо.
спасибо еще раз, особенно за отзывчивость.
У меня та же проблема с IE.В опере пашет будь здоров! В нем неправильно работает $(«#res»).load(«page.htm»);
Проблема в том что ИЕ не загружает в слой полученных данных. То что данные загружаются проверил способом описанным выше $(«#res»).load(«page.htm»,function(date){alert(data)}); IE благополучно выкинул сообщение с кодом загружаемой страницы. То что данная страница грузится так как положено это потому что на ней load совсем не лоад,а загрузка в ифрейм…..JSON работает только в ИЕ,в опере ни один кошак не отобразился……………Как быть???
То что данная страница грузится так как положено это потому что на ней load совсем не лоад,а загрузка в ифрейм…JSON работает только в ИЕ….
Зачем Вы бред несете? Вот Вам прямая ссылка на страницу с кошаками http://www.linkexchanger.su/example_jquery_ajax/getjson.html и на всякий случай на пример с load() http://www.linkexchanger.su/example_jquery_ajax/load.html чтобы Вас ифреймы не смущали…
Подскажите плз, можно ли передать GET или POST параметры не целому php, а только некоторой функции в этом файле? А то как я понял, на каждый AJAX запрос надо создавть php файл.
See….
http://moneymaster.ru/tutor/php1/gl2_2.php.htm
это то понятно, с php проблем нет, интересно было можно ли это сделать на стороне клиента.
Пользовался я библиотекой AJAXAGENT так вот там было такое agent.call(‘url_file.php’, ‘ServerFunction’, ‘ClientFunction’, param1, param2, …, paramN)
Удобно.
Осознал я ошибку свою, видно метод Пули самый верный, спасибо ему что открыл глаза мне..
Проблема следующая:
через jquery.ajax в див вставляется html из сформированного php
после этого е получается обратится через к конструкцию $(«a.class_name»).click() к элементам этого ХТМЛ кода, как будто его и нет вообще хотя на экране он появляется.
Как сделать так чтоб он видел элементы и реагировал на события.
Пробовал и в ФФ и в ИЕ – нигде не получается…
Помогите плиз.
Геннадий, пожалуйста подскажите новичку как реализовать на сайте комментарии следующим образом – после нажатия кнопки submit данные передавались сразу на страницу не обновляя ее, и без мета тегов refresh
Собственно Вы комментарий-то к той самой статье написали, которую читать нужно… Довольно подробно расписано. Вы на простеньких примерах попробуйте потренироваться и думаю уже вскоре сможете сами реализовать нужный функционал.
To Данил: приношу извинения, что не сразу отвечаю, как то пропустил Ваш комментарий. Проблема просто решается. Читайте:
Обработка событий для элементов DOM, загружаемых через ajax – это чтобы понять суть проблемы.
Плагин Live Query – это полезно тоже, если используете версию до 1.3
Если пользуетесь 1.3 и выше смотрите метод live().
Gennady буду стараться.
Здравствуйте, Gennady!
Хотелось бы задать такой вопрос: мне нужно, чтобы js-функция (например, function1) вызывала php-функцию (например, function2). Как это сделать с помощью jQuery?
Елена, разница между php и js в том, что php – это язык на котором пишутся серверные сценарии, тогда как js – язык на котором создаются сценарии на стороне клиента. Так что Ваш вопрос несколько неверно сформулирован. Можно говорить о том, как с помощью jQuery отправить ajax-запрос серверному сценарию, написанному на php, передать тому какие-либо данные и т.д.
Но все это описано как раз в этой статье.
Вы правы, Gennady, я неверно сформулировала вопрос. Я использую на стороне сервера библиотеку jQuery PHP, которая позволяет отправлять запрос файлу. Вот у меня и промелькнула мысль о том, как хорошо было бы отправлять запрос запрос файлу, а не функции. Спасибо за ответ.
добрый день. Столкнулся с тем, что не могу загрузить файл через $(post) необходимо не перезагружая страницу копирнуть файл и отобразить его на страничке. Подскажите как отправить через пост что-то типа в html
$.ajax({ type: 'POST', data: 'a=1', url: 'someurl.php', success: function(answ){ $('#result').html(answ); } });Это пример ajax-запроса типа POST с передачей в параметре а значения 1. Запрос отправляется к файлу someurl.php, который находится в той же папке, что и файл, отправляющий запрос. При успешном выполнении запроса, в элемент, который имеет id=’result’ будет вставлен ответ сервера, который заменит содержимое элемента (если оно было). В примере подразумевается, что вставлен ответ будет в виде HTML-кода. Ну и конечно файл someurl.php должен в результате своей работы должен в итоге родить что-то вроде:
То, что выведется на сервере через print – будет отображено в клиенте.
Комментирование статьи завершено. Обсуждение статьи можно продолжить на форуме jQuery.