12
votes

Pourquoi JavaScript est-il incompatible entre les navigateurs?

Voici quelque chose que je me réfléchis après d'innombrables heures de fixation de JS à être croisée croisée compatible (principalement c'est-à-dire): pourquoi n'est pas javascript cohérents cohérents de navigateur? < / p>

Je veux dire, pourquoi JS ne peut-il pas être gentil comme Java et Flash? Au lieu de cela, nous devons recourir à des cadres comme JQuery. Ne me méfiez pas, ils me font mal la vie - mais pourquoi existent-ils même en premier lieu?

Y a-t-il une raison historique à cela? Les entreprises déploient-elles des navigateurs qui expédient-elles simplement leur propre moteur JS? Quelles sont les politiques qui rendent la normalisation si difficile?

(Remarque: Je comprends qu'une bonne partie du problème est liée à DOM, mais la question reste).


1 commentaires

Étant donné que la plupart des raisons pour lesquelles vous codirez quelque chose dans JavaScript sera associé à dom. Il est correct de confondre les deux IMHO


4 Réponses :


7
votes

Les sociétés déploient-elles des navigateurs simplement expédier leur propre moteur JS?

Yup, c'est probablement la raison principale. Il n'y a pas de moteur JS unifié; Il existe différentes implémentations de ECMAScript .


2 commentaires

Tout comme les navigateurs avec le rendu, il existe différentes manières d'interpréter les spécifications, différentes façons de les mettre en œuvre, et même pire: différentes façons de combler les spécifications de lacunes!


Vous pouvez laisser en toute sécurité «probablement». ;)



17
votes

Le langage de base JavaScript pour la plupart est cohérent (faisant référence à la version 3 de la version 3 de ECMAScript publiée en 1999.)

Ce sont les implémentations DOM qui causent des maux de tête. Parce que, à un moment donné, aucune spécification DOM n'avait que les navigateurs pouvaient faire ce que l'enfer souhaitée en termes de constitution des règles pour accéder et manipuler des éléments HTML dans une page Web.

Par exemple:

  • fenêtre.addeventlistener pour les navigateurs prenant en charge DOM, tandis que fenêtre.attachevente pour IE.
  • textContent pour les navigateurs prenant en charge DOM, innertext pour IE.
  • Fuite de mémoire pour les manipulateurs d'événements ci-joins dans IE, vous devez donc les décharger manuellement
  • getElementyid est buggy dans IE et Opera car il renvoie des éléments par nom
  • getattribute ('href') renvoie des valeurs incessionnelles

    Il existe également des problèmes liés au support CSS du navigateur.

    • IE6 ne prend pas en charge les PNG natives afin que vous soyez obligé d'utiliser la bibliothèque de filtres
    • Animation de buggy dans IE Traitement de l'opacité du filtre

      Les incohérences de base de la langue seraient des choses comme

      • incohérences entre les moteurs de regex

        mais oui, en bref, le point est-il qu'avant, il n'y avait pas de norme. Depuis lors, le W3 a proposé des normes, mais chaque fournisseur de navigateur a sa propre façon de faire face à la mise en œuvre. Il n'y a pas d'organe directeur qui oblige les fournisseurs à appliquer pleinement les spécifications.


9 commentaires

+1 c'est vrai et important à noter. Le noyau de langue est fiable. Le DOM est où des cadres tels que JQuery entrent (et font beaucoup de bien.)


"La langue principale pour la plupart est cohérente." Pas entièrement: par exemple, array.pototype.sort n'est pas cohérent dans la stabilité, la disponibilité de fonctions telles que array.pototype.indexof et fonction.pototype.bind varie considérablement, itérant sur toutes les propriétés d'un objet utilisant pour (... in ...) n'est pas (ou non, je ne suis pas sûr) cohérent, vous aurez besoin < Code> HasownProperty .


array.pototype.indexof ne fait pas partie de ECMAScript V3. Mozilla vient de le jeter dans Gecko en 2004/2005. IE6 a été développé en 99-00 et publié en 01. Alors, comment auraient-ils pu la mettre en œuvre si ce n'était pas dans la langue?


pour..in est cohérent. Le HasownProperty est cohérent. Si vous étendez objet.pototype Ça apparaîtra sans utiliser hasowroproperty mais le comportement doit être cohérent à travers la carte.


fonction.pototype.bind n'est pas défini dans Firefox ou Chrome, ni défini dans IE. Je pense que vous confondez des fonctions définies par l'utilisateur qui sont naturellement incompatibles et pensant qu'ils sont intégrées?


Pouvez-vous me donner un exemple de trier incohérences entre les navigateurs?


Vous pouvez vous référer à la version 5 de la version 5 de ECMAScript avec fonction.Prototype.bind , mais comment cela serait-il logique de se plaindre d'une version linguistique publiée en décembre 2009 lorsque nous parlons de navigateurs qui ont été sortis depuis des années? Opera, c'est-à-dire Chrome V8, Gecko / Spidermonkey / Rhino, .Net, Acrobat, ICAB, KDE, SAMBA 4, KHTML Tous sont ECMA-262, édition 3. (et plus ..) Donc, il serait donc logique d'utiliser ECMA- 262 Edition 3 comme étant la norme pour le "noyau". Pas une version publiée l'année dernière.


GetatTtribute est buggé sous une autre situation dans une version d'IE. Si vous avez un formulaire avec un élément nommé "action" dedans et que vous faites forme.getattribute ("action"), il retournera l'élément sous la forme non l'action d'attribut du formulaire dans IE 6. Je ne me souviens pas Si le même comportement se produit aussi sur une autre version, mais cela pourrait être là dans IE 7 également.


Ok, tu as raison, je mêle plusieurs choses. Sort n'est pas stable dans (au moins) Chrome, ou au moins, il était en septembre 2009. Voir Stackoverflow.com/questions/1427608/... .



2
votes

Les navigateurs roulent leur propre implémentation, simples et simples. C'est la même raison pour laquelle le rendu et le CSS et tout ce qui sont différents entre les navigateurs. Java / flash / etc. sont plus universels car ils sont abstraits hors du navigateur et accessibles via un plugin de quelque sorte. Mais leurs implémentations de base réelles sont séparées du navigateur et contrôlées par un seul fournisseur.


0 commentaires

2
votes

Ajouter aux autres réponses: il est une raison historique à cela. Je peux écrire cela moi-même, mais citant Wikipedia est plus facile sur les doigts:

JavaScript a été développé à l'origine par Brendan Eich de Netscape sous le Nom Mocha, qui a ensuite été renommé à Livrescript, et enfin à JavaScript. Livrescript était le nom officiel de la langue quand elle expédiée pour la première fois Communiqués bêta de Netscape Navigator 2.0 en septembre 1995, mais il a été renommé JavaScript dans un joint Annonce avec Sun Microsystems sur 4 décembre 1995 quand il a été déployé Dans le navigateur Netscape version 2.0b3.

[...]

JavaScript très rapidement gagné Succès généralisé en tant que client Langue de script pour les pages Web. Comme un conséquence, Microsoft a développé un dialecte compatible de la langue, nommer cela jscript pour éviter la marque de commerce problèmes. JScript a ajouté de nouvelles méthodes de date Pour réparer les méthodes non liées au Y2K dans JavaScript, qui étaient basés sur java.util.date. Jscript a été inclus Dans Internet Explorer 3.0, publié dans Août 1996. Les dialectes sont perçu comme si semblable que le termes "javascript" et "jscript" sont souvent utilisé de manière interchangeable. Microsoft, Cependant, note des dizaines de façons dans lesquelles Jscript n'est pas conforme à l'ECMA.

En novembre 1996, Netscape a annoncé qu'il avait soumis JavaScript à ECMA International pour examen comme une norme de l'industrie, et Les travaux ultérieurs ont abouti à la Version normalisée nommée ECMAScript.

Comme vous pouvez le constater, la norme, ECMAScript, a été développée plus tard que la langue d'origine. Il s'agit simplement d'adapter cette norme dans les implémentations actuelles des navigateurs Web, qui se passe toujours, de même que le développement de ECMAScript elle-même (par exemple, voir la spécification de ECMAScript 5 , Publié décembre 2009).


0 commentaires