代码之家  ›  专栏  ›  技术社区  ›  CheapSteaks

是否有方法获取包含调用函数的内联JS脚本的DOM元素?

  •  2
  • CheapSteaks  · 技术社区  · 15 年前

    例如

    <script>
    function foo(){...}
    </script>
    
    <div><script>foo();</script></div>
    <span><script>foo();</script></span>
    

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

    这有可能吗?

    4 回复  |  直到 15 年前
        1
  •  2
  •   gblazex    15 年前

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

    1. 在广告应该出现的地方创建空元素( #ad1_empty , #ad2_empty ,…)
    2. 把你的广告代码放在隐藏页面的底部( #ad1_full , #ad2_full ,…)
    3. 当文档准备就绪时,将所有空元素替换为实际元素

    //代码

    <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
  •  3
  •   SLaks    15 年前

    你可以得到最后一个元素 目前 在国内。

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

        3
  •  0
  •   casablanca    15 年前

    不,这是不可能的。您必须手动传递某种参数,以确定从何处调用它。

        4
  •  0
  •   Nick Craver    15 年前

    无法执行此操作,可以调用脚本 许多的 不同的方式,仅仅是没有足够的必要将它以任何方式放入规范中。

    我想会有一个 许多的 总的来说,做你想做的事情的简单方法,嵌入 <script> 在单个元素中,并基于 <脚本> 元素的位置似乎不是一个合理的方法。

    那么……你到底想在这里完成什么?