如果我有这样的脚本标记:
<script
id = "myscript"
src = "http://www.example.com/script.js"
type = "text/javascript">
</script>
我想获取“script.js”文件的内容。我正在考虑像document.getElementById("myscript").text
这样的东西,但在这种情况下它不起作用。
答案 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 脚本代码不受CORS和same-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访问它。
答案 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.ajax
与dataType: "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>
答案 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属性应该为脚本提供字符串内容。olle也给出了答案,但我认为它被“混乱”表示需要首先通过ajax加载,我认为他的意思是“内联”而不是之间。
如果你在哪里有js,你可以通过innerHTML访问它。
关于此技术的用处:
在获得未包含在我自己的脚本中的“未定义变量”(例如从工具栏或扩展中注入错误的脚本)之后,我已经尝试将此技术用于客户端错误日志记录(javascript异常) - 所以我不要以为这是一个出路的想法。
答案 15 :(得分:-5)
不确定为什么需要这样做?
另一种方法是将脚本保存在某个隐藏元素中并使用Eval运行它。然后,您可以查询对象innerHtml属性。