18 September 2006

Как обойти модель безопасности JavaScript

Довольно часто возникает задача -- подгружать данные динамически. В случае, если источник данных находится на том же домейне, что и загруженный скрипт, то модель безопастности бразуера позволит обратится к нему при помоэи XmlHttpRequest (если совпадают протокол, доменное имя и порт в URL с которого загружен JavaScript и с которого запраиваются данные).

В противном случае возможно загрусить данные с удаленного сайта, только создав динамически таг <script> и указав все данные запроса в URL, в виде GET запроса.
Код который загрузится с удаленного сайта должен вызвать какую-либо функцию JavaScript, что бы сообщить об успешной загрузке данных.

Такой подход реализован в библиотеке Subsys_JsHttpRequest.

А упрощенный вариант реализован в SimpleXMLRPC -- библиотеке, которая реализует несколько разных типов запросов (XMLRPC, получение JSON-кодированных данных при помощи POST запроса и получение данных при помощи включения .js файла с удаленного сервера).

Вот что делает код библиотеки --

span = document.createElement("SPAN");
span.id = "__jsload__" + id;
span.style.display = 'none';
span.innerHTML = 'Text for stupid IE.' +
'';
s = span.getElementsByTagName("script")[0];
s.language = "JavaScript";
document.body.appendChild(span);
setTimeout(function() { if (s.setAttribute) s.setAttribute('src', href); else s.src = href; }, 10);


Т.е. создается span, в нем таг script, a потом в качестве src у скрипта ставится URL. После добавления скрипта в DOM дерево при помощи appendChild начинается скачивание JS скрипта.

После того, как он был скачан -- можно либо обращаться к его переменным и функциям, так как js файл полностью импортируется в область видимости(scope) загружающе программы --
при условии, что загруженный файл имел в себе правильный JS код, либо -- как это делает SimpleXMLRPC -- JS файл состоит из строчки типа
XMLRPC.dataReceived(id, ActualData);
, которая и дает знать вызывающему скрипту, что данные уже загружены.

PS. нужно быть внимательным и удалять старые, ненужные объекты <script>

Author: Gaspar Chilingarov
Keywords: javascript, ajax, web 2.0, xmlrpc, json-rpc, simplexmlrpc

No comments: