2012-03-07 13 views
8

Vorrei recuperare un determinato elemento tag con i suoi attributi dal DOM. Ad esempio, dalottenere tag di apertura compresi gli attributi - outerHTML senza innerHTML

<a href="#" class="class"> 
    link text 
</a> 

voglio ottenere <a href="#" class="class">, opzionalmente con una chiusura </a>, sia sotto forma di stringa o qualche altro oggetto. A mio parere, sarebbe simile al recupero dello .outerHTML senza lo .innerHTML.

Infine, ho bisogno di questo per racchiudere alcuni altri elementi tramite jQuery. Ho provato

var elem = $('#some-element').get(0); 
$('#some-other-element').wrap(elem); 

ma .get() restituisce l'elemento DOM incluso il suo contenuto. Anche

var elem = $('#some-element').get(0); 
$('#some-other-element').wrap(elem.tagName).parent().attr(elem.attributes); 

fallisce come elem.attributes restituisce un NamedNodeMap che non funziona con jQuery di attr() e non ero in grado di convertirlo. Ammesso che gli esempi di cui sopra non sono molto sensati poiché copiano anche l'ID non più univoco dell'elemento. Ma c'è un modo semplice? Molte grazie.

+0

Basta clonare il nodo con '.clone()', quindi svuotarlo con '.html()' e rimuovere 'id' e cos'altro vuoi. – kirilloid

+0

$ ("a"). Clone(). Empty(). Attr ("outerHTML"); Per risolvere il primo problema – Tuscan

+0

Grazie a @kirilloid, immagino che josh sia stato solo più veloce;) –

risposta

4
var wrapper = $('.class').clone().attr('id','').empty(); 
  • si potrebbe desiderare di cambiare il selettore in modo che corrisponda più precisamente l'elemento <a> che stai cercando.
  • clone() crea una nuova copia degli elementi corrispondenti, copiando facoltativamente anche i gestori di eventi.
  • Ho utilizzato attr per cancellare l'ID dell'elemento in modo da non duplicare gli ID.
  • empty() rimuove tutti i nodi figlio ('innerHTML').
+0

Devi amare jquery. –

+0

Incredibile.Grazie mille, josh :) Qualche preoccupazione sull'uso di '.clone()'? Alcuni dicono che potrebbe non essere così performante, ma non riesco a vedere alcuna altra soluzione. –

+0

Immagino che .clone() non copi esattamente l'intero oggetto e che esista un qualche tipo di riferimento e se usiamo .remove() sull'oggetto clonato, rimuove effettivamente l'oggetto originale. Soffro di questo problema una volta. –

11

Per i futuri Googler, c'è un modo per farlo senza jQuery:

tag = elem.outerHTML.slice(0, elem.outerHTML.indexOf(elem.innerHTML)); 

Dal outerHTML contiene il tag apertura seguita da uno specchio di ciò che innerHTML contiene, siamo in grado di sottostringa l'outerHTML da 0 (l'inizio del tag di apertura) a dove inizia innerHTML (fine del tag di apertura), e poiché innerHTML è un mirror di outerHTML, ad eccezione del tag di apertura, verrà lasciato solo il tag di apertura!

Questo funziona con <br> tag, <meta> tag e altri tag vuoti:

tag = elem.innerHTML ? elem.outerHTML.slice(0,elem.outerHTML.indexOf(elem.innerHTML)) : elem.outerHTML; 

Perché innerHTML sarebbe vuoto nei tag a chiusura automatica, e indexOf('') restituisce sempre 0, i controlli di modifica di cui sopra per la presenza di innerHTML prima.

+0

Questo non funziona con elementi vuoti: document.createElement ("strong"). OuterHTML.slice (0, elem.outerHTML.indexOf (elem.innerHTML)) – Martin

+0

@Martin metti la dichiarazione 'createElement' in una variabile chiamata' elem' e usa l'espressione ternaria che ho usato sopra, restituisce ''. –

+0

@AaronGillion Buona cattura. A questo si potrebbe porre rimedio cercando '><' se innerHTML è una stringa vuota. Questo mi fa pensare ad un altro problema, però: '' identifica l'indice sbagliato per lo spazio. – MDMower

Problemi correlati