Не удается загрузить скрипт в виде обычного текста с помощью AJAX
-
20-12-2019 - |
Вопрос
У меня есть файл 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")
.)