Javascript 函数如何知道它在DOM中的位置?
我正在尝试编写一个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字符串操作。
...
<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层次结构中的位置,在这种情况下:
- 例如
- 例如,
this.script=document.getElementById('specialagent')代码>
- 例如,
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){……您的代码……}”。