137 votes

Fixation JavaScript les fonctions de Tableau dans Internet Explorer (indexOf, forEach, etc.)

Comme détaillé ailleurs, et autrement apparemment bien connu, Internet Explorer (certainement de la version 7, et dans certains cas, la version 8) ne pas mettre en œuvre les principales fonctions, en particulier sur Array (comme forEach, indexOf, etc).

Il y a un certain nombre de solutions de contournement ici et là, mais j'aimerais à la fois un bon canonique ensemble d'implémentations dans notre site plutôt que de copier et de coller ou de bidouiller à nos propres implémentations. J'ai trouvé js-méthodes, qui a l'air prometteur, mais pensé que je poste ici, pour voir si une autre bibliothèque est de plus fortement recommandé. Un couple de divers critères:

  • La bibliothèque devrait juste être un non-fonctionnement de ces fonctions que d'un navigateur a déjà des implémentations (js-methods semble très bien ici).
  • Non-GPL, s'il vous plaît, si LGPL est acceptable.

220voto

bobince Points 270740

Beaucoup utilisent le MDC de secours implémentations (eg. pour indexOf). Ils sont généralement rigoureusement conforme aux normes, à la limite même explicitement de vérifier les types de tous les arguments.

Malheureusement, alors qu'il est clair que les auteurs considèrent ce code comme trivial et librement utilisable, il ne semble pas être explicite d'une licence de subvention pour mettre cela par écrit. Le wiki est un tout CC Attribution-partage dans les mêmes conditions, si c'est une licence acceptable (si CC n'est pas conçu pour le code en tant que tel).

js-méthodes semble OK en général, mais n'est pas conforme aux normes sur les bords de la façon dont les fonctions sont censés être (eg. pas défini les éléments de la liste, les fonctions qui muter la liste). C'est aussi plein d'autres aléatoire de méthodes non normalisées, y compris quelques jeux comme les louches stripTags et l'incomplétude de l'UTF-8 codec (qui est aussi un peu inutile étant donné l' unescape(encodeURIComponent) truc).

Pour ce que ça vaut, voici ce que j'utilise (qui, je décharge dans le domaine public, si l'on peut dire pour être protégeable). C'est un peu plus court que le MDC versions qu'il ne tente pas de type-sentir que vous n'avez pas fait quelque chose de stupide comme le pass de non-fonctionnement des rappels ou des non-index entiers, mais en dehors de cela, il tente d'être conformes aux normes en vigueur. (Laissez-moi savoir si j'ai raté quelque chose. ;-))

'use strict';

// Add ECMA262-5 method binding if not supported natively
//
if (!('bind' in Function.prototype)) {
    Function.prototype.bind= function(owner) {
        var that= this;
        if (arguments.length<=1) {
            return function() {
                return that.apply(owner, arguments);
            };
        } else {
            var args= Array.prototype.slice.call(arguments, 1);
            return function() {
                return that.apply(owner, arguments.length===0? args : args.concat(Array.prototype.slice.call(arguments)));
            };
        }
    };
}

// Add ECMA262-5 string trim if not supported natively
//
if (!('trim' in String.prototype)) {
    String.prototype.trim= function() {
        return this.replace(/^\s+/, '').replace(/\s+$/, '');
    };
}

// Add ECMA262-5 Array methods if not supported natively
//
if (!('indexOf' in Array.prototype)) {
    Array.prototype.indexOf= function(find, i /*opt*/) {
        if (i===undefined) i= 0;
        if (i<0) i+= this.length;
        if (i<0) i= 0;
        for (var n= this.length; i<n; i++)
            if (i in this && this[i]===find)
                return i;
        return -1;
    };
}
if (!('lastIndexOf' in Array.prototype)) {
    Array.prototype.lastIndexOf= function(find, i /*opt*/) {
        if (i===undefined) i= this.length-1;
        if (i<0) i+= this.length;
        if (i>this.length-1) i= this.length-1;
        for (i++; i-->0;) /* i++ because from-argument is sadly inclusive */
            if (i in this && this[i]===find)
                return i;
        return -1;
    };
}
if (!('forEach' in Array.prototype)) {
    Array.prototype.forEach= function(action, that /*opt*/) {
        for (var i= 0, n= this.length; i<n; i++)
            if (i in this)
                action.call(that, this[i], i, this);
    };
}
if (!('map' in Array.prototype)) {
    Array.prototype.map= function(mapper, that /*opt*/) {
        var other= new Array(this.length);
        for (var i= 0, n= this.length; i<n; i++)
            if (i in this)
                other[i]= mapper.call(that, this[i], i, this);
        return other;
    };
}
if (!('filter' in Array.prototype)) {
    Array.prototype.filter= function(filter, that /*opt*/) {
        var other= [], v;
        for (var i=0, n= this.length; i<n; i++)
            if (i in this && filter.call(that, v= this[i], i, this))
                other.push(v);
        return other;
    };
}
if (!('every' in Array.prototype)) {
    Array.prototype.every= function(tester, that /*opt*/) {
        for (var i= 0, n= this.length; i<n; i++)
            if (i in this && !tester.call(that, this[i], i, this))
                return false;
        return true;
    };
}
if (!('some' in Array.prototype)) {
    Array.prototype.some= function(tester, that /*opt*/) {
        for (var i= 0, n= this.length; i<n; i++)
            if (i in this && tester.call(that, this[i], i, this))
                return true;
        return false;
    };
}

D'autres ECMA262-5 méthodes qui ne sont pas mis en œuvre ici comprennent Array reduce/reduceRight, le JSON et les quelques nouveaux Object méthodes qui peuvent être mis en œuvre de manière fiable que JS fonctions.

27voto

rfunduk Points 15267

Jetez un oeil à underscore.js.

9voto

Andy E Points 132925

Kris Kowal a compilé une petite bibliothèque qui agit comme une cale pour ECMAScript 5 fonctions qui peuvent être manquantes à partir du navigateur de mise en œuvre. Certaines fonctions ont été revus de nombreuses fois par d'autres personnes à être optimisé pour la vitesse et pour contourner navigateur de bugs. Les fonctions sont écrites à suivre le cahier des charges aussi étroitement que possible.

es5-shim.js a été publié sous la licence MIT, le Tableau.prototype extensions sont près du sommet et vous pouvez couper et enlever toutes les fonctions que vous n'avez pas besoin assez facilement. Je vous conseille aussi rapetisser le script que les commentaires qui font qu'il est beaucoup plus grand qu'il doit être.

1voto

Sean Kinsey Points 17117

Par "ne pas mettre en œuvre les principales fonctions vous avez réellement signifie" conforme à l'ECMA 262 3'rd ed " droit? :)

Les méthodes que vous faites référence à la 5 ième édition - pour les navigateurs ne supportant pas cela, vous pouvez utiliser le "cale" qui s'étend sur 3'rd en 5 ième http://github.com/kriskowal/narwhal-lib/blob/narwhal-lib/lib/global-es5.js.

1voto

egermano Points 163

Ces scripts ne fonctionnent pas bien dans mes tests. J'ai créer un fichier avec les mêmes fonctions basées sur MDN documents.

Trop de problèmes zones sont résolus dans Internet Explorer 8. Voir le code dans egermano / ie-fix.js.

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