2016-06-09 13 views
0

I kam ein Verfahren um Objekte zu fusionieren
Convert DOM-Objekt zu JavaScript-Objekt

Object.assign({a:1,b:2},{c:3,d:4}) 

Ergebnis ist

{a 1, b 2, c 3, d: 4}

Jetzt habe ich ein Video DOM-Objekt, das Eigenschaften wie current haben, Dauer

Also wollte ich DOM Video-Objekt mit einem einfachen Objekt wie dieses

Object.assign(videoElement,{www:1}) 

Ergebnis verschmelzen ist nicht das, was ich wollte, manchmal ist es nur das Videoelement und manchmal seine {www: 1}

So ich frage mich, ob es eine Methode ist, dieses DOM Video-Objekt JavaScript-Objekt zu konvertieren, so dass ich es mit einfachen JavaScript-Objekten wie diese

Object.assign(ConvertToObject(videoElement),{www:1}) 

so verschmelzen kann ich könnte eine erstellen ew Objekt mit Eigenschaften meiner eigenen Objekt und Video dom Elementeigenschaften
Vielen Dank im Voraus und wenn Sie niederstimmen bitte lasst Sie mich weiß, warum

+0

jQuery für Sie eine Option verwendet? –

+0

Nein, Tut mir leid, aber ich fange gerade an, es zu lernen Ich würde wirklich eine reine Javascript-Methode bevorzugen – Waqas

+0

Related: [Wie DOM-Knoten zu JSON serialisieren, auch wenn es Zirkelverweise gibt?] (Http://stackoverflow.com/questions/ 2303713/how-to-serialize-dom-Knoten-zu-JSON-even-wenn-dort-sind-Zirkel-Referenzen) –

Antwort

1

Sie for...in Schleife alle Eigenschaften verwenden könnte und normales Objekt aus HTML Element erstellen und Object.assign() verwenden zwei Objekt zu verschmelzen, ist hier Fiddle

var vid = document.querySelector('video'); 
 

 
function convertToObject(obj) { 
 
    obj = {} 
 
    for (var p in vid) { 
 
    obj[p] = vid[p]; 
 
    } 
 
    return obj; 
 
} 
 

 
var result = Object.assign(convertToObject(vid), {www: 1}); 
 
console.log(result.www);
<video src=""></video>

0

DOM-Objekte nicht reine JavaScript-Objekte sind, sind sie ein seltsames Ding namens host objects. Kurz gesagt, Host-Objekte Mai verhalten sich anders, wenn zugegriffen wird. Sie müssen ihren Typ nicht korrekt melden, noch müssen sie Methoden wie Typ function und andere solche Seltsamkeiten beanspruchen.

Wenn die polyfill Methode Object.assign zum Lesen, gibt es ein paar Zeilen, die Probleme auf dem Host-Objekte verursachen könnten:

if (Object.prototype.hasOwnProperty.call(source, key)) { 
    target[key] = source[key]; 
} 

als solche, so nützlich wie eine solche Abkürzung wäre, ich kann es empfehlen, zu vermeiden.

+0

Ich werde es auschecken und dann antworten Thx für schnelle Antwort obwohl – Waqas

+0

können Sie bitte erstellen Funktion, die zu Objekten verschmelzen und dann ein wenig erklären kann Ich werde Ihnen sehr dankbar sein. – Waqas

0

Ergebnis ist nicht das, was ich wollte, manchmal ist es nur das Videoelement und manchmal seine {www:1}

Dies sollte nicht der Fall sein, wenn Sie in Ihrer Reihenfolge der Argumente inkonsistent zu sein sind.

Object.assign erstellt kein neues Objekt. Es ändert das erste Argument und gibt es zurück, indem alle direkt zugewiesenen aufzählbaren Eigenschaften von nachfolgenden Argumentobjekten übernommen werden.

Hier sind einige einfache Beispiele zuverlässige Verhalten mit DOM-Elementen demonstriert:

var link = document.createElement('a'); 
Object.assign(link, { href: 'https://google.com' }) === link; 
console.log(link.outerHTML); 
<a href="https://google.com"></a> 
var vid = document.createElement('video'); 
Object.assign(link, { src: 'https://example.com/video.mp4' }) === vid; 
console.log(link.outerHTML); 
<video src="https://example.com/video.mp4"></video> 

Wenn Sie ein anderes Objekt als erstes Argument gesetzt, es wird stattdessen zurückgegeben.

Wenn eine Eigenschaft nicht kopiert wird, liegt das wahrscheinlich daran, dass es sich um eine nicht aufzählbare Eigenschaft handelt. Viele integrierte DOM-Element-Objekteigenschaften sind nicht aufzählbar, aber dies ist nicht DOM-spezifisch. Es gibt Nicht-DOM-Objekte mit demselben Verhalten.

+0

Ich möchte alle Eigenschaften des Video-DOM-Objekts abrufen und es mit meinen Objekteigenschaften zusammenfassen und ein neues Objekt erstellen, also selbst wenn ich die Reihenfolge ändere, werde ich nicht bekommen, was ich will Ich möchte Vid + ​​Link in haben in diesem Fall (ich meine nur Eigenschaften) – Waqas

+0

@Waqas Ich glaube nicht, dass Sie vollständig durchdacht haben, was Sie hier wollen. Das Videoelement hat eine '.parentNode' -Eigenschaft, die möglicherweise eine' .firstChild' -Eigenschaft hat, die auf das Videoelement verweist. Wie sollte das im Ergebnis dargestellt werden? Wenn Sie alle Eigenschaften rekursiv anzeigen möchten, erfassen Sie das gesamte Dokument. –