2009-09-08 5 views
4

Je suis en train de tester ma page Web sur un serveur à l'aide de dns de prévisualisation. Je viens de réaliser que preview dns ajoute automatiquement la bibliothèque mootools vers la fin de toute page php. Probablement pour leurs propres statistiques ou quelque chose.comment utiliser la propriété jquery.noConflict

Mais le problème est que j'utilise jquery dans ma page. Donc, mon code jquery se brise parce que mootools et jquery utilisent tous deux '$'.

J'ai mis toute la page source de ma page sur jsbin: http://jsbin.com/ozime (ceci inclut l'ajout sur mootools).

Dans cette page, j'ai ajouté un exemple de code jquery qui devrait se déclencher lors du changement de la liste déroulante. J'ai ajouté quelques déclarations d'alerte. Cependant, seule la première déclaration d'alerte apparaît. Un code jquery interne ne le fait pas.

J'ai essayé d'utiliser jquery sans conflit mais cela ne semble pas fonctionner.

Est-ce que quelqu'un a été confronté à ce problème?

Répondre

12

Après avoir inclus jQuery, ajoutez ce qui suit immédiatement dans une balise de script.

<script> 
jQuery.noConflict(); 

jQuery(document).ready(function() { 
alert('hi'); 
}); 
</script> 

Placez également votre script jQuery avant votre bibliothèque mootools. Ordre sera:

scripts jQuery comprennent

code noConflict

script Mootools comprennent

-2

au lieu de j (function() ...

essayer

j(document).ready 
(
    function() 
    { 
    alert("here"); 
    j("select#rooms") 
    .change 
    (
     function() 
     { 
     alert("here1"); 
     } 
    ) 
    } 
); 

Vous essayiez d'envelopper une fonction au lieu d'un élément, qui est wh à peut être à l'origine du comportement inattendu.

+1

'$ (function() {...})' est un raccourci pour '$ (document) .ready (function() {...})', il suffit de cocher [source jQuery] (https: // github.com/jquery/jquery/blob/master/src/core.js#L177-189). – nyuszika7h

0

Insérer le texte suivant avant que le code jquery:

$j = jQuery.noConflict(true); 

Maintenant, vous pouvez utiliser j $ au lieu de $ pour toute substance jquery que vous voulez faire. i.e. .:

$j("body") 
+1

À moins que l'on veuille utiliser plus de versions de jQuery dans une page, vous ne devriez pas libérer la variable 'jQuery', car de nombreux plugins en dépendent. – nyuszika7h

22

Je préfère utiliser une auto exécution fonction anonyme pour donner votre code jQuery son propre champ où vous pouvez utiliser $ comme vous le feriez normalement si vous ne l'avez pas à vous soucier de la compatibilité.

Cela va avoir l'air bizarre si vous ne l'avez pas vu auparavant. Fondamentalement, ce que j'ai fait était de définir une fonction qui prend un paramètre (le $) et ensuite exécuter cette fonction avec jQuery comme paramètre.

<script> 
jQuery.noConflict(); 

(function($) { 
    //use '$' as you normally would 
    $(document).ready(function() { 
     //code here that depends on the document being fully loaded 
    }); 

})(jQuery); 

</script> 
+0

Ceci est assez profond javascript foo et vous voudrez peut-être rester à l'écart si vous ne pouvez pas comprendre pourquoi cela fonctionne de cette façon. Je recommande de le comprendre cependant :-) – Akrikos

+0

Est-ce mieux que de faire var $ = jQuery.pas de conflit(); et ainsi vous pouvez l'assigner à une copie locale de $ et utiliser $ comme vous le feriez toujours? – emschorsch

+0

De ce que je vois ici: http://api.jquery.com/jQuery.noConflict/ $ = jQuery.noConflict(); n'est pas une bonne chose à faire. Il semble que cela annulerait tout ce que noConflict fait. Si vous le faites à l'intérieur d'une fermeture, cela fonctionnera, mais ce serait plus déroutant que cette méthode. Si vous allez faire quelque chose de similaire à ce que vous proposez, il vaut mieux exécuter noConflict dans l'espace global et ensuite $ = jQuery; à l'intérieur de votre fermeture. Cependant, vous devez faire très attention de ne pas faire cette affectation dans la portée globale. – Akrikos

Questions connexes