关于获取正在运行的script标签兼容问题

**

关于获取正在运行的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标签。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值