2012-02-04 12 views
5

UPDATE: Sembra un comportamento specifico del browser come ha commentato TimWolla: come dovrei normalizzarmi alla versione senza caratteri di escape, in modo affidabile in modalità cross-browser?Come evitare jQuery .html() dall'esclusione automatica dell'attributo href?

HTML:

<div id="test"><a href="#{one}">#{two}</a></div> 

JS:

$('#test').html() 
=> <a href="#%7Bone%7D">#{two}</a> 

Avviso il #{one} nella href è sfuggito, mentre #{two} non è.

C'è un modo migliore rispetto al solo unescape dell'intera stringa?

unescape($('#test').html()) 
=> <a href="#{one}">#{two}</a> 

Ecco l'esempio: http://jsfiddle.net/kenn/n8veL/

+3

Sembra che si tratti di un problema specifico del browser. In Googles v8 Engine funziona perfettamente. – TimWolla

+0

Quell'ancora sembra essere un modello. Perché stai analizzando un modello per il DOM? I modelli devono essere conservati nel codice sorgente (ad esempio all'interno di un elemento SCRIPT) ed elaborati con JavaScript (e solo * quindi * analizzati dal browser). –

+0

TimWolla: dannazione! ha aggiornato la domanda ... – kenn

risposta

0

Se avete intenzione di essere l'esecuzione un'espansione tramite JavaScript sull'elemento in ogni caso, è possibile inserire il modello "href" in un attributo separato.

<a href='#dummy' data-href='#{template}'>Hi</a> 

Poi basta espandere dall'attributo di dati e rilasciare il risultato nel vero e proprio "href".

+1

Suona come un'idea decente, ma sfortunatamente nel mio caso non è così grande come lo stesso modello è condiviso sul lato server per alcune pagine statiche e duplicare il comportamento di js nella logica del server sembra scomodo. – kenn

+0

Ah, giusto, vedo. Beh, probabilmente non c'è un buon lavoro, a parte quello "unescape()". – Pointy

1

Prima di tutto, dubito che esista una soluzione affidabile alla tua domanda. La ragione di fondo è semplice: perché il Element.innerHTML che funziona sotto non è standard e dipende esclusivamente dall'implementazione del browser.

Se si desidera una soluzione affidabile, suggerirei di utilizzare le operazioni DOM al posto del modello .

+0

Ma l'escaping viene eseguito solo sull'attributo "href". Altri attributi non saranno influenzati allo stesso modo. – Pointy

+0

@Pointy Scommetto che alcuni browser (come Firefox) lo sfuggono perché l'href deve contenere un URL. Quindi, i caratteri che non sono autorizzati a comparire sono sfuggiti. Ma ancora, come ho detto, è specifico per il browser e non abbiamo standard per garantire il suo comportamento. – shinkou

+0

Giusto, ma nessun browser che ho provato è sfuggito all'attributo "data-href". Dopotutto, non importa dove il modello è tenuto sull'elemento. Naturalmente ci sarebbero sempre problemi con i metacaratteri HTML nei valori degli attributi, ma per i modelli semplici dovrebbe funzionare. – Pointy

Problemi correlati