6

これは、質問javascript cloneNode and propertiesに関連しています。

同じ動作が見られます。Node.cloneNode は、自分で追加したプロパティをコピーしません (元の投稿のコード):

    var theSource = document.getElementById("someDiv")
    theSource.dictator = "stalin";

    var theClone = theSource.cloneNode(true);
    alert(theClone.dictator); 

theCloneプロパティ「独裁者」は含まれていません。

なぜそうなのかについての説明を見つけることができませんでした。MDNのドキュメントには、cloneNode「すべての属性とその値をコピーする」と記載されています。この行は、DOM 仕様自体から直接引用されています。

これは、カスタム プロパティを含む DOM ツリーのディープ コピーを行うことがほとんど不可能になるため、私には壊れているように思えます。

ここで何か不足していますか?

4

3 に答える 3

7

プロパティは属性と等しくありません。

代わりに setAttribute() と getAttribute() を使用してください。

var theSource = document.getElementById("someDiv")
theSource.setAttribute('dictator','stalin');

var theClone = theSource.cloneNode(true);
alert(theClone.getAttribute('dictator')); 
于 2012-08-07T21:27:24.073 に答える
3

すべてのプロパティが属性に対応するわけではありません。要素にカスタム プロパティを追加しても属性は追加されないため、それを行ったときに何が起こるかは DOM 仕様ではカバーされていません。

実際、プロパティをホスト オブジェクト (DOM ノードなど) に追加するとどうなるかは完全に未規定であり、動作が保証されているわけではないため、実行しないことを強くお勧めします。代わりに、ホスト オブジェクトの機能を拡張したい場合は、ラッパーを使用することをお勧めします (jQuery や他の多くのライブラリがそうであるように)。

于 2012-08-07T22:16:19.220 に答える
2

これをテストしました。cloneNode カスタム アトリビュートはクローンに含まれますが、そのアトリビュートを直接取得することはできません。試す:

 var theSource = document.getElementById("someDiv")
 theSource.dictator = "stalin";
 //or better / more cross browser compatible
 theSource.setAttribute('dictator','stalin');

 var theClone = theSource.cloneNode(true);
 alert(theClone.getAttribute('dictator')); //so, use getAttribute 

クローニングに関するブラウザの問題である可能性がありますexpando propertiesこのかなり古いbugzilla レポートからテストケース(後述)を実行しました。Chrome と Firefox (どちらも最新バージョン) では機能しませんでした。

//code from testcase @ bugzilla
var a = document.createElement("div");      
a.order = 50;      
alert(a.order);      
b = a.cloneNode(true);      
alert(b.order);    
于 2012-08-07T21:27:51.577 に答える