Naprawianie funkcji tablicy JavaScript w przeglądarce Internet Explorer (indexOf, forEach, itd.) [zamknięte]

Jak szczegółowo gdzie indziej , a poza tym najwyraźniej dobrze znany, Internet Explorer (zdecydowanie wersja 7, a w niektórych przypadkach wersja 8) nie implementuje kluczowych funkcji, w szczególności na Array (takich jak forEach, indexOf, itp.).

Istnieje wiele obejść, ale chciałbym złożyć odpowiedni, kanoniczny zestaw implementacji na naszej stronie, zamiast kopiować i wklejać lub hakować nasze własne implementacje. Znalazłem js-metody, które wyglądają obiecujące, ale pomyślałem, że zamieszczę tutaj, aby zobaczyć, czy inna Biblioteka jest bardziej polecana. Kilka różnych kryteriów:

  • biblioteka powinna po prostu nie działać dla tych funkcji, dla których przeglądarka ma już implementacje (js-methods wydaje się tu całkiem dobrze działać).
  • Nie-GPL, proszę, chociaż LGPL jest do przyjęcia.
Author: Community, 2010-05-07

6 answers

Wiele z nich korzysta z implementacji MDC fallback (np. dla indexOf ). Są one na ogół rygorystycznie zgodne ze standardami, nawet w zakresie jawnego sprawdzania typów wszystkich argumentów.

Niestety, o ile jest jasne, że autorzy uważają ten kod za trywialny i swobodnie nadający się do użytku, nie wydaje się, aby istniała wyraźna licencja na umieszczenie tego na piśmie. Wiki jako całość jest CC Attribution-ShareAlike, jeśli jest to akceptowalna licencja (choć CC nie jest przeznaczona dla kod jako taki).

Js-methods wygląda ogólnie dobrze, ale nie jest tak zgodny ze standardami na obrzeżach tego, jak mają być funkcje (np. undefined list items, functions that mutate the list). Jest również pełna innych przypadkowych niestandardowych metod, w tym niektórych wątpliwych, takich jak podejrzane striptagi i niekompletny kodek UTF-8(który jest również trochę niepotrzebny, biorąc pod uwagę sztuczkę unescape(encodeURIComponent)).

Jeśli to coś warte, oto, czego używam (które niniejszym publikuję publicznie domeny, jeśli można powiedzieć, że w ogóle podlega prawu autorskiemu). Jest nieco krótszy niż wersje MDC, ponieważ nie próbuje wpisać-sniff, że nie zrobiłeś czegoś głupiego, jak pass wywołania zwrotne non-function lub indeksy non-integer, ale poza tym stara się być zgodny ze standardami. (Daj mi znać, jeśli coś przeoczyłem. ;-))

'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;
    };
}

Inne metody ECMA262-5 nie zaimplementowane tutaj zawierają tablicę reduce/reduceRight, JSON i kilka nowych metod Object, które można niezawodnie zaimplementować jako Funkcje JS.

 219
Author: bobince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-07 18:57:22

Spójrz na podkreślenie.js .

 27
Author: rfunduk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-25 11:29:31

Kris Kowal skompilował małą bibliotekę, która działa jako shim dla ECMAScript 5 funkcji, których może brakować w implementacji przeglądarki. Niektóre funkcje były wielokrotnie zmieniane przez inne osoby w celu optymalizacji szybkości i obejścia błędów przeglądarki. Funkcje są zapisywane tak, aby jak najdokładniej podążały za specyfikacją.

Es5-shim.js został wydany na licencji MIT, the Array.prototype extensions są blisko góry i można posiekaj i usuń wszystkie funkcje, których nie potrzebujesz. Sugeruję również minifikację skryptu, ponieważ komentarze czynią go znacznie większym, niż musi być.

 9
Author: Andy E,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:51

Przez "nie implementuj kluczowych funkcji" masz na myśli "zgodny z ECMA 262 3' ed " prawda? :)

Metody, do których się odnosisz, są częścią nowej edycji 5 '- tej-W przypadku przeglądarek nie obsługujących tej edycji możesz użyć następującego "shim", który rozciąga się od 3 'do 5' - tej http://github.com/kriskowal/narwhal-lib/blob/narwhal-lib/lib/global-es5.js .

 1
Author: Sean Kinsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-07 18:01:09

Te skrypty nie działają dobrze w moich testach. Tworzę Plik z tymi samymi funkcjami na podstawie MDN dokumenty.

Zbyt wiele obszarów problemów jest rozwiązywanych w Internet Explorer 8. Zobacz kod w egermano / ie-fix.js.

 1
Author: egermano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-24 19:18:24

Z podkreśleniem.js

var arr=['a','a1','b'] _.filter(arr, function(a){ return a.indexOf('a') > -1; })

 0
Author: sri_bb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-10 11:31:10