Sérialisation HTMLTournons-nous maintenant l'attention sur la sérialisation HTML correctement dans les applications Web modernes, travaillant autour de certaines des contraintes que vous êtes confrontés. Problème Certains des comportements présentent des propriétés incompatibles DOM, en particulier, la propriété innerHTML. Le but de innerHTML est d'extraire l'enfant éléments d'un élément HTML dans un orchestre à cordes. Le problème est que la propriété innerHTML ne génère pas le texte exact. Vous devez travailler autour de cela. Théorie Pour comprendre d'où la propriété innerHTML échoue, nous allons travailler à travers quelques exemples et progressivement à montrer où réside le problème. L'exemple qui sera illustré est le plus dynamique d'un bouton et champ texte. Le code source de l'exemple est la suivante. Source: / site / ROOT / articles ajax / dhtml / inconsistent.html
La fonction DOMInserted ajoute le bouton et le texte à l'élément div avec l'ID dynamicallyinserted. L'élément div avec l'ID dynamicallyinserted n'a pas d'éléments enfant. Ainsi, si innerHTML ont été appelés, la chaîne retournée contiendra pas de texte. Lorsque l'utilisateur appuyait sur le bouton insérer de façon dynamique, la fonction DOMInserted est appelée. Utilisez l'entrée même élément HTML pour créer soit un bouton ou une zone de texte. Ce qui distingue un bouton d'une zone de texte est la valeur du type de propriété. Pour créer une instance d'élément d'entrée, utilisez la méthode document.createElement. Une fois l'instance élément a été instanciés et attribuées, vous l'ajoutez à l'élément div utilisant la méthode appendChild. Après que les deux instances d'entrée ont été ajoutées à l'élément div, vous pouvez utiliser innerHTML pour récupérer la valeur de ses éléments enfants en HTML. La valeur de innerHTML est attribué à l'élément textarea pour illustrer la valeur brute HTML. L'erreur est qu'aucune valeur de l'attribut existe. En fait, l'attribut de valeur existe, parce que vous l'aviez indiqué dans le script et affiché dans le HTML, mais à l'égard de la propriété innerHTML, la valeur de l'attribut n'existe pas. Internet Explorer génère la sortie correcte. L'exécution du même code dans Opera génère la même erreur que dans Mozilla. Une interface utilisateur DHTML est entièrement dynamique, alors toutes les modifications apportées par les utilisateurs ou le script doivent être reflétés dans la propriété. Solution Le reste de cet article se concentre sur la façon de résoudre le problème de sérialisation des éléments HTML. La solution est simple en ce que pour générer la mémoire tampon, vous avez besoin pour parcourir tous les éléments séparément et générer une mémoire tampon de long. Le code suivant illustre la solution complète. Source: La fonction récursive est utilisé pour parcourir les éléments individuels et peut être utilisé avec tous les navigateurs. La fonction récursive a un unique paramètre qui représente une instance d'objet qui va être découverts pour les propriétés et méthodes. La sérialisation ne supporte que les deux types de noeuds (element.nodeType): 1 et 3. Si vous ne savez pas ce que les différents types de nœuds, puis les numéros 1 et 3 ne vont pas vous aider. Nœud de type 1 représente une plaine de vanille élément HTML, et le type de noeud 3 représente un morceau de texte. La sérialisation ignore les commentaires, les directives de page, et ainsi de suite car, généralement, ils ne sont pas importants pour la sérialisation. Si le type de noeud est de 1, puis un tampon est générée pour l'identificateur d'élément et tous ses attributs associés. On pourrait penser que l'itération de tous les attributs comprendraient l'attribut value. Pour tout autre navigateur qu'Internet Explorer, les attributs qui sont présents dans le tableau element.attributes dépendent du type d'attribut. Selon le type de l'élément d'entrée, l'attribut value peut-être pas partie de la liste, ce qui signifie qu'il n'est pas accessible. Cela signifie également que vous devez le référencer directement en utilisant les element.value notation. Le fait que certains éléments sont affichés et d'autres le sont pas est un peu inquiétant, parce que vous êtes de gauche se demandant ce que le navigateur se cache. Si vous regardez de près le code source et le résultat généré de la page incompatible HTML, vous noterez que les navigateurs sont la manipulation d'un attribut de façon incohérente: Ils sont manquantes le gestionnaire onclick de l'élément généré dynamiquement bouton. L'attribut onclick est généré pour le bouton statiquement définie, mais pas pour le bouton généré dynamiquement. Vous devez vous demander si vous voulez générer les gestionnaires d'événements lorsque le HTML est sérialisé. Si vous répondez non, le htmlSerialize fonction va vérifier les événements par l'essai si l'attribut commence par les lettres o et n. Mais n'est-il pas correct de sérialiser les événements? On peut avancer que si vous allez à sérialiser HTML, vous avez besoin de sérialiser tout. Cependant, tout ce sémaphore est difficile, parce que vous devez stocker des références en quelque sorte fonction. Vous ne pouvez pas conserver la mise en œuvre d'une fonction dans une caractéristique, car les attributs ne peuvent pas contenir les sauts de ligne. Votre décision doit être fondée sur ce que vous souhaiterez très probablement à voir avec la sérialisation HTML, et qui consiste à extraire de l'Etat. La solution proposée n'est pas complète, mais il résout un contexte spécifique, et c'est ce que vous avez besoin de réaliser. Lorsqu'il s'agit de résoudre le problème de la sérialisation de la référence de fonction, il ya la question de savoir comment sérialiser la fonction qui lui a été attribuée de manière dynamique, comme l'illustre l'exemple de page HTML. À titre d'illustration, essayons une sérialisation initiale des fonctions, bien que vous verrez rapidement que la sérialisation des fonctions est assez compliquée. Pour sérialiser fonctions, vous réécrire le htmlSerialize fonction comme suit: htmlSerialize: function (element) ( scriptBuffer var = "";var = Recursive 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 name = 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 (element [attr.name]). toLowerCase ( ) == "undefined") (buffer + = attr.name + "= \" "+ attr.value +" \ "";) else (buffer + = attr.name + "= \" "+ élément [attr. nom] + "\" ";)) if (attr.name.toLowerCase () ==" value ") (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 + = récursive (element.childNodes [i]);)) buffer + = " " + element.nodeName + "> ";) Else if (element.nodeType == 3) (buffer + = element.nodeValue;) buffer return;) var tampon =" "for (var i = 0; i <element.childNodes.length; i + +) (buffer + = récursive (element.childNodes [i]);) buffer return;) Le code en gras dans la mise en œuvre de modification se rapporte à la sérialisation des gestionnaires d'événements. Le premier morceau de code en gras est la déclaration d'un tampon de script. Le tampon de script est le code de script que vous avez enregistré avec le code HTML sérialisé. Il faut les deux pièces, comme le code de script se fixer de façon dynamique lorsque vous affectez le code HTML sérialisé à l'aide de la propriété innerHTML. Le code en gras seconde est la sérialisation des événements que vous avez déclaré au moment du design. Si l'élément est attaché de manière dynamique, puis tout état de cause associée n'est pas sérialisé. Pièce Le dernier et troisième code en gras est le code problématique et susceptible. Dans la page HTML d'exemple, l'événement onclick est attribuée dynamiquement, où un bouton a été injectée de manière dynamique. L'événement onclick n'est pas une chaîne qui fait référence à un autre appel. L'événement onclick référencé une fonction anonyme JavaScript. Parce que les attributs sérialisé ne peut pas contenir implémentations de la fonction complète, vous devez sérialiser la fonction et de créer une référence à la fonction qui ressemble à la sérialisation au moment du design déclaration d'élément HTML. L'événement onclick est associée dynamiquement une fonction anonyme, et n'a donc pas d'identifiant. Le code en gras définit une fonction qui est une concaténation de l'identifiant de l'élément et l'événement onclick. Bien que l'exemple de ce dynamisme n'a pas d'id, de nombreuses manifestations onclick identique sera généré. Vous pouvez également générer un identifiant aléatoire et ensuite référencer cet identificateur aléatoire dans le code HTML sérialisé. L'identifiant aléatoire résout le problème de l'identificateur de fonction. Mais maintenant il ya deux tampons. Une mémoire tampon contient le numéro de série du code HTML, et un autre tampon contient le script que vous avez besoin pour exécuter afin que les références de fonction ne génère pas d'erreurs. Comme vous pouvez le voir, le code commence maintenant à devenir très compliqué et peu bancal. C'est pourquoi je recommande la sérialisation pas les événements, sauf si absolument nécessaire. Rappelez-vous les points suivants concernant cet article sérialisation HTML: • sérialisation HTML est pleine de détails, les exceptions, et peu de problèmes. Par exemple, lors de la sérialisation en utilisant htmlSerialize, IE génère Oodles d'attributs que vous ne définit pas. Cela est dû à des défaillances et la rend plus difficiles à extraire du code HTML. Vous devez considérer que la feuille de style est la gestion par défaut. • Lors de l'implémentation de sérialisation HTML, ne vous fiez pas de solutions générales. Confiance aux solutions spécifiques capables de résoudre des problèmes précis dans un contexte donné. • Les propriétés qui vous attribuez à la méthode setAttribute sont visibles à la fois pour les navigateurs lors de l'utilisation de la propriété innerHTML. • Mis à jour le contenu HTML que vous enregistrez à partir du navigateur en utilisant Enregistrer sous ne sont pas stockés de façon uniforme dans tous les navigateurs. • L'article 2 a montré comment sérialiser un objet JavaScript, et cet article montre comment sérialiser DHTML. Chaque type de sérialisation est une sérialisation spécifiques à un usage unique. Vous devez être au courant de ces détails et choisissez la sérialisation appropriées. un article présenté par Sonja Lande Disclaimer:Notre site n'est pas responsable du contenu de cet article. Webarticles est une ressource d'information gratuite. Important: Cet article «Sauvegarde HTML" a été traduit par un logiciel automatique. Nous nous sentons désolés pour les fautes d'orthographe que mai ont eu lieu. Nous vous remercions de votre compréhension.
|
|||||
| Online: 506 users browsing the articles directory |
|
|