Кросс-доменные запросы в юзерскриптах Оперы
Все, кто хоть раз писал пользовательский сценарий, наверняка сразу же почувствовали разницу между подходами Opera Software ASA и Mozilla Foundation к этому хитрому делу. Не разглагольствуя особо, замечу лишь, что Опера позволяет перехватывать выполнение других скриптов, как внедренных, так и присоединенных. И это можно использовать в не совсем обычном контексте.
В своей документации разработчики Оперы упоминают, что для присоединенных сценариев работает свойство e.element.src , а для внедренных — e.element.text .
Но, оказыватся, для присоединенного сценария свойство .text прекрасно себе работает. Т.е., можно присоединить сценарий, получить его текстовое значение, а потом не запускать (e.preventDefault() ). Да и сам сценарий, строго говоря, может сценарием и не являться.
Ниже представлен пример такого запроса.
Пример предоставлен исключительно в образовательных целях. очень не советую использовать его «как есть» в своих скриптах ввиду того, что проверки «легитимности» нет — функция лежит в глобальной видимости и позволяет получить вообще любой файл.
/* объект window.opera доступен юзерскриптам только в основном потоке */
window.opera.addEventListener('BeforeScript', function(e){
/* если у объекта, представляющего тег script, нет метода __callback, то это обычный скрипт, и делать с ним ничего не надо */
if (!e.element.__callback) return true;
/* вызываем callback в области window, иначе получим ошибку с неправильным this */
e.element.__callback.call(window, e.element.text);
/* избегаем запуска этого скрипта */
e.preventDefault();
/* избегаем дальнейшую обработку скрипта */
e.stopPropagation();
/* capturing, скрипт заведомо не рассчитан на IE */
}, true);
/* функция, добавляющая «хитрый» script */
function getScriptedText(url, callback){
/* если к моменту запуска document.body еще не существует, создаем его вручную */
if (!document.body){
var body = document.createElement("body");
document.getElementsByTagName("html")[0].appendChild(body);
};
/* создаем скрипт и прицепляем к нему ссылку на функцию-обработчик */
var script = document.createElement("script");
script.src = url;
script.__callback = callback;
/* присоединяем скрипт к документу, далее передавая работу обработчику. */
document.body.appendChild(script);
};
/* прямой вызов */
getScriptedText('http://ya.ru/', alert);
/* вызов по событию */
document.addEventListener('DOMContentLoaded', function(){
getScriptedText('http://example.com', alert);
}, false);
Запрос содержимого производится асинхронно, т.е., может произойти в любой момент, не задерживая загрузку остального содержимого.
Кстати, «Здравствуй, дорогой дневничок…», это моя первая запись тут.
|
раз уж вы подняли эту тему может быть поможете?
постановка наверное классическая: есть два хоста требуется с одного на другой кинуть POST с данными и получить ответ
серверную часть изменить нет никакой возможности(те никаких политик/серверных прокси), ну и инклюдит себе какую то версию jQuery
сервер приемника принимает стандартный пост результат возвращает в text/html
, изменить теоретически можно, но сильно нежелательно( как бы необходимость в посте отпадет все через script тогда потечет)
через iframe form submit смог корректно отправить, но не могу получить ответ
в общем перепробовал уже много чего и пока мне неуд
возможен ли в принципе для userscript opera кроссдоменный post?(работающий ессно)
js для меня родным не является и возможно я не понимаю чего-то базового
буду рад туториалу=)
может все дело в моей сборке оперы
заранее спасибо
и кстати может вы в курсе что они имели ввиду
Это дело достаточно затруднительно технически. Но можно исхитриться, и сделать как-нибудь так:
Прошу прощения, что опять привожу схему без конкретных примеров, это был бы интересный скрипт, но у меня, увы, и так очень мало свобоного времени .
Большое спасибо! Именно то, что я искал.
Кстати, а что насчет безопасности? Для пользователя такого UserJS может быть составлена специальная страница со скриптом с заданным свойством __callback. А что, если запрашивается страница с конфиденциальными данными?
Может быть, это паранойя, но я бы сделал хэш callback'ов, а в свойство __callback записывал только ключ хэша.
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.