javascript - 获取调用函数的脚本标记的节点引用

时间:2009-12-16 21:22:01

标签: javascript

如何获得对调用函数的DOM脚本标记的引用?

例如:

<script type="text/javascript">
    var globalfunc = function(){
        //obtain a reference to the script block that globalfunc() was called from
    }
</script>

<script type="text/javascript">
    globalfunc();
</script>

我知道我可以为脚本元素分配一个id或类,并将其传递给我的函数来进行DOM查找,但我认为没有这样的事情就可以更灵活,更优雅。主要原因是我可能不得不在我们的网站上做一些工作以使第三方广告陷入困境,我们无法控制他们用来加载广告的脚本。

3 个答案:

答案 0 :(得分:2)

假设脚本标记没有延迟,当函数执行时,它应该来自页面中的最后一个脚本标记。像

这样的东西
var scripts = document.getElementsByTagName("script");
var scriptElement = scripts[scripts.length-1];

应该得到参考。

您应该将原始函数包装在您自己的构造中以插入此代码,例如:

var old_global = globalFunction;
globalFunction = function () {
    var scripts = document.getElementsByTagName("script");
    var scriptElement = scripts[scripts.length-1];

    old_global.call(this,arguments);

    // do something after
};

此代码未经测试,但可能会给您提供这个想法。

答案 1 :(得分:1)

实际上,如果想要拥有有效标记,则无法将类或ID分配给script元素。也就是说,我已经使用了这种方法,是的确有效。

或者,并让记录显示我永远不会这样做,你可以这样做:

var scripts = document.getElementsByTagName("script");

for (var i=0, l=scripts.length; i<l; ++i ) {
  if ( scripts[i].innerHTML.indexOf("globalfunc();") != -1 ) {
     // Found a script tag in which `globalfunc();` is executed
  }
}

答案 2 :(得分:1)

这是我的解决方案:它可以在除IE之外的每个浏览器中工作,它需要你捕获一个真正的错误(好吧它不适用于Firefox,但其他浏览器都这样做),你必须从外部脚本调用它({ {1}})使用它。

<script src="...">

用法

var getErrorScriptNode = (function () {
    var getErrorSource = function (error) {
        var loc, replacer = function (stack, matchedLoc) {
            loc = matchedLoc;
        };

        if ("fileName" in error) {
            loc = error.fileName;
        } else if ("stacktrace" in error) { // Opera
            error.stacktrace.replace(/Line \d+ of .+ script (.*)/gm, replacer);
        } else if ("stack" in error) { // WebKit
            error.stack.replace(/at (.*)/gm, replacer);
            loc = loc.replace(/:\d+:\d+$/, "");
        }
        return loc;
    },
    anchor = document.createElement("a");

    return function (error) {
        anchor.href = getErrorSource(error);
        var src = anchor.href,
        scripts = document.getElementsByTagName("script");
        anchor.removeAttribute("href");
        for (var i = 0, l = scripts.length; i < l; i++) {
            anchor.href = scripts.item(i).src;
            if (anchor.href === src) {
                anchor.removeAttribute("href");
                return scripts.item(i);
            }
        }
    };
}());

在调用var globalfunc = function (err) { var scriptNode = getErrorScriptNode(err); // ... }; 的外部(必须是EXTERNAL)脚本中:

globalfunc()