28 votes

Comment "activer" dans IE 8 des éléments HTML5 qui ont été insérés par appel AJAX ?

Voir la solution au bas de la question.

IE 8 (et inférieur) ne fonctionne pas bien avec les éléments inconnus (c'est-à-dire les éléments HTML5), on ne peut pas les styliser, ni accéder à la plupart de leurs propriétés. Il existe de nombreuses solutions pour contourner ce problème, par exemple : http://remysharp.com/2009/01/07/html5-enabling-script/

Le problème est que cela fonctionne très bien pour le HTML statique qui était disponible au chargement de la page, mais lorsque l'on crée des éléments HTML5 par la suite (par exemple un appel AJAX les contenant, ou simplement la création avec JS), ces éléments nouvellement ajoutés seront marqués comme HTMLUnknownElement comme supposé le faire HTMLGenericElement (dans le débogueur d'IE).

Quelqu'un connaît-il un moyen de contourner ce problème, afin que les éléments nouvellement ajoutés soient reconnus/activés par IE 8 ?

Voici une page de test :

<html><head><title>TIME TEST</title>
    <!--[if IE]>
    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
</head>

<body>
    <time>some time</time>
    <hr>
    <script type="text/javascript">
        $("time").text("WORKS GREAT");
        $("body").append("<time>NEW ELEMENT</time>"); //simulates AJAX callback insertion
        $("time").text("UPDATE");
    </script>
</body>
</html>

Dans IE, vous verrez le : UPDATE , et NEW ELEMENT. Dans tout autre navigateur moderne, vous verrez UPDATE, et UPDATE

25voto

Praveen Points 246

Pour tous les problèmes de html5 dans IE7 j'utilise html5shiv et pour tenir compte des éléments html5 qui reviennent dans les appels ajax, j'utilise innershiv .

Ces deux petits plugins ont fonctionné pour moi comme un charme jusqu'à présent.

-- Praveen Gunasekara

4voto

mattbasta Points 7377

JQuery a des moyens magiques et obscurs de créer des éléments. Utilisation de document.createElement au lieu de cela devrait faire toute la différence :

var time = document.createElement("time");
time.innerHTML = "WORKS GREAT";
document.appendChild(time);

Je ne crois pas que vous puissiez utiliser le .append() syntaxe (comme .innerHTML += "" ) avec HTML5 et IE. Le problème ne réside pas dans la capacité d'IE à utiliser ou à afficher les éléments HTML5, mais dans sa capacité à les analyser. Chaque fois que vous instanciez un élément HTML5 de manière programmatique, vous doit le faire avec document.createElement .

2voto

jiggybit Points 21

J'ai également rencontré des problèmes lors de la récupération d'un tas de HTML contenant des éléments HTML5 à partir du serveur en utilisant AJAX. html5shiv n'a pas pu sauver ma journée. Le modèle de mon projet est basé sur le html5boilerplate et utilise Modernizr pour corriger le comportement des balises HTML5 dans IE < 9. Après avoir lu ce fil, j'ai eu une intuition et j'ai réussi à faire fonctionner mon code.

Le code problématique injectant le HTML fraîchement pressé dans le DOM était :

var wrapper = $('<div />')
    .addClass('wrapper')
    .html(data.html)
    .appendTo(wrapper);

En gros, ce qui se passe ici est :

  1. créer un nouvel élément
  2. le innerHTML du nouvel élément est mis à jour
  3. le nouvel élément et son innerHTML sont ajoutés à un élément existant dans le DOM.

En le remplaçant par le texte suivant, je règle mon problème :

var wrapper = $('<div />')
    .addClass('wrapper')
    .appendTo(el);
wrapper.html(data.html);

Ce qui se passe maintenant est :

  1. créer un nouvel élément
  2. Le nouvel élément vide est ajouté à un élément existant dans le DOM.
  3. le innerHTML de l'élément nouvellement ajouté est mis à jour.

Maintenant, même IE7 n'a d'autre choix que d'afficher les éléments HTML5 chargés de manière asynchrone comme je le souhaite :)

Merci Julio, je garderai votre plugin à portée de main au cas où j'en aurais besoin à l'avenir. Mais pour l'instant, je suis content de ne pas avoir à ajouter les manipulations DOM supplémentaires.

Peut-être que cette solution de contournement fonctionne aussi pour d'autres personnes.

2voto

schellmax Points 1830

Notez que la fonctionnalité innershiv est intégrée à jquery à partir de la version 1.7 http://blog.jquery.com/2011/11/03/jquery-1-7-released/

0voto

Julio Vedovatto Points 73

Je laisse juste ceci pour contribuer à la discussion.

Le script fourni par @Gidon semble ne pas fonctionner dans IE8 (testé sur deux machines différentes). J'ai dû refaire le plugin jQuery d'une autre manière, voir ci-dessous :

/**
 * Enable HTML5 Elements on the fly. IE needs to create html5 elements every time.
 * @author Gidon
 * @author Julio Vedovatto <juliovedovatto@gmail.com>
 * @see http://stackoverflow.com/questions/2363040/how-to-enable-html5-elements-in-ie-that-were-inserted-by-ajax-call
 */
(function ($) {
    jQuery.fn.html5Enabler = function () {
        var element = this;

        if (!$.browser.msie)
            return element;

            $.each(
                ['abbr','article','aside','audio','canvas','details','figcaption','figure','footer','header','hgroup','mark','menu','meter','nav','output','progress','section','summary','time','video'],
                function() {
                    if ($(element).find(this).size() > 0) {
                        $(element).find(this).each(function(k,child){
                            var el = $(document.createElement(child.tagName));

                            for (var i = 0; i < child.attributes.length; i++)
                                el.attr(child.attributes[i].nodeName, child.attributes[i].nodeValue);

                            el.html(child.innerHTML);

                            $(child).replaceWith(el);
                        });
                    }
                }
            );
    };
})(jQuery);

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