更新: JsFiddle のリンクは次のとおりです: http://jsfiddle.net/zAVFv/
JsFiddle では動作していないようですが、コード全体 (html、css、および Js) を表示するのに役立つと思います。
Javascript を使用した DOM 編集で非常に奇妙な状況に直面しています。私のサンプルコードは以下です。基本的に、swapCells は、それぞれ 2 つの子を持つ 2 つのオブジェクトを受け取ります。1 つは img 要素で、もう 1 つは textNode です。私が見たいのは、 removeChild がどのように機能するかです。
すべての混乱の原因となっている 2 行をマークしました。issue#1 は sourceTD がその子を削除した行にあり、issue#2 は lastChild が destinationTD から削除されたときです。
以下のコードがどのように実行されているかを説明しましょう: a) コードに発行行 #1 のみが存在する場合、sourceTD の子が削除され、出力には source に img タイプの子が 1 つあると表示されます。宛先には 2 つの子があります - img と text ---- 期待どおりに動作します b) 発行行 #2 のみがコードに存在する場合、destinationTD の子は削除され、上記と同様に期待どおりに動作します c) 問題が発生した場合両方の行がコードに存在し、sourceTD lastChild のみが削除されます。出力は、アラートの sourceTD 部分についてのみ受信されます。destinationTD アラートが来ていないため、宛先の子が削除されたかどうかを評価できません
コード:
function swapCells(sourceTD, destinationTD){
//line below is issue line#1
sourceTD.removeChild(sourceTD.lastChild);
//line below is issue line#2
destinationTD.removeChild(destinationTD.lastChild);
if(sourceTD.hasChildNodes()){
alert("Source has: " + sourceTD.childNodes.length);
alert(sourceTD.childNodes[0].alt);
alert(sourceTD.childNodes[1].nodeName);
}
destinationTD.removeChild(destinationTD.lastChild);
if(destinationTD.hasChildNodes()){
alert("Destination has: " + destinationTD.childNodes.length);
alert(destinationTD.childNodes[0].alt);
alert(destinationTD.childNodes[1].nodeName);
}
}
両方の問題行が存在するときにコードが異常に動作する理由を教えてください。また、関数が単一のノードのみを削除できる、または単一のremoveChildのみが機能するようなものはありますか...????? 私は混乱しています。
ありがとう!