**
关于获取正在运行的script标签兼容问题
**
关于这个问题我查过资料,有一篇博客写的一个兼容特别全,用的是强制报错兼容浏览器,但是它只能获取到正在运行的script标签的路径。
这个地址是大神写的好几个版本的兼容,我只拿出来了第四版的兼容 。
http://www.cnblogs.com/rubylouvre/archive/2013/01/23/2872618.html
代码
function getCurrentScript() {
//取得正在解析的script节点
if(DOC.currentScript) { //firefox 4+
return DOC.currentScript.src;
}
// 参考 https://github.com/samyk/jiagra/blob/master/jiagra.js
var stack;
try {
a.b.c(); //强制报错,以便捕获e.stack
} catch(e) {//safari的错误对象只有line,sourceId,sourceURL
stack = e.stack;
if(!stack && window.opera){
//opera 9没有e.stack,但有e.Backtrace,但不能直接取得,需要对e对象转字符串进行抽取
stack = (String(e).match(/of linked script \S+/g) || []).join(" ");
}
}
if(stack) {
/**e.stack最后一行在所有支持的浏览器大致如下:
*chrome23:
* at http://113.93.50.63/data.js:4:1
*firefox17:
*@http://113.93.50.63/query.js:4
*opera12:
*@http://113.93.50.63/data.js:4
*IE10:
* at Global code (http://113.93.50.63/data.js:4:1)
*/
stack = stack.split( /[@ ]/g).pop();//取得最后一行,最后一个空格或@之后的部分
stack = stack[0] == "(" ? stack.slice(1,-1) : stack;
return stack.replace(/(:\d+)?:\d+$/i, "");//去掉行号与或许存在的出错字符起始位置
}
var nodes = head.getElementsByTagName("script"); //只在head标签中寻找
for(var i = 0, node; node = nodes[i++];) {
if(node.readyState === "interactive") {
return node.className = node.src;
}
}
}
之后我想能获取到src的值,那么我给这个src的值后边加一个时间戳,通过这个时间戳再html里匹配找到这个标签。
代码
function getCurrentScript() { //兼容获取正在运行的js
//取得正在解析的script节点
if(document.currentScript) { //firefox 4+
return document.currentScript;
}
var nodes = document.getElementsByTagName("script"); //只在head标签中寻找
for(var i = 0, node; node = nodes[i++];) {
if(node.readyState === "interactive") {
return node.className = node;
}
}
var stack, i;
try {
a.b.c(); //强制报错,以便捕获e.stack
} catch(e) { //safari的错误对象只有line,sourceId,sourceURL
stack = e.stack;
if(!stack && window.opera) {
//opera 9没有e.stack,但有e.Backtrace,但不能直接取得,需要对e对象转字符串进行抽取
stack = (String(e).match(/of linked script \S+/g) || []).join(" ");
}
}
if(stack) {
/**e.stack最后一行在所有支持的浏览器大致如下:
*chrome23:
* at http://113.93.50.63/data.js:4:1
*firefox17:
*@http://113.93.50.63/query.js:4
*opera12:
*@http://113.93.50.63/data.js:4
*IE10:
* at Global code (http://113.93.50.63/data.js:4:1)
*/
stack = stack.split(/[@ ]/g).pop(); //取得最后一行,最后一个空格或@之后的部分
stack = stack[0] == "(" ? stack.slice(1, -1) : stack;
var s = stack.replace(/(:\d+)?:\d+$/i, ""); //去掉行号与或许存在的出错字符起始位置
var d = document.getElementsByTagName("script"); //获取tag名称为script的html元素们
var timstamp = new Date().getTime();
for(i = 0; i < d.length; i++) {
if(d[i].src == s) {
d[i].src = d[i].src + "?t=" + timstamp;
var getCurrentScriptUrl = d[i].src
return stackScript(getCurrentScriptUrl)
}
}
}
}
function stackScript(parameter) {
var b = document.getElementsByTagName("script");
for(var i = 0; i < b.length; i++) {
if(b[i].src == x) {
console.log(b[i])
return b[i]
}
}
}
这样就能获取到正在运行的script标签。