【问题标题】:Can't load script as plain text with AJAX无法使用 AJAX 将脚本作为纯文本加载
【发布时间】:2013-11-15 15:38:37
【问题描述】:

我在无法修改的服务器中有一个 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);
});

但是当我使用dataType = "text" 进行下载请求时,AJAX 会引发错误。有什么办法可以解决这个问题并将其实际下载为文本?

P.S:该脚本用于 Firefox OS 特权应用程序,因此我无法将脚本直接放在 html 页面中,因为安全 CSP 不允许 (https://developer.mozilla.org/en-US/Apps/CSP)。

【问题讨论】:

  • 您可以在实际进行 Ajax 调用的地方添加代码吗?使用document.write 的脚本是怎么回事?
  • 这在我的网站上对我有用:$.ajax({ url: "ascript.js", dataType: "text", success: function(script) { console.log(script); } });
  • Matt: document.write 在异步调用中的问题是脚本没有直接和文档直接链接,所以它不知道应该把变量写到哪里。我从这里学到的:stackoverflow.com/questions/13003644/…。另外,我添加了在问题中进行调用的代码部分
  • 我猜你想在这里重塑JSONP。如果您无法修改脚本以在其中实现 JSONP,请确保它不存在。
  • “但是 AJAX 抛出错误” — 什么错误?!

标签: javascript jquery ajax firefox-os


【解决方案1】:

由于您似乎能够以某种方式成功运行脚本,所以这是一个可能可行的糟糕主意:覆盖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") 调用它。)

【讨论】:

  • 成功了!!谢天谢地,我没有在我的应用程序中使用 document.write,所以它没有引起任何问题,我从脚本中检索了我想要的信息......我仍然会警惕 document.write,以防万一使用它,就像你说的那样创建引用。
  • 根据您的 cmets,我可能会建议一种可能的替代方案:尝试 jQuery.support.cors = true。有可能是 Firefox 应用环境导致 jQuery 认为不允许跨域请求,所以可以明确告诉 jQuery 允许。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多