2009-10-13 4 views
0

J'utilise JavaScript Library du prototype v.1.6.0.3 J'ai découvert que la notation de base $ fonctionne bien dans Mozilla, mais pas dans IE6.Prototype Javascript, travailler dans Mozilla mais pas dans IE

est ici simple exemple

  • Element.hide('div123'); -> travailler à IE & Mozilla
  • $('div123').hide(); -> ne travaillant que chez Mozilla

Je me demande ce que je suis absent ici, comme j'ai aussi d'autres cas qui ne fonctionnent pas dans IE comme drag & drop (il ne sera jamais abandonné dans IE, mais bien dans Mozilla). Bien que d'après ma compréhension Prototype est "support" IE?

+2

Un test simple semble fonctionner dans IE6: http://jsbin.com/usaca Utilisez-vous d'autres bibliothèques JavaScript (par exemple jQuery)? – brianpeiris

+0

Merci beaucoup brianpeieris Vous avez raison, toutes les choses étranges dans IE6 causées par une autre bibliothèque mootools.js Vous m'aidez vraiment !! – beng

Répondre

1

Je ne pense pas que l'erreur est dans le code affiché; les deux versions fonctionnent pour moi et aucun de ces appels ne fait quoi que ce soit de différent sur les différents navigateurs.

Cependant Prototype fonctionne très différemment dans IE et Mozilla, ce qui peut provoquer des différences ailleurs dans votre code. Dans Mozilla, Prototypre ajoute ses méthodes aux prototypes de HTMLElement et al, afin que tous les objets DOM puissent avoir ces méthodes directement appelées. Cependant, ceci n'est pas possible dans IE (*), donc pour couvrir tous les navigateurs, vous devez 'augmenter' chaque noeud sur lequel vous voulez appeler les méthodes, soit explicitement en appelant Element.extend, soit implicitement en utilisant une des méthodes propres à Prototype, telles que comme la fonction $, pour obtenir une poignée sur l'objet:

document.getElementByID('foo').hide(); // ok on Mozilla, fail on IE 

$('foo').hide(); // ok everywhere 

Element.hide('foo'); // ok everywhere 

Element.extend(document.getElementByID('foo')); 
document.getElementByID('foo').hide(); // ok everywhere 

C'est en fait l'une des pires caractéristiques de prototype, parce que vous pouvez écrire une charge de code Mozilla qui échouera dans IE et ne pas remarquer: ce n'est pas tellement cacher les différences du navigateur comme les amplifier.

Ce qui est pire, puisque la plupart des propres méthodes de prototype étendent des objets implicitement, et parce que, une fois étendu ces nœuds conservent leurs extensions, il est très facile d'obtenir des situations où IE votre code qui oublie d'étendre un élément sera habituellement travail parce que quelque chose d'autre l'a déjà étendu, mais dans certaines circonstances plus rares vont exploser. Ce n'est pas bon pour le débogage. (*: Pas la faute d'IE Dans la norme ECMAScript, on ne s'attend pas à ce que vous puissiez modifier les prototypes des 'objets hôtes' comme le DOM, même si vous pouvez avoir un aperçu de leur fonction de constructeur, Prototype profite d'une fonctionnalité non-standard pour rendre le code potentiellement plus beau, mais malheureusement, malheureusement, vous ne pouvez pas en profiter en pratique.)

Questions connexes