2012-01-04 10 views
34

ECMAScript Fifth Edition (wydana w grudniu 2009 r.) Wprowadza kilka nowych metod (szczegóły: patrz this table). Jednak wciąż istnieją starsze przeglądarki, które nie wdrażają tych nowych metod.Jak dostarczyć ECMAScript 5 (ES 5) -shim?

Na szczęście istnieje wygodny skrypt (napisany w JavaScript) - ES5-shim - który implementuje te metody ręcznie w środowiskach, w których nie istnieją.

Jednak nie jestem pewien, w jaki sposób zapewnić ES5-podkładkę ... Mam tylko „dać” je do wszystkich przeglądarek, tak:

<script src="es5-shim.js"></scipt> 

Albo powinienem obejmować sprawdzenie, aby tylko „przeszkadza” tych przeglądarek, które naprawdę potrzebują, tak jak poniżej:.

<script> 
    if (!Function.prototype.hasOwnProperty('bind')) { 
     (function() { 
      var shim = document.createElement('script'); 
      shim.src = 'es5-shim.js'; 
      var script = document.getElementsByTagName('script')[0]; 
      script.parentNode.insertBefore(shim, script); 
     }()); 
    } 
</script> 

(używam Function.prototype.bind aby sprawdzić, czy przeglądarka implementuje wszystkie nowe ECMAScript 5 metod zgodnie z tabelą kompatybilności która I połączone powyżej, jest bind "ostatni bastion", jeśli chodzi o wdrażanie ECM Metody AScript 5.)

Oczywiście, aby ta podkładka była skuteczna, musi być wykonana przed wszystkimi innymi skryptami, co oznacza, że ​​chcemy dołączyć wyżej wymienione elementy SCRIPT na początku strony (w HEAD, przed wszystkimi innymi elementami SCRIPT).

Czy ten drugi przykład byłby dobrym sposobem na udostępnienie przeglądarki ECMAScript 5-shim? Czy istnieje lepszy sposób na zrobienie tego?

Odpowiedz

22

ES5-Shim będzie tylko podkładać części, których przeglądarki nie implementują, więc po prostu daj je wszystkim przeglądarkom. Poradzi sobie z wykrywaniem tego, co musi być przesłonięte, a co nie.

Należy jednak zwrócić uwagę na zastrzeżenia wymienione na temat, które podkładki nie działają poprawnie w niektórych przypadkach. Miałem problemy z tym w przeszłości i powoduje mnóstwo bólu, dopóki nie uświadamiasz sobie, że odpowiedź była bardzo prosta ...

+8

Ale to zmusi przeglądarek ES5 kompatybilne (najnowsze IE, Chrome, Firefox, wkrótce Opera), aby pobrać i wykonać podkładkę, która spowalnia strony internetowej niepotrzebnie . Jeśli uda mi się tego uniknąć przy niewielkiej kontroli JavaScript, chętnie to zrobię. –

+3

@ ŠimeVidas: To 8kB. Przy odpowiednim buforowaniu nie ma się czym martwić. – You

+0

Uderzenie wydajności jest znikome, ES5 Shim robi wszystko, co możliwe, aby uniknąć niepotrzebnego wykonywania kodu. – JaredMcAteer

8

Obecnie najlepszym rozwiązaniem dla ES5-Shim jest korzystanie z biblioteki w wszystkie środowiska i pozwalają mu wykryć, które funkcje musi załatać w czasie wykonywania. Byłoby jeszcze lepiej dostarczyć go ze społecznościowej sieci CDN, aby zmaksymalizować liczbę trafień w pamięci podręcznej między witrynami.

Jest to otwarta okazja do stworzenia systemów łączących wykrywanie cech, odciski palców agentów i dynamiczne pakowanie w celu automatycznego generowania i dostarczania ukierunkowanych podzbiorów podkładek. Zakres problemu wykracza daleko poza tylko ES5-Shim i może być stosowany do wszelkiego rodzaju podkładek.

+0

Tak, zauważyłem, że [CDNJS] (http://www.cdnjs.com/) go hostuje ... –

12

To wydaje się działać dla mnie:

<!--[if lt IE 9]><script src="java/es5-shim.min.js"></script><![endif]--> 
+1

Co z przeglądarkami innymi niż IE które nie wspierają ES5? – Bergi

+3

@Bergi: Nie sądzę, że faktycznie istnieją. –

+1

@RocketHazmat: Przypuszczam, że masz na myśli "te są ledwo używane", ale one istnieją na pewno. Weź wersje pre-ES5 popularnych przeglądarek lub niektórych wbudowanych lub mobilnych przeglądarek. – Bergi