Запросы способом Script подразумевают только GET и имеют сложности с отслеживанием ошибок. Но зато - их можно делать на любые домены,
что и составляет основную область применения этого транспорта.
Любые таги можно создавать через DOM и добавлять к документу. Если создать узел <script> со ссылкой на внешний исходник,
то при добавлении тэга в документ запустится процесс загрузки. А ответный javascript сервер генерирует динамически и кладет туда нужные данные.
Следующая функция добавляет такой тэг к документу, с нужным id и src. Она добавляет элементы в head, так что не будет работать, если head нету.
function attachScript(id, src){
var element = dojo.doc.createElement("script")
element.type = "text/javascript"
element.src = src
element.id = id
document.getElementsByTagName("head")[0].appendChild(element)
}
Например, вызов
attachScript('script1','/service/newMail.js?name=Vasya')
добавит в head документа тег:
<script src="/http/javascript.ru/service/newMail.js?name=Vasya"></script>
Браузер тут же обработает тег: запросит newMail.js с заданного URL и выполнит.
Когда скрипт загрузится - он должен как-то объявить о себе, что данные подгружены и можно ими управлять.
Обычно для этого используется каллбэк, т.е в конце скрипта делается вызов специальной функции.
Чтобы четко указать, какому скрипту - какой каллбэк вызывать, имя функции передается отдельным параметром. Например,
...
// задать обработчик
var handler = function (data) { ... }
// получили номер для следующего скрипта
handlerId++
// на самом деле каллбек - не сам обработчик, а служебная функция,
// которая дополнительно обработает успешную загрузку и почистит ставший лишним тэг script
scriptHandlers['script_'+handlerId] = makeHandler(handler)
attachScript(handlerId, "/service/newMail.js?name=Vasya&callback=scriptHandlers.script_"+handlerId)
Сервер смотрит на значение параметра callback, и добавляет к скрипту вызов scriptHandlers.script_XXX, где script_XXX - значение параметра callback.
Обычно, сервер просто отдает данные клиенту, отвечая на запрос вызовом типа
scriptHandlers.script_XXX({sender:"Petya",senderId:6})
Такой формат называют JSONP: JSON with Padding, т.к для обмена данными используются javascript-объекты (не XML и т.п), и используется
дополнительная функция (padding).
Длина URL в GET-запросах ограничена. Она зависит от браузера-сервера, приблизительно 1kb - безопасное значение.
Поэтому для отправки на сервер бОльших фрагментов используется multipart-протокол.
Каждый запрос снабжается двумя параметрами: уникальным ID и номером части part.
Первый элемент multipart-запроса имеет part=1, последний - не имеет параметра part. Сервер, таким образом, может подсчитывать полученные куски.
При каждом запросе создается таймер. При успешном запросе - таймер очищается. Через 10 секунд таймер срабатывает и генерирует ошибку запроса.
Такая обработка - гораздо хуже, чем есть в iframe или XmlHttpRequest, где ошибка со стороны сервера (404,500) становится видна сразу.