Кросс-доменный Ajax
Для многих, начавших изучение Ajax является неприятным сюрпризом, что объект XMLHttpRequest не разрешает кросс-доменные запросы. В частности, это не позволяет использовать технологию Ajax для разработки клиентского кода для веб-сервисов (без использования ретрансляции запросов через "родной" веб-сервер). В новой спецификации объекта XMLHttpRequest ограничение на кросс-доменные запросы снято, однако насколько скоро это будет поддержано разраотчиками веб-браузеров остается только предполагать.
Использовать кросс-доменный Ajax можно уже сегодня при помощи динамического создания элементов SCRIPT и загрузки кода JavaScript. При этом возникают несколько проблем, часть из которых можно решить, а часть из которых не поддается простому решению. Давайте рассмотрим эти проблемы.
Прежде всего в разных веб-браузерах код будет действовать по-разному и потребуются разные подходы. Например, в некоторых веб-браузерах загрузка начинается в момент присвоения свойству src нового значения, а в других - только при присоединении элемента SCRIPT к дереву DOM документа. В некоторых веб-браузерах можно повторно использовать элементы SCRIPT для загрузки новых скриптов, а других нет.
Проблемой является вызов функции-обработчика и передача ему параметров. В спецификации HTML, к сожалению не специфицированы события, вызывающиеся по загрузке скрипта (аналогично body.onload) и эти события у различных версий веб-браузеров будут разные.
Вы, наверное, уже заждались кода, решающего эти проблемы. Вот он. Некоторые подробности обсудим далее.
К запросу добавляется параметр rand=Math.random(). Это необходимо, если скрипты генерируются динеамически и Вам необходимо избежать использование кэшированных скриптов. Если скрипты статические - можно удалить этот параметр.
function sendScriptRequest(url, httpParams, callback, callbackArgsArray) {
var currentScript = document.createElement("SCRIPT");
if (httpParams)
httpParams="?rand=" + Math.random() + "&" + httpParams;
else
httpParams="?rand=" + Math.random();
currentScript.ajax_readyState = false;
currentScript.onload = scriptCallback(currentScript, callback, callbackArgsArray);
currentScript.onreadystatechange = scriptCallback(currentScript, callback, callbackArgsArray);
currentScript.src = url + httpParams;
document.getElementsByTagName("script")[0].parentNode.appendChild(currentScript);
}function scriptCallback(currentScript, callback, callbackArgsArray){
return function() {
if (currentScript.ajax_readyState)
return;
if (! currentScript.readyState || currentScript.readyState == "loaded" || currentScript.readyState == "complete") {
currentScript.ajax_readyState = true;
callback.apply(currentScript, callbackArgsArray)
currentScript.parentNode.removeChild(currentScript);
}
}
}
К нерешенной проблеме относится то, что ответом на запрос является выполнение кода. И если Вам необходимо получить его в виде строки вроде responseText, Вам придется в генерируемом сервером скрипте присвоить єто значение переменной, например:
var responseText = "abc123" ;
Тогда вызов функции может быть таким
sendScriptRequest("http://test123.com", "a=1&b=2",myCallback, ["test123"]);
function(a) {
alert(responseText); // это переменная из загружаемого скрипта var responseText = "abc123" ;
alert(a) ; этот параметр задается при вызове функции как ["test123"]
}
Более подробно об этом и многом другом Вы можете прочитать в моей книге Овчаренко А. Ajax на примерах
14.03.2010 (12:17)
Что означает переменая myCallback?
29.04.2010 (23:00)
Вот все везде пишут эти функции, на десятках сайтов сегодня вижу одни и те же функции, копируют друг у другу, а толку...
Ну неужели так сложно написать нормальный полный код. Что-то я сомневаюсь что когда я вставлю код приведённый выше в страницу он будет работать... видимо ещё нужны теги скрипта и т.д. Неужели сложно написать всё в примерах, доступно, понятно, прокомментировать? Написали функции и всё...
Вот все умные, вот скажите, пожалуйста, перерыл сегодня сотни две сайтов и ни на одном не нашёл примера простого скрипта, нужно всего навсего, чтобы часть страницы обновлялась без перезагрузки всей страницы!
Подскажите, пожалуйста, кто-нибудь... я Вас умоляю...
18.05.2010 (11:11)
хм.. что не верится что будет работать, но проверю
27.05.2010 (22:24)
Сорри, не отследил когда началось обсуждение заметки
>> Что означает переменая myCallback?
В тексте примера ошибка. Надо читать как
function(a) myCallback{
alert(responseText); // это переменная из загружаемого скрипта var responseText = "abc123" ;
alert(a) ; этот параметр задается при вызове функции как ["test123"]
}
27.05.2010 (22:34)
>>нужно всего навсего, чтобы часть страницы обновлялась без перезагрузки всей страницы!
>>Подскажите, пожалуйста
Вы должны хорошо ориентироваться в JavaScript, HTML и XML. Можно порекомендовать подробное tutorial по адресу
http://javascript.ru/ajax/intro
(написано не мною, не скрытая реклама)
12.06.2010 (22:33)
Пожалуй, самая толковая статья про кросс-доменный AJAX. Мучался довольно долго, пока смог привести данные коды к рабочему состоянию, но, как справедливо заявляет автор, "Вы должны хорошо ориентироваться в JavaScript, HTML и XML". Разобраться можно.
Упрощенные рабочие коды, может, кому пригодится: http://leningrad00.jino-net.ru/it-solutions/cross-ajax/
12.04.2011 (17:26)
Выложи нормальный рабочий пример.
12.04.2011 (18:04)
Думаете, так будет легче?
Вот нам форма, где мы будем жмакать на кнопочки:
javascript, вызывающий удаленный php-скрипт:
PHP-скрипт ajax.php, который возвращает нам виртуальный javascript:
12.04.2011 (18:11)
А теги вырезаются. Гы-гы.
Наш опыт по внедрению с конкретными рабочими примерами: http://ifolder.ru/22923763
Ссылка будет жить месяц.