Не удается загрузить скрипт в виде обычного текста с помощью AJAX

StackOverflow https://stackoverflow.com//questions/20004761

Вопрос

У меня есть файл javascript на сервере, который я не могу изменить.

Вот пример скрипта, который я должен загрузить:

var tags = '';
tags += '<a href="#somelink"><img src="someimage.gif"/></a>;
document.write(tags);

Я начал загружать скрипт через AJAX и выполнять его, но столкнулся с проблемой "document.write не может быть выполнен при асинхронном вызове".

Поэтому я хотел загрузить скрипт в виде обычного текста и взять то, что мне нужно, из ответа и поместить его туда, куда он должен быть помещен на моей html-странице, не изменяя исходный скрипт.

$.ajax({
    type: "GET",
    url: "http://myurlexample.com",
    dataType: "text",
}).success(function(msg){
    console && console.log("The script was downloaded as text: "+msg);
}).error(function(object,status,errortxt){
    console && console.log("The script wasn't downloaded as text. The error:"+ errortxt);
});

Но AJAX выдает ошибку, когда я выполняю запрос на загрузку с помощью dataType = "text".Есть ли какой-нибудь способ обойти это и на самом деле загрузить его в виде текста?

P.s.:Скрипт предназначен для привилегированного приложения Firefox OS, поэтому я не могу поместить скрипт непосредственно на html-страницу, потому что CSP безопасности этого не разрешает(https://developer.mozilla.org/en-US/Apps/CSP).

Это было полезно?

Решение

Поскольку вы, кажется, способны бежать сценарий каким-то образом прошел успешно, вот ужасная идея, которая могла бы сработать:переписывать document.write.

Прежде чем запустить скрипт, выполните:

document.write = function(msg) {
    handleTagStringInApp(msg);
    delete document.write; // revert to original document.write when done
};
// now load execute the script...

где handleTagStringInApp это функция, которую вы пишете, которая каким-то образом обрабатывает строку тега.В основном это jsonp, но вы не можете настроить имя обратного вызова так, чтобы оно было чем-то ненавязчивым или полезным, и вместо этого должны использовать имя обратного вызова document.write.

Обратите внимание, что это будет действительно плохо если что-то еще в вашем приложении действительно необходимо использовать document.write.(Вы могли бы обойти это в своем собственном коде, сохранив ссылку на реальный document.write, например, используя var realDocWrite = document.write; при загрузке страницы и вызове ее с помощью realDocWrite.call(document, "whatever").)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top