Jest to związane z pytaniem JavaScript Klonode i właściwości.

Widzę to samo zachowanie. Node.Cloneode nie kopiuje żadnych właściwości, które dodam (kod z oryginalnego postu):

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

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

theClone nie zawiera żadnych właściwości "dyktatora".

Nie byłem w stanie znaleźć żadnego wyjaśnienia, dlaczego tak jest. Dokumentacja na MDN stwierdza, że cloneNode " Kopiuje wszystkie jego atrybuty i ich wartości ", linia, która jest pobierana bezpośrednio z Specyfikacja Domu sama.

Wydaje się to złamać, ponieważ obok nie można było zrobić głęboką kopię drzewa Domu, które zawiera właściwości niestandardowe.

Czy coś mi umyka?

6
Scott Cameron 8 sierpień 2012, 01:17

3 odpowiedzi

Najlepsza odpowiedź

Właściwość nie jest równa atrybucie.

Zamiast tego użyj SetatTribute () i GetatTribute ().

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

var theClone = theSource.cloneNode(true);
alert(theClone.getAttribute('dictator')); 
7
Dr.Molle 7 sierpień 2012, 21:27

Nie każda właściwość odpowiada atrybucie. Dodawanie właściwości niestandardowej do elementu nie dodaje atrybutu, więc co się dzieje, gdy to zrobisz, nie jest objęty specyfikacją DOM.

W rzeczywistości, co się dzieje, gdy dodasz nieruchomość do obiektu hosta (np. Węzeł Domu) jest całkowicie nieokreślony i nie jest gwarantowany, więc zdecydowanie polecam przeciwko temu. Zamiast tego sugerowałbym za pomocą opakowań, jeśli chcesz rozszerzyć funkcjonalność obiektów hosta (jak jQuery i wiele innych bibliotek).

3
Tim Down 7 sierpień 2012, 22:16

Przetestował to. cloneNode Dołącz atrybut niestandardowy w klonach, ale ten atrybut nie może zostać pobrany bezpośrednio. Próbować:

 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 

Może być problemem przeglądarki z klonowaniem {x0}}. Pobiegłem a testcase (patrz później) z tego raczej starego Raport Bugzilla. Nie działa w Chrome i Firefoksie (oba najnowsze wersje).

//code from testcase @ bugzilla
var a = document.createElement("div");      
a.order = 50;      
alert(a.order);      
b = a.cloneNode(true);      
alert(b.order);    
2
KooiInc 7 sierpień 2012, 21:50