13

Quando si desidera ottenere il HTML di un intero elemento DOM (involucro incluso), è possibile effettuare le seguenti (come spiegato here):

$('#myElementId')[0].outerHTML 

Ma quello che non può fare è chiamata outerHTML su $(this) all'interno ad es un ambito funzione di clic ascoltatore o il selettore del corpo:

$(this).outerHTML //Doesn't complete in IntelliSense, returns undefined in browser 

o

$(this)[0].outerHTML //Correction, this DOES work, but it doesn't complete in IntelliSense 

perché IntelliSense non mostrerà innerHTML o outerHTML in quelle circostanze, anche se con vaniglia JavaScript si può fare:

document.getElementById($(this).attr('id')).outerHTML 

Quindi ... che succede?

+5

Hai provato effettivamente nel browser stesso? Non vedo particolarmente il senso di usare 'outerHTML' in questo modo, ma dovrebbe funzionare. –

+3

Forse Intellisense non è in grado di determinare che '$ (this) [0]' è un elemento DOM, quindi non suggerisce i membri DOM. –

+0

Appoggiato alla spiegazione di @ FrédéricHamidi. Hai intellisensi su '$ (this) .get (0) .outerHTML'? –

risposta

22

outerHTML è una proprietà DOM; jQuery non espone tutte le proprietà del DOM.

Se si dispone di un oggetto jQuery, è possibile accedere direttamente solo alle proprietà e ai metodi esposti da jQuery e viceversa per gli oggetti DOM.

In termini orientati agli oggetti, gli oggetti jQuery non ereditano dagli oggetti DOM, ma li contengono.

Dicendo $x[0] si ottiene l'oggetto DOM per il primo elemento rappresentato da un oggetto jQuery.

+3

L'interrogante dice che Intellisense non riesce a completare '$ (this) [0] .outerHTML', quindi non è solo un problema di jQuery object/DOM element. –

+5

@ FrédéricHamidi: Suppongo che Intellisense non sia abbastanza intelligente da determinare che un oggetto di accesso all'oggetto jQuery '[]' restituisce un elemento DOM. – RichieHindle

+0

@ FrédéricHamidi effettivamente * non * completa '$ (questo) [0] .outerHTML' sebbene funzioni nel browser. –

19

È possibile utilizzare direttamente this per accedere outerHTML dell'oggetto corrente, invece di passare attraverso indirettamente $(this) in quanto questo rappresenta l'oggetto DOM (che ha outerHTML proprietà), mentre $(this) rappresenta oggetto jQuery.

this.outerHTML 
4

jQuery selector restituisce un oggetto jQuery array-like che non ha proprietà outerHTML.

Tuttavia, la matrice risultante di jQuery contiene elementi DOM.
Significa che puoi effettivamente accedervi in ​​questo modo.

$(".someClass")[0].outerHTML // it works for me 

Aggiornamento: funziona per me in tutti i browser.
È possibile accedere a oggetti jQuery array come in un gestore eventi click.

$(".someClass").click(function() 
{ 
    alert($(this)[0].outerHTML); // it works me too 
}); 

Ecco il mio JSFiddle: http://jsfiddle.net/13btf60p/

Aggiornamento 2:

OK, ora ho la tua domanda. Dovrebbe aver funzionato. Hai davvero bisogno di un IntelliSense per completare una costruzione così semplice e semplice?

+5

L'OP afferma che '$ (this) [0] .outerHTML' non funziona correttamente neanche. Il fatto che jQuery restituisca un oggetto simile ad un array è irrilevante. –

+0

@ Qantas94Heavy Funziona correttamente per me in diversi browser. Posso accedere all'evento '$ (this) [0] .outerHTML' on click. –

+2

@YeldarKurmangaliyev ma la domanda è diversa. – Jai

1

Aggiungerò ciò che ho trovato essere la soluzione corretta a ciò che è risultato essere un difetto semplice nelle impostazioni predefinite di Visual Studio per riferimento futuro.

Dal momento che non volevo lasciare questo andare, ho cercato più e ha scoperto che, per impostazione predefinita, jQuery IntelliSense è un po 'deplorevole fuori dalla scatola in Visual Studio 2013.

Sotto

Strumenti> Opzioni> Editor di testo> JavaScript> IntelliSense> Riferimenti

ho impostato

Gruppo di riferimento: "Implicit (Web)"

e aggiunto un file jQuery esistente. Questo ha risolto tutti i problemi della mia domanda e IntelliSense ora suggerisce correttamente tutti i membri e i metodi, anche se questo avrebbe dovuto semplicemente funzionare fuori dalla scatola invece di costare a tutti un sacco di tempo.