86 votes

JQuery html() vs. innerHTML

Puis-je me fier entièrement à la fonction de jQuery html() se comporte de manière identique à la méthode innerHTML ? Y a-t-il une différence entre innerHTML et de jQuery html() ? Si ces deux méthodes ont le même effet, puis-je utiliser la méthode jQuery html() à la place de la méthode innerHTML ?

Mon problème est le suivant : je travaille sur des pages déjà conçues, les pages contiennent des tableaux et, en JavaScript, la fonction innerHTML est utilisée pour les remplir de façon dynamique.

L'application fonctionne bien sur Firefox mais Internet Explorer déclenche une erreur : unknown runtime exception . J'ai utilisé l'outil jQuery html() méthode et IE a disparu. Mais je ne suis pas sûr que cela fonctionnera pour tous les navigateurs et je ne sais pas s'il faut remplacer toutes les pages de l'application innerHTML avec les propriétés de jQuery html() méthode.

Merci beaucoup.

9 votes

Utiliser jQuery html(). J'ai eu des problèmes avec innerHTML à plusieurs reprises. Et html() fonctionne sur tous les navigateurs.

124voto

jAndy Points 93076

Pour répondre à votre question :

.html() appellera simplement .innerHTML après avoir fait quelques vérifications pour les types de nœuds et autres. Il utilise également un try/catch où il essaie d'utiliser innerHTML d'abord, et si cela échoue, il se rabattra gracieusement sur la méthode jQuery .empty() + append()

13 votes

Notez qu'avec Internet Explorer 8 (et très probablement les versions antérieures), les vérifications supplémentaires peuvent ajouter un impact significatif sur les performances pour les insertions importantes, donc si les performances sur IE sont importantes, vous pouvez envisager d'utiliser la fonction innerHTML directement.

3 votes

Une comparaison concise des performances : jsperf.com/innerhtml-vs-html-vs-empty-appendement

18voto

Simon_Weaver Points 31141

En ce qui concerne spécifiquement la question "Puis-je compter complètement sur la méthode jquery html() pour qu'elle fonctionne comme innerHTML", ma réponse est NON !

Exécutez ceci dans Internet Explorer 7 ou 8 et vous verrez.

jQuery produit un mauvais HTML lors de la mise en place de HTML contenant une balise <FORM> imbriquée dans une balise <P> où le début de la chaîne est une nouvelle ligne !

Il y a plusieurs cas de test ici et les commentaires lorsqu'ils sont exécutés devraient être suffisamment explicites. C'est assez obscur, mais ne pas comprendre ce qui se passe est un peu déconcertant. Je vais déposer un rapport de bogue.

<html>

    <head>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>   

        <script>
            $(function() {

                // the following two blocks of HTML are identical except the P tag is outside the form in the first case
                var html1 = "<p><form id='form1'><input type='text' name='field1' value='111' /><div class='foo' /><input type='text' name='field2' value='222' /></form></p>";
                var html2 = "<form id='form1'><p><input type='text' name='field1' value='111' /><div class='foo' /><input type='text' name='field2' value='222' /></p></form>";

                // <FORM> tag nested within <P>
                RunTest("<FORM> tag nested within <P> tag", html1);                 // succeeds in Internet Explorer    
                RunTest("<FORM> tag nested within <P> tag with leading newline", "\n" + html1);     // fails with added new line in Internet Explorer

                // <P> tag nested within <HTML>
                RunTest("<P> tag nested within <FORM> tag", html2);                 // succeeds in Internet Explorer
                RunTest("<P> tag nested within <FORM> tag with leading newline", "\n" + html2);     // succeeds in Internet Explorer even with \n

            });

            function RunTest(testName, html) {

                // run with jQuery
                $("#placeholder").html(html);
                var jqueryDOM = $('#placeholder').html();
                var jqueryFormSerialize = $("#placeholder form").serialize();

                // run with innerHTML
                $("#placeholder")[0].innerHTML = html;

                var innerHTMLDOM = $('#placeholder').html();
                var innerHTMLFormSerialize = $("#placeholder form").serialize();

                var expectedSerializedValue = "field1=111&field2=222";

                alert(  'TEST NAME: ' + testName + '\n\n' +
                    'The HTML :\n"' + html + '"\n\n' +
                    'looks like this in the DOM when assigned with jQuery.html() :\n"' + jqueryDOM + '"\n\n' +
                    'and looks like this in the DOM when assigned with innerHTML :\n"' + innerHTMLDOM + '"\n\n' +

                    'We expect the form to serialize with jQuery.serialize() to be "' + expectedSerializedValue + '"\n\n' +

                    'When using jQuery to initially set the DOM the serialized value is :\n"' + jqueryFormSerialize + '\n' +
                    'When using innerHTML to initially set the DOM the serialized value is :\n"' + innerHTMLFormSerialize + '\n\n' +

                    'jQuery test : ' + (jqueryFormSerialize == expectedSerializedValue ? "SUCCEEDED" : "FAILED") + '\n' +
                    'InnerHTML test : ' + (innerHTMLFormSerialize == expectedSerializedValue ? "SUCCEEDED" : "FAILED") 

                    );
            }

        </script>
    </head>

    <div id="placeholder">
        This is #placeholder text will 
    </div>

</html>

0 votes

Je pense que ce rapport de bogue est revenu en me disant que j'avais du HTML invalide par rapport à ce qui était autorisé dans une balise <P> - ou quelque chose comme ça. C'était il y a un certain temps donc je ne suis pas sûr que quelque chose ait changé, mais cela obtient toujours des votes positifs 3 ans plus tard donc si quelqu'un a quelque chose à ajouter, s'il vous plaît ajoutez un commentaire.

0 votes

Ce problème est toujours présent dans IE9, essayez avec cela : $("body").html("<p><form><div>Vous voyez ce que j'ai fait là ?</div></form></p>") ;

8voto

Box9 Points 41987

Si vous vous interrogez sur la fonctionnalité, alors la fonction de jQuery .html() effectue la même chose prévu la fonctionnalité comme .innerHTML mais il effectue également des contrôles de compatibilité entre navigateurs.

Pour cette raison, vous pouvez toujours utiliser la fonction de jQuery .html() au lieu de .innerHTML si possible.

2 votes

InnerHTML est une propriété du document/élément et non une méthode.

6voto

Craig Points 15049

InnerHTML n'est pas standard et peut ne pas fonctionner dans certains navigateurs. J'ai utilisé html() dans tous les navigateurs sans aucun problème.

3 votes

C'est la norme maintenant (je ne sais pas à quelle époque la question a été posée) : domparsing.spec.whatwg.org/#innerhtml

3voto

codersarepeople Points 720

"Cette méthode utilise la propriété innerHTML du navigateur." - API jQuery

http://api.jquery.com/html/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X