Javascript 函数如何知道它在DOM中的位置?

Javascript 函数如何知道它在DOM中的位置?,javascript,dom,Javascript,Dom,我正在尝试编写一个javascript函数,将一些DOM节点添加到文档的调用位置,如下所示: ... <div> <script type="text/javascript"> pushStuffToDOMHere(args); </script> </div> ... 。。。 PushStuff ToDomhere(args); ... 我尝试“干净地”完成它,而不使用div的node id属性或innerHTML字符串操作。

我正在尝试编写一个javascript函数,将一些DOM节点添加到文档的调用位置,如下所示:

...
<div>
  <script type="text/javascript">
    pushStuffToDOMHere(args);
  </script>
</div>
...
。。。
PushStuff ToDomhere(args);
...
我尝试“干净地”完成它,而不使用div的node id属性或innerHTML字符串操作。为此,我需要知道脚本标记在文档中的位置。
有没有办法做到这一点?

说到干净,我不认为你的方法特别干净。最好给div一个唯一的id,并在DocumentReady事件触发时执行javascript。

不确定您试图实现什么,但这会在单击时将dom元素传递给函数。然后,您可以在函数中使用jquery来执行您想要的操作

...
<script type="text/javascript">
    function pushStuffToDOMHere(element)
    {
          $(element).append("<p>Hello</p>"); // or whatever
    }
</script>
<div onclick="pushStuffToDOMHere(this);">

</div>
...
。。。
函数pushStuffToDOMHere(元素)
{
$(元素)。追加(“Hello

”;//或其他任何内容 } ...
您有这样做的首要原因吗?如果不是的话,建议使用唯一的id是最有意义的。您可以随时使用jQuery这样的库来简化这一过程

但是,下面的快速测试表明,如果在函数中使用document.write(),它会将值写入调用函数的位置

<html>
<head>
   <script type="text/javascript">
           function dosomething(arg){
              document.write(arg);
           }
   </script>
</head>
<body>
<div>The first Div</div>
 <div>The 
    <script type="text/javascript">
           dosomething("Second");
   </script>
      Div
 </div>
 <div>The
        <script type="text/javascript">
           dosomething("Third");
       </script>
      Div
    </div>
   </body>
</html>

功能剂量测量(arg){
文件写入(arg);
}
第一组
这个
剂量测定法(“第二”);
Div
这个
dosomething(“第三”);
Div

但是,同样是一个问题,你确定这就是你想要做的吗?

我的解决方案是将这里发布的(好)答案组合在一起:

在调用函数时,它将使用唯一id编写一个div。 然后在document.onload上,可以很容易地找到div的父节点并附加新的子节点

我选择这种方法是因为有一些独特的限制:除了添加脚本元素之外,我不允许接触HTML代码。真的,问问我的老板

后来想到的另一种方法是:

function whereMI(node){
    return (node.nodeName=='SCRIPT')? node : whereMI(node.lastChild);
}
var scriptNode = whereMI(document);

尽管如此,当fireBug之类的东西在加载文档之前将自身附加为HTML节点中的最后一个元素时,这应该会失败。

尽管我同意n3rd并投票支持他,但我理解您所说的,您有一个特定的挑战,您无法向HTML分区添加id,除非通过脚本

因此,我建议内联一个脚本,让它知道自己在DOM层次结构中的位置,在这种情况下:

  • id添加到脚本标记中。(是的,脚本标记也可以有ID。)

    • 例如
  • 将一行添加到内联脚本函数中,该函数按id获取脚本元素。
    • 例如,
      this.script=document.getElementById('specialagent')
  • …和另一个获取脚本元素的parentNode的

    • 例如,
      var targetEl=this.script.parentNode
  • 如果可以的话,考虑将您的函数重新构造为自执行函数

    • 理想情况下,它会立即执行,而不需要“onload”调用
    • 请参见下面的摘要示例
  • 摘要示例:

    <script id="specialagent" type="text/javascript">
    var callMe = function(arg1,arg2,arg3) {
        this.script = document.getElementById('specialagent');
        var targetEl = this.script.parentNode.nodeName=="DIV" && this.script.parentNode;
        //...your node manipulation here...
    }('arg1','arg2','arg3');
    </script>
    
    
    var callMe=函数(arg1、arg2、arg3){
    this.script=document.getElementById('specialagent');
    var targetEl=this.script.parentNode.nodeName==“DIV”&&this.script.parentNode;
    //…您的节点操作在此。。。
    }(‘arg1’、‘arg2’、‘arg3’);
    
    下面的测试代码在运行时证明了该函数已经识别了它在DOM中的位置,更重要的是,它的父节点。测试具有id为的分区节点,仅用于测试目的。除了测试之外,功能不需要它们来识别它们

    测试代码:

    <html>
    <head>
    <title>Test In place node creation with JS</title>
    </head>
    <body>
    <div id="one">
        <h2>Child of one</h2>
        <div id="two">
                <h2>Child of two</h2>
                <script id="specialagent" type="text/javascript">
                var callMe = function(arg1,arg2,arg3) {
                    this.script = document.getElementById('specialagent');
                    var targetEl = this.script.parentNode;
                    /*BEGIN TEST*/
                     alert('this.script.id: ' + this.script.id);
                     alert('targetEl.nodeName: ' + targetEl.nodeName + '\ntargetEl.id: '+targetEl.id);
                     alert('targetEl.childNodes.length: ' + targetEl.childNodes.length);
                     var i = 0;
                     while (i < targetEl.childNodes.length) {
                         alert('targetEl.childNodes.'+i+'.nodeName = ' + targetEl.childNodes[i].nodeName);
                         ++i;
                    }
                    /*END TEST - delete when done*/     
                    //...rest of your code here...to manipulate nodes
                }('arg1','arg2','etc');
                </script>
         </div>
     </div>
     </body>
     </html>
    
    
    使用JS测试就地节点创建
    一个孩子
    两个孩子
    var callMe=函数(arg1、arg2、arg3){
    this.script=document.getElementById('specialagent');
    var targetEl=this.script.parentNode;
    /*开始测试*/
    警报('this.script.id:'+this.script.id);
    警报('targetEl.nodeName:'+targetEl.nodeName+'\n目标id:'+targetEl.id.);
    警报('targetEl.childNodes.length:'+targetEl.childNodes.length);
    var i=0;
    while(i
    这是文档中唯一的div吗?@TStamper-可能是这样的:将Pand放在另一个文件中,这是一个很好的方法,您在这里使用的代码教会了我一些很好的表达技巧。对我来说,下一个逻辑步骤就是在html中使用自定义标记,并在onload事件中解析它们。谢谢很乐意帮忙。当然,条件块应该围绕节点操作。对于上面的示例,“If(targetEl){……您的代码……}”。