È considerata una cattiva pratica eseguire JavaScript diverso per IE

8

È considerata una cattiva pratica (e quanto pessima) eseguire diversi JavaScript per IE? Attualmente sto scrivendo un po 'di JavaScript e il modo più semplice per lavorare intorno alle stranezze di IE sembra essere quello di controllare la versione del browser ed eseguire codice diverso

var browserName = navigator.appName;

if (browserName == "Microsoft Internet Explorer") {
  //Do some stuff
}
else
{
//Do other stuff
}

È veloce e funziona bene, ma porta alla duplicazione del codice e si sente "hacky".

    
posta Tom Squires 16.05.2012 - 14:52
fonte

6 risposte

17

Si

La deduzione della funzionalità da una stringa di user agent è un test debole e soggetto a errori. Anche se relativamente comune, in questo giorno ed età direi che è certamente considerato una cattiva pratica.

Ad esempio jquery ha una funzione per rilevare quale browser sta usando un utente ed è stato deprecato dalla versione 1.3

Pertanto: non fare lo sniffing di UserAgent per decidere di cosa sia il browser o di cosa sia capace.

Best practice

La best practice accettata per gestire le differenze tra le funzionalità del browser è quella di utilizzare il rilevamento delle funzioni .

Ci sono alcune librerie in giro per questo, il più conosciuto è probabilmente: Modernizr . Modernizr rende facile personalizzare il tuo javascript alle capacità di un browser. Funziona rilevando ciò che è disponibile; non indovinare in base a una stringa UserAgent (tranne come fallback di ultima istanza) e semplicemente aggiungendo classi al tag html. Ciò rende non solo possibile gestire facilmente diversi casi nel tuo js, ma anche risolvere alcune carenze con i soli CSS. per esempio. (solo a scopo illustrativo):

ul.menu {
    display:none;
}
ul.menu:hover {
    display:block;
}

# A touch device can have no hover - so show it always
html.notouch ul.menu {
    display: block;
}
    
risposta data 16.05.2012 - 22:14
fonte
3

Va bene quando è valido JS e non ci sono astrazioni

Non è esattamente una cattiva pratica, anche se è migliorata, i browser non sono identici al 100%.

Ma, prima di iniziare casi speciali, guarda attentamente, se sono davvero casi speciali e non solo idiosincrasie di un altro browser. In questo caso, dovresti cercare una soluzione utilizzando gli standard condivisi da tutti i browser ( caniuse.com è di grande aiuto per questo).

Quando sei sicuro che sia effettivamente specifico per il browser, dovresti guardare se puoi usare una libreria che nasconde questo dettaglio da te. La compatibilità tra browser è una cosa difficile da ottenere, quindi se qualcuno lo ha fatto per te, guadagna.

Come ultima risorsa, fai ciò che devi fare;)

    
risposta data 16.05.2012 - 15:03
fonte
2

Se con "fai un po 'di cose" intendi "usa IE specifica funzione x" e "fai qualche altra cosa" intendi "usa più facilità comune", allora è meglio fare una verifica della presenza di x o y.

Suppongo che al momento non utilizzi alcuna libreria Javascript esterna. In tal caso, vorrei verificare se jQuery supporta l'attività che stai cercando di realizzare. Se lo fa, lo userei.

    
risposta data 16.05.2012 - 17:41
fonte
1

Usa i commenti specifici di IE <!--[if IE &gt; 6]>... o qualcosa del genere. Funziona su tutti i browser super-schifosi IE? - > IE8, ma non su IE9 + considerato ok come browser.

La linea di fondo, una volta che hai a che fare con browser super-crappy che ha bisogno di soluzioni alternative, è ok per fare tutto ciò che è necessario, ma evitando di trasformare bene il codice di base scritto in un hackatron.

Se tutto va bene, IE andrà via un giorno e sarai in grado di eliminare il codice di hackatron e lasciare solo la linea di base ben scritta.

    
risposta data 16.05.2012 - 22:19
fonte
-1

Penso che sia meglio rinviare questo tipo di processo decisionale al progettista del framework e utilizzare una struttura JavaScript che racchiuda questo tipo di complessità. Oggigiorno abbiamo AngularJS, JQuery, ReactJS e così via, fare cose senza un framework ti procurerebbe questo tipo di difficoltà.

    
risposta data 12.06.2016 - 05:04
fonte
-2

Bene, supponendo che tu sia realmente interessato all'apprendimento di JavaScript, la migliore pratica è questa: preferisci test per assenza / esistenza di metodi e funzioni di normalizzazione della scrittura. Quindi un esempio totalmente zoppo, ma colpisce tre principi:

if(!document.getElementsByClassName){
    document.getByClass = function(){ //look at all elements, check for class etc...
}
else { document.getByClass = document.getElementsByClassName }
  1. Non fare il browser sniff.
  2. Si potrebbe anche eliminare un po 'di DOM cruft mentre si va. Lo scopo dell'API DOM è quello di essere espliciti, per non andare facilmente sul tuo tunnel carpale, se non hai notato quanto sia incredibilmente flessibile JS. Il quasi-elimina-qualsiasi fattore è ciò che rende l'esempio zoppo.
  3. Cache ad una nuova funzione. Non eseguire il test del metodo ogni volta che viene chiamato.

Il vantaggio è che non puoi mai fidarti al 100% dello sniffing del browser e non sai mai quando un'altra libreria a cui è stato collegato non ha effettivamente aggiunto un metodo equivalente per te.

Che tu stia solo provando a fare qualcosa o voglia saperne di più, consiglio JQuery. Fa un ottimo lavoro per eliminare il cruft delle API DOM e mantenere un alto livello di normalizzazione multipiattaforma, ma è anche qualcosa che puoi imparare molto da studiare sotto il cofano. Ancora più importante, se ti preoccupi di continuare a imparare realmente il JS di base, non diventa inutile come molti altri framework e librerie JS e continuerai a trarre vantaggio dalla possibilità di sgraziare la tua roba JQuery con il tuo pazzo OOP-ish competenze.

Inoltre, controlla quirksmode.org per capire perché Microsoft dovrebbe essere veramente disprezzato per tutti gli IE precedenti a 9 sul fronte JS e molti dettagli nitty su esattamente quanto c'è di sbagliato nella loro API DOM proprietaria e suggerimenti per lavorare intorno ad esso.

    
risposta data 17.05.2012 - 08:39
fonte

Leggi altre domande sui tag