2012-01-04 10 views
34

ECMAScript Fifth Edition (rilasciato nel dicembre 2009) introduce una serie di nuovi metodi (vedere this table per i dettagli). Tuttavia, ci sono ancora vecchi browser che non implementano questi nuovi metodi.Come fornire ECMAScript 5 (ES 5) -shim?

Fortunatamente, esiste uno script comodo (scritto in JavaScript) - ES5-shim - che implementa manualmente tali metodi in ambienti in cui non esistono.

Tuttavia, io non sono sicuro di come fornire ES5-shim ... Devo solo "dare" a tutti i browser, in questo modo:

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

O dovrei includere un controllo al fine di solo "fastidio" quei browser che ne hanno davvero bisogno, in questo modo:.

<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> 

(sto usando Function.prototype.bind per verificare se un browser implementa tutti i nuovi ECMAScript 5 metodi Secondo la tabella di compatibilità che ho linkato sopra, bind è "l'ultimo baluardo" quando si tratta di implementare ECM AScript 5 metodi.)

Naturalmente, per questo spessore per essere efficace, deve essere eseguito prima tutti gli altri script, il che significa che vogliamo includere gli elementi di script di cui sopra menzionati all'inizio della pagina (in HEAD, prima di tutti gli altri elementi SCRIPT).

Quindi, questo secondo esempio sarebbe un buon modo per fornire ECMAScript 5-shim ai browser? C'è un modo migliore per farlo?

risposta

22

ES5-Shim limiterà solo le parti non implementate dai browser, quindi assegnale a tutti i browser. Gestirà il rilevamento di ciò che deve essere spalmato e cosa no.

Ma prestare attenzione agli avvertimenti elencati su quali spessori non funzionano correttamente in alcuni casi. Ho avuto problemi con questo in passato e causa un sacco di dolore fino a quando non ti rendi conto che la risposta era super semplice ...

+8

Ma sarebbe forzare i browser ES5-compatibile (ultima IE, Chrome, Firefox, presto Opera) per scaricare ed eseguire lo spessore che rallenta la pagina web inutilmente . Se posso evitarlo con un piccolo controllo JavaScript, lo farò volentieri. –

+3

@ ŠimeVidas: è 8kB. Con un corretto caching, non c'è niente di cui preoccuparsi. – You

+0

La performance hit è trascurabile, ES5 Shim fa già tutto il possibile per evitare l'esecuzione di codice non necessaria. – JaredMcAteer

8

Al momento, la soluzione che funziona meglio con ES5-Shim è utilizzare la libreria in tutti gli ambienti e consentono di rilevare le funzionalità di cui ha bisogno per la patch in fase di esecuzione. Sarebbe anche meglio consegnarlo da una comunità CDN per massimizzare gli hit della cache tra siti.

Detto questo, esiste un'opportunità aperta per creare sistemi che combina rilevamento di feature, fingerprinting agente e raggruppamento dinamico per generare automaticamente e fornire sottoinsiemi di shim mirati. Lo scopo del problema va ben oltre il semplice ES5-Shim e potrebbe essere applicato a tutti i tipi di spessori.

+0

Sì, ho notato [CDNJS] (http://www.cdnjs.com/) che lo ospita ... –

12

Questo sembra funzionare per me:

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

E i browser non IE che non supporta ES5? – Bergi

+3

@Bergi: Non penso che esistano realmente. –

+1

@RocketHazmat: Suppongo tu voglia dire "quelli sono usati a malapena", ma esistono di sicuro. Prendi versioni pre-ES5 dei browser più diffusi o alcuni browser integrati o mobili. – Bergi

Problemi correlati