web-dev-qa-db-fra.com

JQUERY & prototype de conflit

J'utilise le plugin JQuery Autocomplecte dans une page HTML où je dispose également d'un menu accordéon utilisant le prototype.

Ils travaillent tous deux parfaitement séparément, mais lorsque j'ai essayé de mettre en œuvre les deux composants dans une seule page, je n'ai pas été en mesure de comprendre.

exception non capturée: [exception ... "Code de défaillance de la composante: 0x80004005 (nsidomviewcss.getcomputedstyle]" Nsresult: "0x80004005 (ns_error_failure)" Emplacement: "JS Cadre :: Fichier: /// C:/Documents et paramètres /Administrattrat/desktop/website/js/jquery-1.2.6.pack.js :: Anonyme :: Line 11 "Données: Non]

J'ai découvert que le fichier conflictuel avec JQuery est 'Effects.js' qui est utilisé par le menu Accordéon. J'ai essayé de remplacer ce fichier avec une version plus récente mais plus récente semble casser le comportement de l'accordéon.

Je suppose que le fichier "effets.js" utilisé dans l'accordéon a été modifié pour obtenir la sortie de la démonstration accordéon. J'ai également essayé d'utiliser les méthodes primordiales JQuery doit éviter les conflits avec d'autres bibliothèques et cela n'a pas fonctionné.

J'ai obtenu la démo accordéon de stickmanlabs.com .

Et la jQuery autocomplete peut être obtenue à partir de Site JQuery .

Est-ce que quelqu'un d'autre a rencontré ce problème?

27
DPereyra

Il y a deux solutions possibles: il y a eu un conflit avec une version plus ancienne de scriptacululants et de jQuery (scriptacon tentative d'étendre le prototype de réseau natif de manière incorrecte) - essayez d'abord de mettre à niveau votre copie de scriptaculeux.

Si cela ne fonctionne pas, vous devrez utiliser noConflict() (comme mentionné ci-dessus). Cependant, il y a une prise. Étant donné que vous incluez un plugin, vous devez faire la compensation dans un ordre spécifique, par exemple:

<script src="jquery.js"></script>
<script src="jquery.autocomplete.js"></script>
<script>
  jQuery.noConflict();
  jQuery(document).ready(function($){
    $("#example").autocomplete(options);
  });
</script>
<script src="prototype.js"></script>
<script src="effects.js"></script>
<script src="accordion.js"></script>

J'espère que cela aidera à clarifier la situation.

117
John Resig

jQuery vous permet de renommer la fonction JQuery de $ à quelque chose d'autre pour éviter les conflits d'espace de nom avec d'autres bibliothèques.

Vous pouvez faire quelque chose comme ça

var J = jQuery.noConflict();

Détails ici: Michaelshadle.com - Mode No-Conflict de JQuery: Encore une autre raison pour laquelle c'est le meilleur

10
Tahir Akhtar

Je ne vois pas vraiment la raison d'utiliser les deux bibliothèques en même temps dans ce cas.

Vous pouvez soit utiliser des prototypes (Eh bien, scriptaculeux 'en fait) Ajax.Autocompleter et JQUERY JQUERY, ou vous pouvez utiliser JQuery's - accordéon et supprimer du prototype.

L'utilisation des deux bibliothèques à la fois n'est pas vraiment une bonne idée, car:

  1. Ils peuvent causer des conflits.
  2. En incluant les deux, vous forcez vos utilisateurs à les télécharger les deux. Ce qui n'est pas une bande conviviale.
8
Fczbkk