2016-04-28 8 views
0

Ich bin verwirrt über den ParentNode in JS.Hier ist mein Code.verwirren über den 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> 

und der JS-Code:

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

der Code funktioniert, und ich denke, die obj zum <a> Tag bezieht, die obj.parentNode auf den <td> Tag bezieht, die obj.parentNode.parentNode auf den <tbody> Tag bezieht. so die tr.parentNode.removeChild(tr) bedeutet, das <tr> Tag zu entfernen. Habe ich recht?

ist die Frage, wenn ich den Code so ändern. Es funktioniert nicht.

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

Ein Knoten ('tr') kann nicht das Kind von sich selbst sein (' tr') (es sei denn, eine Zeitreise). –

Antwort

1

Der Grund, warum

tr.removeChild(tr) 

nicht ist nicht funktioniert, weil tr kein Kind von tr, das heißt selbst ist. Allerdings funktioniert tr.parentNode.removeChild(tr) funktioniert, weil tr offensichtlich ein Kind von tr.parentNode ist.

+0

danke da! Kann ich eine andere Frage stellen? wenn ich 'del()' anstelle von 'del (this)' (nicht sehr klar über das "this", ich bin ein Anfänger) verwenden möchte, wie kann ich die 'function()' ändern? –

+0

Wenn du 'this' nicht in del wie' del (this) 'passierst, dann musst du irgendwo auf TD geklickt finden, nicht sehr praktisch, wenn TD keine Klasse oder ID, etc. Hat Identifizieren Sie es zum Beispiel mit der Methode document.querySelector. Du könntest jedoch diese 'onclick =" del.call (this) "' verwenden und innerhalb der Funktion 'this' wird auf was' obj' nicht zeigen. – dfsq

+0

scheint komplizierter. Wie auch immer, vielen Dank! –

1

removeChild sucht nach einem Knoten innerhalb des Knotens, der die Funktion aufruft. Mit anderen Worten tr.removeChild sucht nach tr innerhalb von tr. Versuchen Sie stattdessen:

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

ich mit dem gleichen Problem zu tun hatte, und die Antwort ist verwirrend und unlogisch. Nun, es hat seine Logik, führt aber zu nicht trivialen Verhaltensweisen.

Wenn ein Knoten aus der DOM-Struktur entfernt wird, wird im Wesentlichen ein Ereignis mit der Unschärfe ausgelöst (und auch vor einem Fokusereignis). So

, wenn Sie removeChild aufrufen, wird die Unschärfe Ereignis wieder gefeuert, aber das Zeit Link hat immer noch seine parentNode definiert, aber Link ist nicht unter seinen Eltern Kinder mehr! (Ja, lesen Sie diese zweimal. Oder mehr.)

Antwort von Failed to execute 'removeChild' on 'Node'

+0

Das scheint nichts mit dem hier vorgestellten Problem zu tun zu haben. Auch das Kopieren einer Antwort wird hier nicht wirklich toleriert. –

Verwandte Themen