有没有办法获得包含调用函数的内联JS脚本的DOM元素?

时间:2010-10-24 16:51:56

标签: javascript

例如

<script>
function foo(){...}
</script>

<div><script>foo();</script></div>
<span><script>foo();</script></span>

我想从div调用foo返回“abc”,从span调用时返回“123”。

这可能吗?

4 个答案:

答案 0 :(得分:3)

您可以在DOM中获取当前的最后一个元素。

内联<script>块中的代码在浏览器解析页面时执行。因此, 最后一个DOM元素就在脚本之前。

答案 1 :(得分:2)

在阅读你的评论后,我认为你应该做点别的事情:

  1. 创建应展示广告的空元素(#ad1_empty#ad2_empty,...)
  2. 将您的广告代码隐藏在页面底部(#ad1_full#ad2_full,...)
  3. 文档准备好后,将所有空元素替换为真实元素
  4. // code

    <div id="ad_empty"><!-- placeholder --></div>
    <div id="ad_content" style="display: none;">
        <script src="[ad resource]"></script>
        <script>inline ad script</script>
    </div>
    
    <script>
    function replace( oldel, newel, show ) {
      if ( typeof newel == "string" ) 
        newel = document.getElementById( newel );
      if ( typeof oldel == "string" ) 
        oldel = document.getElementById( oldel );
      if ( newel && oldel )
        oldel.parentNode.replaceChild( newel, oldel );
      if ( show ) 
        newel.style.display = "";
    }
    
    window.onload = function() {
        replace( "ad_empty",  "ad_content",  true );
        replace( "ad_empty2", "ad_content2", true );
    };
    </script>
    

    可以做你原本想要的事,顺便说一下(但是没用)

    function foo() {
    
      var scripts = document.getElementsByTagName("script");
      var parent = scripts[scripts.length-1].parentNode;
      var tag = parent.nodeName.toUpperCase();
    
      if (tag == "DIV") {
        alert("called from a <div>");
      } else if (tag == "SPAN") {
        alert("called from a <span>");
      }
    }
    

答案 2 :(得分:0)

不,这是不可能的。您必须手动传递某种参数以识别它的调用位置。

答案 3 :(得分:0)

没有办法做到这一点,可以用许多不同的方式调用脚本,只是不需要以任何方式将它放在规范中。

我认为总体上有一个很多更简单的方法来做你想要完成的事情,将<script>嵌入到单个元素中并将任何内容置于<script>元素的位置之外“看起来不像是一种合理的方式。”

那么......你最终要在这里完成什么?