2009-04-01 11 views
6

Sto cercando di fare una presentazione tra un paio di settimane e mi stavo chiedendo: quali sono le principali incompatibilità di Javascript tra le dieci che si osservano durante lo sviluppo? Cosa ti spara? Posso iniziare con una sola:Incompatibilità/Incoerenze Javascript

var somevar = { 
'internet': 'explorer', 
'hates': 'trailing', 
'commas': 'in', 
'json': 'code', // oh noes! 
} 

Quali sono alcuni altri grattacapi comuni che non possono o non vengono risolti usando un framework come jQuery o la base?

+0

Qual è il trucco nel codice sopra? –

+0

La virgola finale (dopo "codice") può essere presente su alcuni browser, non su altri. – Thilo

+0

Questo può far scattare gli sviluppatori PHP che stanno imparando JavaScript come me, dal momento che mi sono abituato a PHP accettando sempre l'ultima virgola. – thomasrutter

risposta

3

var x = new Boolean (false); se (x) ... altro ...;

Il ramo "se" o "altro" è stato utilizzato?

var x = "ciao", y = nuova stringa ("ciao");

qual è il tipoof (x) e il tipoof (y)?

Edit: ..

parseInt ("017") produce il 15 (ottale) invece di 17

L'oggetto 'errore' è una firma diversa da IE a Firefox.

Quando si utilizzano oggetti come hashmap, è necessario utilizzare object.hasOwnProperty (chiave) per garantire che la proprietà non venga ereditata attraverso la catena del prototipo.

+1

Quindi dove sono le incompatibilità Javascript? –

+0

Non solo incoerenze tra i browser, questa risposta fornisce la maggior parte delle incongruenze nella lingua. – cgp

7

Con markup HTML come

<div id="foo"> 
    <a href="#">Link 1</a> 
</div> 

Se si ottiene un riferimento al div esterno, si avrà un nodo figlio in alcuni browser, e tre nodi figlio in altri, a seconda di come viene trattata spazi bianchi. Alcuni avranno nodi di testo con la nuova riga e gli spazi bianchi come figli di div#foo prima e dopo l'elemento di collegamento.

+0

fortunatamente, questo è qualcosa di cui le librerie come prototype.js si prendono cura. – Thilo

+0

Non sono sicuro che qualsiasi libreria possa gestire tutte le situazioni sebbene l'analisi di spazi bianchi nel DOM non sia coerente tra i browser, il che credo sia il punto. (c'è una perdita di dati che è impossibile da sostituire) Proverò più tardi in alcuni browser per verificare. – cgp

+0

Più di un problema DOM piuttosto che uno JS, JS è abbastanza coerente nel camminare attraverso il DOM. – annakata

0

Non ci sono quasi incongruenze nelle implementazioni di JavaScript tra i vari browser. Se ci fosse, sarebbe un incubo moltiplicato (dalle molteplici incongruenze nell'implementazione DOM). Quindi "Top Ten Incompatibilità/Incoerenze Javascript" può probabilmente essere popolato solo con "Bottom One" che hai individuato. In effetti ce ne potrebbero essere un paio in più, ma non mi aspetterei che fossero importanti o addirittura degni di attenzione.

0

Incoerenze delle API DOM a parte (che è ciò che risolvono le librerie), non ce ne sono molte.

Ma alcuni motori JS hanno implementato more features, come [] .map(), [] .filter() ecc., Istruzione o E4X. Quando passo a uno sviluppo mirato di Mozilla (estensioni di Firefox, lato server con Jaxer) e sviluppo generale di tageted (siti web) del browser, devo ricordare cosa è disponibile in ogni browser e cosa no. Quindi è tutto su quello che è implementato, non come è fatto.

6

Bene, c'è un problema con il punto e virgola implicito.

return { 
    a: 1, 
    b: 2 
} 

Alcune persone, come l'apertura di parentesi su una propria linea, in questo modo:

return 
{ 
    a: 1, 
    b: 2 
} 

Tuttavia, quest'ultima affermazione tornerà undefined, dal momento che il parser vede:

return; 
{ 
    a: 1, 
    b: 2 
} 
+0

Questo è veramente buono. – meandmycode

+1

Ma è un'incompatibilità? – reinierpost

+0

No, è più di un trucchetto. Non ci sono più incompatibilità in JS. Il DOM è il colpevole. – Magnar

2

un altro (non credo che questo si presenta molto spesso):

(typeof document.getElementById) 

in IE: "oggetto"

in Firefox: "funzione"

0

per l'oggetto Date:

alert((new Date()).getYear(); 

Firefox torna 109

Internet Explorer restituisce il 2009

0
alert(document instanceof Document) 

in Firefox: vero!

in Internet Explorer: eccezione: Documento è definito

0

Un'estensione punto di altCognito .. Elemento non è un tipo di base definito o ...

//uses jQuery 
function getSomething(input) { 
    if (typeof(input) == string) 
     input = $(input)[0] || $('#'+input)[0] || null; 

    if (input instanceof Element) 
     input = $(input); 

    if (input instanceOf jQuery) { 
     ...do something... 
    } 
} 

ho dovuto sostituire l'instanceof Element con ..

if (input && input.tagName)... 

Sarebbe bello se elementi DOM sono stati correttamente BASE classificati in IE tutto intorno.