Известно, что XmlHttpRequest в Opera срабатывает только в том домене, где открыт яваскрипт. Ниже я приведу способ, как миновать эту оплошность.
Для отправки информации на другой хост вместо XmlHttpRequest я использую простой DOM, создающий картинку, загружающую серверный скрипт с другого домена. Результатом может быть получено изображение. Вот пример скрипта, который только отсылает данные на сторонний сервер:
Как результат мы получили картинку, ею например можно заменить ту, которую «кликнули». Если наша задача только отослать данные, то картинку вовсе можно не подключать к document. А как же быть с другими результатами?
Как уже сказано выше с картинками в Opera нет проблем, они запрашиваются с любого домена. Только нам изображений не достаточно, нам числа подавай (например ID-пользователя). С небольшими числами пожалуй можно разрулить. Взять например размер картинки которую мы получили от сервера: ширина*256+высота даст нам возможность отобразить числа от 0 до 65535 или от -32767 до 32767. JPEG-картинка такого размера не будет слишком много весить.
Вот пример, скрипт отвечает Success! когда полученная от сервера картинка имеет ширину 290 пикс.
Это, господа, я описываю эволюцию инженерной мысли, как она у меня созревала. И вот, я добрался до самого интересного. Как же всё-таки сделать нормальный запрос к серверу и получить нормальный от него ответ: текст, или массив данных, или ещё что-нибудь? Хотел задать я вам этот вопрос, а впрочем, покумекал и дописал статейку сам (оказывается думать полезно ;)
Вспоминаем, у каких ещё тегов имеется параметр src? <script>! И начинаем мутить процедуру:
serverside.javascript.php содержит header('Content-type: text/javascript'); и конечно же все атрибуты, чтобы результаты не кешировались, а в теле будет прописан javascript. Для примера я поставил строчку, изменяющую содержимое ячейки result в нашем документе:
Вот и всё. Самый получился что ни есть, AJAX.
Уточняю, что все действия проводились для Opera 9.61, а предмет изучения — кроссдоменные AJAX запросы, которые стандартно в Опере запрещены. Данная тема ещё далеко не исчерпана, тут ещё есть над чем подумать:
— Создать библиотеку с набором функций, как MSXMLHTTP, только для кроссдоменных запросов.
— Научить Opera таким же образом делать запросы с методом POST (возможно ли это? думаю что посредством форм)
— Предлагайте… ;)
Рабочий пример лежит тут: www.blackcrystal.net/labs/operacrossdomainrequest/test.html
Серверные скрипты для теста тут: www.blackcrystal.net/labs/operacrossdomainrequest
Вы можете скачать себе пример (html-файл), открыть на localhost и протестить. Запросы на мой сервер срабатывают как часики. И не только в Opera ;-)
Отправляем данные и получаем результат — картинку
Для отправки информации на другой хост вместо XmlHttpRequest я использую простой DOM, создающий картинку, загружающую серверный скрипт с другого домена. Результатом может быть получено изображение. Вот пример скрипта, который только отсылает данные на сторонний сервер:
//тест первый
function postDataImage(addr) {
//создаём новую картинку
var img = document.createElement("img");
img.src = addr;
//если мы хотим сделать результат видимым пользователю,
//то эту картинку подключаем в документ
document.getElementById("result").appendChild(img);
}
//осуществляем "подобие" ajax-запроса таким образом
postDataImage("http://your.domain.com/serverside.image.php");Как результат мы получили картинку, ею например можно заменить ту, которую «кликнули». Если наша задача только отослать данные, то картинку вовсе можно не подключать к document. А как же быть с другими результатами?
Если результат — число
Как уже сказано выше с картинками в Opera нет проблем, они запрашиваются с любого домена. Только нам изображений не достаточно, нам числа подавай (например ID-пользователя). С небольшими числами пожалуй можно разрулить. Взять например размер картинки которую мы получили от сервера: ширина*256+высота даст нам возможность отобразить числа от 0 до 65535 или от -32767 до 32767. JPEG-картинка такого размера не будет слишком много весить.
Вот пример, скрипт отвечает Success! когда полученная от сервера картинка имеет ширину 290 пикс.
//тест второй
function postDataImageAndProcess(addr) {
//показываем сообщение Loading...
document.getElementById("result").innerHTML = "Loading ...";
//создаём картинку
var img = document.createElement("img");
img.src = addr;
//ставим триггер когда картинка загрузится
img.onload = function () {
//когда картинка загружена, проверяем её ширину
//если 290 пикселей, значит всё верно
var result = (this.width == 290) ?
"Success, image width 290px!" :
"Other result! Image width is not 290px";
document.getElementById("result").innerHTML = result;
}
}
//осуществляем "подобие" ajax-запроса таким образом
postDataImageAndProcess("http://your.domain.com/serverside.image.php");Это, господа, я описываю эволюцию инженерной мысли, как она у меня созревала. И вот, я добрался до самого интересного. Как же всё-таки сделать нормальный запрос к серверу и получить нормальный от него ответ: текст, или массив данных, или ещё что-нибудь? Хотел задать я вам этот вопрос, а впрочем, покумекал и дописал статейку сам (оказывается думать полезно ;)
Наконец, полноценный запрос/ответ
Вспоминаем, у каких ещё тегов имеется параметр src? <script>! И начинаем мутить процедуру:
//тест третий
function postDataScript(addr) {
//показываем сообщение Loading...
document.getElementById("result").innerHTML = "Loading ...";
//создаём объект
var awesome = document.createElement("script");
awesome.src = addr;
document.getElementsByTagName("head")[0].appendChild(awesome);
}
//осуществляем "подобие" ajax-запроса таким образом
postDataImageAndProcess("http://your.domain.com/serverside.javascript.php");serverside.javascript.php содержит header('Content-type: text/javascript'); и конечно же все атрибуты, чтобы результаты не кешировались, а в теле будет прописан javascript. Для примера я поставил строчку, изменяющую содержимое ячейки result в нашем документе:
document.getElementById("result").innerHTML = "Yes, it works";Вот и всё. Самый получился что ни есть, AJAX.
Уточняю, что все действия проводились для Opera 9.61, а предмет изучения — кроссдоменные AJAX запросы, которые стандартно в Опере запрещены. Данная тема ещё далеко не исчерпана, тут ещё есть над чем подумать:
— Создать библиотеку с набором функций, как MSXMLHTTP, только для кроссдоменных запросов.
— Научить Opera таким же образом делать запросы с методом POST (возможно ли это? думаю что посредством форм)
— Предлагайте… ;)
Рабочий пример лежит тут: www.blackcrystal.net/labs/operacrossdomainrequest/test.html
Серверные скрипты для теста тут: www.blackcrystal.net/labs/operacrossdomainrequest
Вы можете скачать себе пример (html-файл), открыть на localhost и протестить. Запросы на мой сервер срабатывают как часики. И не только в Opera ;-)
