2009-08-31 13 views
8

Il codice qui non restituisce quello che ci si aspetta:È JQuery (..). Html() bacato in jQuery 1.3.2?

jQuery('<div>Look here: [ jQuery0="null" ]</div>').html() 

Piuttosto, si ottiene:

Look here: [ ] 

Il codice sorgente di jQuery in questione:

html: function(value) { 
     return value === undefined ? 
       (this[0] ? 
         this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : 
         null) : 
       this.empty().append(value); 
}, 

Quale sarebbe la motivazione dietro lo .replace? Non ho tempo di esaminare il resto di jQuery, ma codice come questo mi fa pensare se dovrei usare jQuery in produzione.

risposta

4

Questo codice è nuovo in 1.3.2, non era in 1.3.1. Mi sembra che jQuery usi gli attributi i cui nomi iniziano con "jQuery" per memorizzare i dati sugli elementi, e questo è il suo modo di non esporlo a te quando chiedi il dorso HTML.

Ovviamente non è un bug. L'autore intendeva rimuovere quell'HTML prima di restituirti la stringa.

Questo influenza il tuo codice? Come con qualsiasi libreria, è necessario testare accuratamente il codice di produzione prima di distribuirlo.

+1

Concesso, non ha ancora influenzato il mio codice ma interrompe l'invariant 'x.html (y) .html() == y', che suona un campanello d'allarme. Grazie per le informazioni su quando è stato introdotto. Hai ragione, non è un bug, ma una decisione progettuale discutibile. – t0yv0

11

Quale sarebbe la motivazione dietro il .replace?

Per nascondere gli attributi utilizzati da jQuery per scopi interni.

codice come questo mi meraviglia se dovrei usare jQuery in produzione a tutti.

Sì, ho avuto la stessa identica reazione. È semplicemente incredibilmente sciatto. Cercando di elaborare HTML con regexp è il tipo di trucco naif che ti aspetti dai posters per la prima volta, non il tipo di comportamento che speri di vedere nel framework, così tanti utenti SO sembrano adorare.

Non è l'unico posto in cui jQuery si attiva cercando di analizzare il markup con espressioni regolari; anche alcune delle cose del selettore sono rotte. Questi possono essere casi d'angolo oscuri, ma per me è un'enorme bandiera rossa indicativa dell'approccio sbagliato.

+4

Per inciso, c'è una soluzione semplice per questo. IE include solo le proprietà expando nella sua serializzazione 'innerHTML' quando i loro valori sono tipi semplici come' String' e 'Number'. Altri oggetti come Array non vengono visualizzati. Quindi tutto ciò che jQuery deve fare è impostare 'node [expando] = [uuid];' invece di 'node [expando] = uuid;' e tutta questa elaborazione di espressioni regolari senza senso può andare via. – bobince

+0

Ti ho mai detto quanto ti amo? :-P Sei, tipo, il dio dell'oscura soluzione di IE, o qualcosa del genere. –