web-dev-qa-db-fra.com

Javascript IE erreur: appel inattendu à la méthode ou à la propriété

J'ai le code suivant et ça marche (comme d'habitude) dans tout sauf IE. Cela me donne un appel inattendu à un accès à une méthode ou à une propriété dans Jquery et je ne sais pas comment le déboguer. J'utilise la barre d'outils de développeur IE, qui est inutile pour cette erreur et me fournit simplement une ligne n ° 12 (à l'intérieur du script jQuery).

Toute aide est très appréciée:

<script type="text/javascript">
$(document).ready(function () {

    $.history.init(pageload);

    $('a[href=' + window.location.hash + ']').addClass('selected');

    $('a[rel=ajax]').click(function () {

        var hash = this.href;
        hash = hash.replace(/^.*#/, '');
        $.history.load(hash);

        $('a[rel=ajax]').removeClass('selected');
        $(this).addClass('selected');
        $('.loading').show();

        getPage();

        return false;
    });
});

function pageload(hash) {
    if (hash) getPage();
}

function getPage() {

    hash = document.location.hash;
    hash = hash.replace(/^.*#/, '');
    var data = 'page=' + encodeURIComponent(hash);
    $.ajax({
        url: "index.php",
        type: "POST",
        data: data,
        cache: false,
        success: function (html) {
            $('.loading').hide();
            $('tbody').html(html);

        }
    });
}
</script>

Voici le plugin d'histoire: http://plugins.jquery.com/project/history

Et voici la démo que j'ai suivie: http://plugins.jquery.com/project/history

Changer toujours de window.location à document.location ne semble pas faire la différence

Je suis perdu sur celui-ci. Lorsque je change de mot-clé, le message que je nomme est publié, cela fonctionne donc, mais dans IE, la conception est brisée et les liens suivants sur lesquels je clique ne sont pas publiés. Vraiment étrange!! Fonctionne très bien dans Firefox, Opéra, etc.

20
Ke.

Je suis un peu surpris IE s'en plaint, mais c'est une bonne chose: vous manquez une déclaration dans getPage pour hash (par exemple, mettez var avant la première utilisation).

Sur les autres, cela crée probablement un global implicite (propriété de l'objet window appelé hash), qui est bien sûr un Bad Thing (tm), mais tel que je le comprends, il est correct selon la spécification (les sections correspondantes). étant 8.7 ["Le type de référence"] et 10.1.4 ["Résolution de la chaîne d'étendue et de l'identificateur"]).

Encore surpris IE se plaint cependant. Cela doit avoir à voir avec la portée dans laquelle jQuery appelle votre gestionnaire de clics.

8
T.J. Crowder

SI vous obtenez cette erreur lorsque vous utilisez des éléments HTML5 dans Internet Explorer, assurez-vous que vous utilisez html5shim pour indiquer à IE que ces éléments sont réels.

6
Tamlyn

Ce sera le:

$('tbody').html(html);

Internet Explorer génère une erreur lorsque vous essayez de placer certaines choses à l'intérieur de certains nœuds. Par exemple

$('<input>').append('</p>')

Pour résoudre ce problème, ajoutez la html à un autre élément. Par exemple, vous pouvez essayer:

$('table').html('<tbody>' + html + '</tbody>');
4
dave1010

Je pense que M. Crowder est sur quelque chose. Pour autant que je sache, à partir de la source jQuery, si votre fragment HTML renvoyé ne contient pas de balises <script> et n’a pas quelques caractéristiques non probables, jQuery essaie probablement de le ranger dans votre <tbody> élément en utilisant la propriété "innerHTML". IE n'aime pas ça.

Ce que vous devrez peut-être faire, c’est d’emballer le <table> entier dans un <div> factice, puis de le reconstruire à partir de votre fragment HTML.

0
Pointy

Je ne trouve pas de méthode d'historique dans l'API jQuery , donc je suppose que c'est soit:

  • Un plugin tiers.
  • Un appel indirect à un bon vieux window.history object.
  • Un objet personnalisé que vous avez créé.

Mon hypothèse est que IE (bien connu pour polluer la portée globale en rendant tout ce qui est global) pense que toute référence à history signifie en réalité window.history et que cela devient confus. . S'il s'agit d'un objet personnalisé, essayez de le renommer en myHistory ou autre chose.

0
Álvaro González

J'ai eu le même problème. À l'origine, il y avait une liste de sélection à laquelle était ajoutée une liste. En cours de route, la sélection a été remplacée par un champ de saisie. Essayer d'ajouter une balise d'option à un champ de saisie semble rendre malheureux IE.

0
jhanifen

Définissez-vous des champs de saisie?

J'ai eu le même problème, en parcourant un tableau de valeurs, mais j'avais changé une zone de texte en une entrée. Chrome l'ignore, mais IE 8 explose.

$("#someID").html("someValue") = boom! sur IE 8 si un certain ID est une entrée

Déjà eu l'appel val, mais avait besoin de supprimer le code HTML.

$("#someID").val("someValue") = bon

0
MattC

J'ai eu le même problème en ce moment. Il me semble que cela arrive pour des éléments non visibles. Vérifiez si votre élément est visible au moment de l'appel de .html() dessus.

0
Jovica Zaric

J'ai eu ce problème dans une application Web qui utilisait des éléments HTML5. Lorsque j'ai inclus le script Modernizr dans les pages, le problème a été résolu.

0
Sam