混淆了parentNode

时间:2016-04-28 16:38:16

标签: javascript html

我对JS中的parentNode感到困惑。这是我的代码。

<table border="1" width="50%" id="table">
   <tr>
    <th>id</th>
    <th>name</th>
    <th>del</th>
   </tr>  

   <tr>
    <td>001</td>
    <td>Kevin</td>
    <td><a href="javascript:;" onclick="del(this);">del</a></td>   
   </tr>

和JS代码:

function del(obj){
     var tr = obj.parentNode.parentNode;
     tr.parentNode.removeChild(tr)
 }

代码有效,我认为obj引用<a>代码,obj.parentNode引用<td>代码,obj.parentNode.parentNode代表<tbody>代码tr.parentNode.removeChild(tr)标签。因此<tr>表示删除function del(obj){ var tr = obj.parentNode.parentNode.parentNode; tr.removeChild(tr) } 标记。我是对的吗?

问题是如果我改变这样的代码。它不起作用。

main_fun_solution <- function(arg_A, arg_B) {
    eval(substitute(main_fun(fun_A(arg_A),fun_B(arg_B), times = 3), list("arg_A" =  arg_A, "arg_B" =  arg_B)))
}

main_fun_solution(1,2)

3 个答案:

答案 0 :(得分:1)

原因

tr

不起作用是因为tr不是tr.parentNode.removeChild(tr)的孩子,即本身。但是,tr有效,因为tr.parentNode显然是{{1}}的孩子。

答案 1 :(得分:1)

removeChild将在调用该函数的节点中查找节点。换句话说,tr.removeChild正在寻找tr里面的tr 。试试这个:

var tr = obj.parentNode.parentNode;
var trParent = tr.parentNode;
trParent.removeChild(tr);

答案 2 :(得分:-1)

  

我不得不处理同样的问题,答案令人困惑   反直觉。嗯,它有其逻辑,但导致非平凡   的行为。

     

基本上,当从DOM树中删除节点时,它会触发模糊   事件(以及焦点事件之前)。

     

因此,当您调用removeChild时,会再次触发blur事件,但是这样   时间链接仍然定义了其parentNode,但链接不在其中   父母的孩子了! (是的,请阅读两次。或者更多。)

来自Failed to execute 'removeChild' on 'Node'

的回答
相关问题