Serializzazione HTML

Andiamo a vedere adesso l'attenzione di serializzazione HTML correttamente in moderne applicazioni Web, lavorando intorno ad alcuni dei vincoli dovete affrontare. Problema Alcune delle proprietà DOM comportamento incoerente mostrano in particolare, la proprietà innerHTML. Lo scopo di innerHTML è quello di estrarre il bambino elementi di un elemento HTML in una forma di stringa. Il problema è che la proprietà innerHTML non genera il testo corretto. Hai bisogno di lavorare attorno a questo. Theory Per capire se la proprietà innerHTML fallisce, mettiamoci al lavoro attraverso alcuni esempi e incrementale mostrare dove si trova il problema. L'esempio che verrà illustrato è l'aggiunta dinamica di un pulsante e campo di testo. Il codice sorgente per l'esempio è il seguente.

 Fonte: / website / ROOT / articles AJAX / DHTML / inconsistent.html  Incoerente. InnerHTML 

  

La funzione DOMInserted aggiunge il pulsante e il testo per l'elemento div con l'ID dynamicallyinserted. L'elemento div con l'ID dynamicallyinserted non ha elementi figlio. Pertanto, se innerHTML sono stati chiamati, la stringa restituita non dovrebbe contenere elementi di testo. Quando l'utente preme il pulsante di inserire dinamicamente, la funzione DOMInserted si chiama. Utilizzare l'ingresso stesso elemento HTML per creare sia un pulsante o una casella di testo. Ciò che distingue un pulsante da una casella di testo è il valore del tipo di immobile. Per creare un'istanza elemento input, utilizzare il metodo document.createElement. Una volta che l'istanza elemento è stato istanziato e assegnato, si aggiunge l'elemento div con il metodo appendChild.

Dopo che entrambi i casi di ingresso sono stati aggiunti l'elemento div, è possibile utilizzare innerHTML per recuperare il valore dei suoi elementi figlio in HTML. Il valore di innerHTML è assegnato l'elemento textarea per illustrare il valore HTML prime. L'errore è che non attribuiscono valore esiste. In realtà, l'attributo valore non esiste, perché si è attribuito nella sceneggiatura e lo ha mostrato nel codice HTML, ma per quanto riguarda la proprietà innerHTML, l'attributo valore non esiste. Internet Explorer genera l'output corretto. L'esecuzione del codice stesso in Opera genera lo stesso errore come in Mozilla. Una nuova interfaccia DHTML è completamente dinamico, per cui le eventuali modifiche apportate dagli utenti o lo script devono trovare riscontro nella struttura. Soluzione Il resto di questo articolo è incentrato su come risolvere il problema di serializzazione degli elementi HTML. La soluzione è semplice in quanto per generare il buffer, è necessario scorrere tutti gli elementi singolarmente e generare un buffer lungo. Il codice riportato di seguito illustra la soluzione completa.

 Fonte: 

La funzione ricorsiva è utilizzato per scorrere i singoli elementi e può essere utilizzato con tutti i browser. La funzione ricorsiva ha un unico parametro che rappresenta un'istanza di un oggetto che sarà introspected per le proprietà e metodi. La serializzazione supporta solo due tipi di nodi (element.nodeType): 1 e 3. Se non sai cosa i vari tipi di nodo sono, poi i numeri 1 e 3 non stanno andando per aiutarvi. Nodo di tipo 1 rappresenta un elemento HTML Plain Vanilla, e tipo di nodo 3 rappresenta un pezzo di testo. La serializzazione ignora i commenti, le direttive di pagina, e così via, perché in generale, non sono importanti per la serializzazione. Se il tipo di nodo è 1, quindi un buffer viene generato per l'identificatore di elemento e tutti i suoi attributi associati. Si potrebbe pensare che l'iterazione tutti gli attributi che includono l'attributo value. Per qualsiasi browser diverso da Internet Explorer, gli attributi che sono presenti nella matrice element.attributes dipendono dal tipo di attributo.

A seconda del tipo di elemento di input, l'attributo valore non può essere parte della lista, il che significa che non è accessibile. Ciò significa anche che è necessario fare riferimento direttamente utilizzando la notazione element.value. Il fatto che alcuni elementi vengono visualizzati e altri non è un po 'preoccupante, perché vi lasciano lì a ciò che il browser si nasconde. Se guardate attentamente il codice sorgente e l'output generato della pagina HTML incoerente, si noterà che i browser stanno trattando un attributo incoerente: Sono manca il gestore onclick per l'elemento generato dinamicamente pulsante. L'attributo onclick viene generato per il pulsante definita staticamente, ma non per il pulsante generati dinamicamente.

È necessario chiedersi se si desidera generare i gestori di eventi quando il codice HTML è serializzato. Se si risponde no, il htmlSerialize funzione di controllo per gli eventi di prova se l'attributo inizia con le lettere O e n. Ma non è corretto per serializzare gli eventi? Si può sostenere che se si ha intenzione di serializzare HTML, è necessario serializzare tutto. Tuttavia, tutto ciò che la serializzazione è difficile, perché si deve in qualche modo memorizzare i riferimenti funzione. Non è possibile memorizzare l'attuazione di una funzione in un attributo, perché gli attributi non possono contenere line feed. La tua decisione dovrebbe essere basata su ciò che si desidera probabilmente a che fare con la serializzazione HTML, e che è l'estrazione di Stato. La soluzione proposta non è affatto completo, ma si risolve un contesto specifico, e questo è ciò che devi tenere a mente. Quando risolvere il problema della serializzazione della funzione di riferimento, vi è la questione di come serializzare la funzione che è stato assegnato in modo dinamico, come illustrato nella pagina di esempio HTML. Per scopi illustrativi, proviamo una serializzazione iniziale di funzioni, anche se si prende subito vedere che la serializzazione di funzioni è piuttosto complicato. Per serializzare le funzioni, devi riscrivere il htmlSerialize funzione come segue:

htmlSerialize: function (element) ( var scriptBuffer = "";var ricorsive = function (element) (var buffer = ""; if (element.nodeType == 1) (buffer + = "<" + element.nodeName + ""; didGenerateValue var = false; for (var i = 0; i <element.attributes.length; i + +) (var attr = element.attributes [i]; var nome = attr.name.toLowerCase (); if (name.charAt (0) == 'o' & & name.charAt (1) == 'n') ( if (typeof (attr.value) == "string") ( buffer + = attr.name + "= \" "+ attr.value +" \ ""; ) )else if (attr.value! = null & &! (typeof (attr.value) == "string" & & attr.value.length == 0)) (if (new String (elemento [attr.name]). toLowerCase ( ) == "undefined") (buffer + = attr.name + "= \" "+ attr.value +" \ "";) else (buffer + = attr.name + "= \" "+ elemento [attr. nome] + "\" ";)) if (attr.name.toLowerCase () ==" valore ") (didGenerateValue = true;)) if (element.nodeName.toLowerCase () ==" input "& &! didGenerateValue) (buffer + = "value = \" "+ element.value +" \ "";) if (element.onclick) ( scriptBuffer + = "var" + + element.id "_onclick =" + element.onclick; buffer + = "value = \" "+ + element.id" _onclick () \ ""; )buffer + = ">"; if (element.nodeName.toLowerCase () == "textarea") (buffer + = element.value;) else (for (var i = 0; i <element.childNodes.length; i + +) (buffer + = ricorsive (element.childNodes [i]);)) buffer + = "  ";) Else if (element.nodeType == 3) (buffer + = element.nodeValue;) return buffer;) var buffer =" "for (var i = 0; i <element.childNodes.length; i + +) (buffer + = ricorsive (element.childNodes [i]);) return buffer;)

Il codice in grassetto nella realizzazione modifica riguarda la serializzazione dei gestori di eventi. Il primo pezzo di codice in grassetto è la dichiarazione di un buffer di script. Il buffer di script è il codice dello script che si è salvato con il serializzato HTML. Hai bisogno di entrambi i pezzi, come il codice di script dinamicamente attaccarsi quando si assegna il codice HTML serializzato utilizzando la proprietà innerHTML. Il secondo codice in grassetto è la serializzazione degli eventi che si è dichiarato in fase di progettazione. Se l'elemento è collegato in modo dinamico, quindi ogni caso associato non è serializzato. Pezzo L'ultimo e terzo del codice in grassetto è il codice problematico e permaloso. Nella pagina di esempio HTML, l'evento onclick è stato assegnato in modo dinamico in cui un pulsante è stato iniettato in modo dinamico. L'evento onclick non è una stringa che fa riferimento a un'altra chiamata. L'evento onclick riferimento una funzione JavaScript anonima. Poiché gli attributi serializzato non può contenere implementazioni funzione completa, è necessario serializzare la funzione e creare un riferimento alla funzione simile alla serializzazione alla fase di progettazione dichiarazione di elemento HTML. L'evento dinamico associato onclick è una funzione anonima, e quindi non ha alcun identificatore. Il codice in grassetto definisce una funzione che è una concatenazione di ID elemento e l'evento onclick. Se l'esempio dinamica non ha id, più eventi onclick identici verrà generato. Si potrebbe anche generare un identificatore casuale e quindi fare riferimento a tale identificatore casuale nel serializzato HTML.

L'identificatore casuale risolve il problema della funzione di identificatore. Ma ora ci sono due buffer. Un buffer contiene il codice HTML serializzato, e un altro buffer contiene lo script che avete bisogno di eseguire in modo che i riferimenti funzione non genererà errori. Come si può vedere, il codice sta cominciando a diventare molto complicato e traballante. È per questo che vi consiglio di non serializzare gli eventi se non assolutamente necessario. Ricordare i seguenti punti per quanto riguarda questo articolo serializzazione HTML:

• serializzazione HTML è pieno di dettagli, le eccezioni, e poco dei problemi. Ad esempio, quando utilizza la serializzazione htmlSerialize, IE genera una gran quantità di attributi che non è stata definita. Ciò è dovuto al default e rende più difficile per estrarre il linguaggio HTML. Si dovrebbe presumere che il foglio di stile è la gestione predefiniti.

• In caso di applicazione di serializzazione HTML, non si fidano di soluzioni generali. Trust soluzioni specifiche in grado di risolvere problemi specifici in un dato contesto.

• Case di assegnare con il metodo setAttribute sono visibili entrambi i browser quando si utilizza la proprietà innerHTML.

• Modificato il contenuto HTML che si salva dal browser utilizzando Salva con nome non viene memorizzato in modo coerente tra tutti i browser.

• articolo 2, ha dimostrato come serializzare un oggetto JavaScript, e questo articolo ha mostrato come serializzare DHTML. Ogni tipo di serializzazione è una serializzazione specifica per uno scopo unico. Dovete essere consapevoli di questi dettagli e scegliere la serializzazione del caso.

un articolo presentato da Sonja Lande


Disclaimer:Il nostro sito non è responsabile per il contenuto di questo articolo. Webarticles è una risorsa gratuita di informazioni.
Importante: Questo articolo "Serializzazione HTML" è stato tradotto da un software automatico. Ci dispiace per eventuali errori di ortografia che possono essersi verificati. Grazie per la vostra comprensione.


Online: 322 users browsing the articles directory