如何获取指定为 <script> 标记的“src”的文件的内容?

IT技术 javascript
2021-01-28 10:56:56

如果我有这样的脚本标签:

<script
    id = "myscript"
    src = "http://www.example.com/script.js"
    type = "text/javascript">
</script>

我想获取“script.js”文件的内容。我正在考虑类似的事情,document.getElementById("myscript").text但在这种情况下不起作用。

6个回答

tl;dr脚本标签不受CORS同源策略的约束,因此 javascript/DOM 无法提供对通过<script>标签加载的资源的文本内容的访问,否则会破坏same-origin-policy.

长版本: 大多数其他答案(和接受的答案)正确地表明“正确”获取通过<script>加载到页面中插入的 javascript 文件的文本内容的方法是使用XMLHttpRequest执行另一个单独的附加请求脚本src属性中指示的资源,下面的简短 javascript 代码将演示一些内容。然而,我发现其他答案没有解决为什么要获取 javascript 文件文本内容的问题,即允许通过 访问包含的文件内容<script src=[url]></script>会破坏CORS策略,例如现代浏览器会阻止不支持的资源的 XHR提供访问控制允许来源标头,因此浏览器不允许以CORS,以外的任何其他方式获取内容。

使用以下代码(如其他问题“使用 XHR/AJAX”中所述),可以对文档中的所有非内联脚本标记执行另一个请求。

function printScriptTextContent(script)
{
  var xhr = new XMLHttpRequest();
  xhr.open("GET",script.src)
  xhr.onreadystatechange = function () {
    if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
      console.log("the script text content is",xhr.responseText);
    }
  };
  xhr.send();
}
Array.prototype.slice.call(document.querySelectorAll("script[src]")).forEach(printScriptTextContent);

所以我不会重复那个,而是想通过这个答案添加关于为什么它的方面

谢谢-这是解释了唯一的答案,为什么必须使用AJAX来检索往返到服务器的文本,为什么这是已经通过脚本标签加载是不可另外地。
2021-03-27 10:56:56

您想获取文件http://www.example.com/script.js的内容吗?如果是这样,您可以转向 AJAX 方法来获取其内容,假设它与页面本身驻留在同一台服务器上。

我想存储脚本的内容,以便我可以缓存它并在一段时间后直接使用它,而不必从外部 Web 服务器(与页面不在同一服务器上)获取它。
2021-03-15 10:56:56
@Qix 浏览器缓存是可靠的,但通常需要往返服务器(例如:检查 ETag)。使用本地存储可以防止这种往返。
2021-03-17 10:56:56
@Gizmo 那么为什么 Google 在本地存储中缓存脚本?浏览器缓存不可靠。
2021-03-25 10:56:56
如果是这样,请不要担心,浏览器会自行处理外部 JS 脚本的缓存。
2021-04-10 10:56:56

更新: HTML 导入现已弃用替代方案)。

---

我知道这有点晚了,但有些浏览器支持标签 LINKrel="import"属性。

http://www.html5rocks.com/en/tutorials/webcomponents/imports/

<link rel="import" href="/path/to/imports/stuff.html">

对于其余的,ajax 仍然是首选方式。

这个界面现在已经过时了。
2021-03-13 10:56:56
我正在寻找这个解决方案的部分原因是我没有使用网络服务器来提供页面(我直接从文件系统本地获取它),而且我认为你不能使用 xmlhttprequest w/o webserver。
2021-03-21 10:56:56
@Jose_X:您可以使用浏览器标志绕过该限制。我认为对于 Chrome,它在启动浏览器时类似于“--allow-file-access-from-files”。可能有一个 chrome://flags ( onextrapixel.com/2014/09/01/... )
2021-03-29 10:56:56

我认为内容不会通过 DOM 获得。您可以获取 src 属性的值并使用 AJAX 从服务器请求文件。

.text 确实为您提供了标签的内容,只是您的开始标签和结束标签之间没有任何内容。您可以使用 .src 获取元素的 src 属性,然后如果您想获取 javascript 文件,您可以点击链接并为其发出 ajax 请求。