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

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

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

我想获得“script.js”文件的内容。 我在document.getElementById("myscript").text但在这种情况下不起作用。

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

你能详细说明你想要完成什么吗?

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

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

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

对于其余的,阿贾克斯仍然是首选的方式。

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

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

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

我有同样的问题。 似乎没有一种方法(短ajax)来解决这个问题在html文件中。 但是,当我在php中,至less,以下已被certificate是非常有帮助的:

 <script type="text/javascript" id="myScript"><?php readfile('filepath/myScript.js'); ?></script> 

然后,您可以使用普通的getElementById('myScript').text;来获取脚本标记的内容getElementById('myScript').text;

.text没有得到你的标签内容,只是你的开放标签和你的结束标签之间没有任何东西。 你可以使用.src得到元素的src属性,然后如果你想得到javascript文件,你可以按照链接并为它做一个ajax请求。

在对我以前的回答发表评论:

我想存储脚本的内容,以便我可以将其caching并在一段时间后直接使用,而不必从外部Web服务器(不在同一台服务器上)

在这种情况下,最好使用服务器端脚本来获取并caching脚本文件。 根据您的服务器设置,您可以使用文件(定期通过cron,如果您希望更改),或者使用您select的语言的小脚本进行类似的操作。

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

 document.getElementById("myscript").innerHTML 

但是,@olle在另一个答案中说,你可能想读一读: http ://ejohn.org/blog/degrading-script-tags/

是的,就像在公认的答案中一样,Ajax就是这样做的。 如果你深入细节,有许多陷阱。 如果你使用jQuery.load(...) ,假设错误的内容types(html而不是application / javascript),这可以通过将不需要的内容放入你的(scriptNode).innerText和类似的东西。 然后,如果你使用jQuery.getScript(...) ,下载的脚本立即执行,这可能不是你想要的(可能会jQuery.getScript(...)你想要加载文件的顺序,如果你有几个。)

我发现最好使用jQuery.ajaxdataType: "text"

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

这里是代码,testing和工作:

 <!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> 

相关的问题

如果您正在寻找访问<script>标签的属性而不是script.js的内容,那么XPath可能就是您要做的。

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

如果它是您之后的example.js文件内容,那么您可以触发一个AJAX请求来获取它。

如果提供了一个src属性,用户代理需要忽略元素的内容 ,如果你需要从外部脚本访问它,那么你可能做错了什么。

更新:我看到你已经添加了一个评论,说明你想要caching脚本并在以后使用它。 为了什么目的? 假设你的HTTPcaching是友好的 ,那么你的caching需求很可能已经被浏览器处理了。

我build议这个问题的答案是使用DOM元素的“innerHTML”属性。 当然,如果脚本已经加载 ,您不需要进行Ajax调用即可获取它。

所以Sugendran应该是正确的(不知道为什么他被拒绝而没有解释)。

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

脚本元素的innerHTML属性应该以脚本元素的forms为您提供脚本内容:

  • 内联脚本,或
  • 该脚本已加载(如果使用src属性)

olle也给出了答案,但是我认为他的build议是需要先通过ajax加载才能“混淆”,我认为他的意思是“内联”而不是两者之间。

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


关于这种技术的有用性:

我看过使用这种技术来处理客户端的错误日志logging(javascriptexception)后,得到“未定义的variables”,这些未包含在我自己的脚本中(比如从工具栏或扩展插入糟糕的脚本) – 所以我不认为这是一个出路的想法。

使用2008风格的DOM绑定,它宁可是:

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

希望你已经在使用一些 JavaScript库…

如何获取src属性的值,URL,然后使用库的Ajax工具向该URL发出请求,并在需要的地方保存该结果?

具体的细节取决于你正在使用的图书馆。

不知道为什么你需要这样做?

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