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

时间:2008-09-29 12:15:53

标签: javascript

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

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

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

16 个答案:

答案 0 :(得分:10)

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

你能详细说明你想要完成的事情吗?

答案 1 :(得分:10)

我知道它有点晚,但有些浏览器支持标签LINK rel="import"属性。

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

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

对于其他人来说,ajax仍然是首选方式。

答案 2 :(得分:5)

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

答案 3 :(得分:3)

tl; dr 脚本代码不受CORSsame-origin-policy约束,因此javascript / DOM无法访问通过{{{{}}加载的资源的文本内容1}}标记,否则会中断<script>

长版: 大多数其他答案(以及接受的答案)正确指出“正确的”方式来获取通过加载到页面中的same-origin-policy插入的javascript文件的文本内容,正在使用XMLHttpRequest对脚本<script>属性中指示的资源执行另一个单独的额外请求,以下简短的javascript代码将演示此内容。然而,我发现其他答案并没有解决为什么要获取javascript文件文本内容,即允许访问src所包含文件内容的内容会破坏<script src=[url]></script>政策,例如现代浏览器会阻止不提供Access-Control-Allow-Origin标头的资源的XHR,因此浏览器不允许除CORS之外的任何其他方式获取内容。

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

CORS

所以我不会重复这一点,而是希望通过这个答案添加为什么呢

答案 4 :(得分:0)

如果你想要src属性的内容,你必须做一个ajax请求并查看responsetext。如果你在哪里有js,你可以通过innerHTML访问它。

这可能是有趣的:http://ejohn.org/blog/degrading-script-tags/

答案 5 :(得分:0)

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

答案 6 :(得分:0)

在对我之前的回答的评论中:

  

我想存储脚本的内容,以便我可以将其缓存并在以后的某个时间直接使用,而无需从外部Web服务器(而不是与页面在同一服务器上)获取它

在这种情况下,最好使用服务器端脚本来获取和缓存脚本文件。根据您的服务器设置,您可以只是忘记文件(如果您希望更改,则定期通过cron)或使用您选择的语言使用小脚本执行类似操作。

答案 7 :(得分:0)

是的,Ajax就是这样做的方式,就像接受的答案一样。如果你了解细节,那就有很多陷阱。如果您使用jQuery.load(...),则会假定错误的内容类型(html而不是application / javascript),这可能会通过将不需要的<br>放入您的(scriptNode).innerText以及类似的东西来搞乱。然后,如果您使用jQuery.getScript(...),则会立即执行下载的脚本,这可能不是您想要的(如果您有多个文件,可能会搞乱加载文件的顺序。)< / p>

我发现最好将jQuery.ajaxdataType: "text"

一起使用

我在带有框架集的项目中使用了这种Ajax技术,其中框架集和/或几个框架需要相同的JavaScript,以避免服务器多次发送该JavaScript。

以下是代码,测试和工作:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
    <head>
        <script id="scriptData">
            var scriptData = [
                { name: "foo"    , url: "path/to/foo"    },
                { name: "bar"    , url: "path/to/bar"    }
            ];
        </script>
        <script id="scriptLoader">
            var LOADER = {
                loadedCount: 0,
                toBeLoadedCount: 0,
                load_jQuery: function (){
                    var jqNode = document.createElement("script");
                    jqNode.setAttribute("src", "/path/to/jquery");
                    jqNode.setAttribute("onload", "LOADER.loadScripts();");
                    jqNode.setAttribute("id", "jquery");
                    document.head.appendChild(jqNode);
                },
                loadScripts: function (){
                    var scriptDataLookup = this.scriptDataLookup = {};
                    var scriptNodes = this.scriptNodes = {};
                    var scriptNodesArr = this.scriptNodesArr = [];
                    for (var j=0; j<scriptData.length; j++){
                        var theEntry = scriptData[j];
                        scriptDataLookup[theEntry.name] = theEntry;
                    }
                    //console.log(JSON.stringify(scriptDataLookup, null, 4));
                    for (var i=0; i<scriptData.length; i++){
                        var entry = scriptData[i];
                        var name = entry.name;
                        var theURL = entry.url;
                        this.toBeLoadedCount++;
                        var node = document.createElement("script");
                        node.setAttribute("id", name);
                        scriptNodes[name] = node;
                        scriptNodesArr.push(node);
                        jQuery.ajax({
                            method   : "GET",
                            url      : theURL,
                            dataType : "text"
                        }).done(this.makeHandler(name, node)).fail(this.makeFailHandler(name, node));
                    }
                },
                makeFailHandler: function(name, node){
                    var THIS = this;
                    return function(xhr, errorName, errorMessage){
                        console.log(name, "FAIL");
                        console.log(xhr);
                        console.log(errorName);
                        console.log(errorMessage);
                        debugger;
                    }
                },
                makeHandler: function(name, node){
                    var THIS = this;
                    return function (fileContents, status, xhr){
                        THIS.loadedCount++;
                        //console.log("loaded", name, "content length", fileContents.length, "status", status);
                        //console.log("loaded:", THIS.loadedCount, "/", THIS.toBeLoadedCount);
                        THIS.scriptDataLookup[name].fileContents = fileContents;
                        if (THIS.loadedCount >= THIS.toBeLoadedCount){
                            THIS.allScriptsLoaded();
                        }
                    }
                },
                allScriptsLoaded: function(){
                    for (var i=0; i<this.scriptNodesArr.length; i++){
                        var scriptNode = this.scriptNodesArr[i];
                        var name = scriptNode.id;
                        var data = this.scriptDataLookup[name];
                        var fileContents = data.fileContents;
                        var textNode = document.createTextNode(fileContents);
                        scriptNode.appendChild(textNode);
                        document.head.appendChild(scriptNode); // execution is here
                        //console.log(scriptNode);
                    }
                    // call code to make the frames here
                }
            };
        </script>
    </head>
    <frameset rows="200pixels,*" onload="LOADER.load_jQuery();">
        <frame src="about:blank"></frame>
        <frame src="about:blank"></frame>
    </frameset>
</html>

related question

答案 8 :(得分:-1)

如果您要访问<script>标记的属性而不是script.js的内容,那么XPath可能就是您所追求的目标。

它将允许您获取每个脚本属性。

如果是你正在使用的example.js文件内容,那么你可以触发一个AJAX请求来获取它。

答案 9 :(得分:-1)

这很有趣,但我们不能,我们必须通过互联网再次获取它们。

浏览器可能会读取他的缓存,但仍会发送 ping 以验证内容长度。

[...document.scripts].forEach((script) => {
  fetch(script.src)
      .then((response) => response.text() )
      .then((source) => console.log(source) )

})

答案 10 :(得分:-2)

如果提供了src属性,则用户代理为required to ignore the content of the element,如果您需要从外部脚本访问它,那么您可能做错了。

更新:我看到你添加了一个注释,表示你要缓存脚本并在以后使用它。到底是什么?假设您的HTTP is cache friendly,那么您的缓存需求可能已由浏览器处理。

答案 11 :(得分:-2)

使用2008风格的DOM绑定它宁愿:

document.getElementById('myscript').getAttribute("src");
document.getElementById('myscript').getAttribute("type");

答案 12 :(得分:-2)

希望您已经在使用一些 JavaScript库...

如何获取src属性的值,URL,然后使用库的Ajax工具向该URL发出请求并将结果保存到您希望的位置?

具体细节因您使用的库而异。

答案 13 :(得分:-2)

您想使用innerHTML属性来获取脚本标记的内容:

document.getElementById("myscript").innerHTML

但正如@olle在另一个回答中所说,你可能想读一下: http://ejohn.org/blog/degrading-script-tags/

答案 14 :(得分:-3)

我建议这个问题的答案是使用DOM元素的“innerHTML”属性。当然,如果脚本已加载,那么需要进行Ajax调用才能获得它。

所以Sugendran应该是正确的(不确定为什么他在没有解释的情况下被投票结果)。

var scriptContent = document.getElementById("myscript").innerHTML;

如果脚本元素为:

,脚本元素的innerHTML属性应该为脚本提供字符串内容。
  • 内联脚本或
  • 脚本已加载(如果使用src属性)

olle也给出了答案,但我认为它被“混乱”表示需要首先通过ajax加载,我认为他的意思是“内联”而不是之间。

  

如果你在哪里有js,你可以通过innerHTML访问它。


关于此技术的用处:

在获得未包含在我自己的脚本中的“未定义变量”(例如从工具栏或扩展中注入错误的脚本)之后,我已经尝试将此技术用于客户端错误日志记录(javascript异常) - 所以我不要以为这是一个出路的想法。

答案 15 :(得分:-5)

不确定为什么需要这样做?

另一种方法是将脚本保存在某个隐藏元素中并使用Eval运行它。然后,您可以查询对象innerHtml属性。