0

Je développe un contrôle serveur ASP.NET qui utilise jQuery pour une logique côté client. J'ai incorporé le fichier jQuery en tant que ressource dans le contrôle.Résolution de conflit de version jQuery avec le contrôle serveur ASP.NET

Je ne veux pas restreindre l'application en utilisant le contrôle à cette version spécifique de jQuery et je veux continuer à utiliser la version de jQuery que j'ai intégrée.

Je connais la méthode noconflict mais le problème que je vois est que je n'ai aucun contrôle sur l'ordre des tags de script sur la page.

Si la version de jQuery de l'utilisateur est incluse avant la mienne, je finirai par l'ignorer avant de pouvoir appeler noconflict.

S'il vous plaît aider

Répondre

5

Vous pouvez le faire avec noConflict(true):

var myJQuery = jQuery.noConflict(true); 

Le paramètre true indique jQuery pour libérer le symbole jQuery en plus du symbole $. Ajoutez simplement ceci à la fin du fichier jQuery.js que vous incorporez dans le contrôle.

Le script jQuery est intelligent à propos des conflits. La première chose qu'il fait est de saisir quelle que soit la valeur actuelle des deux $ et jQuery et de les écureuils afin qu'il puisse les restaurer plus tard si vous le demandez. Donc, si votre script est chargé en premier, ni $ ni jQuery ne seront définis et le nouveau peut les avoir. Si votre script est chargé en second lieu, restaure$ et jQuery.

Exemple:

Supposons que vous utilisez la dernière (v1.5.1), mais l'auteur de la page utilise les plus 1.4.4. En effet, en virant de bord var jq151 = jQuery.noConflict(true); à la fin du fichier 1.5.1, vous faites ceci:

<script src='jquery-1.5.1.min.js'></script> 
<script>var jq151 = jQuery.noConflict(true);</script> 

... sauf qu'il serait tous dans une balise de script. Ainsi, deux possibilités:

1) Ils vont d'abord:

<script src='jquery-1.4.4.min.js'></script> 
<script src='jquery-1.5.1.min.js'></script> 
<script>var jq151 = jQuery.noConflict(true);</script> 

Live example

2) Vous allez d'abord:

<script src='jquery-1.5.1.min.js'></script> 
<script>var jq151 = jQuery.noConflict(true);</script> 
<script src='jquery-1.4.4.min.js'></script> 

Live example

De toute façon, à la fois jQuery et $ finissent pointi ng à leur version 1.4.4, et jq151 finit pointant vers votre version 1.5.1.Peut-être légèrement hors-sujet, mais pour tous ceux qui pensent que c'est un peu magique, c'est vraiment très facile. :-) Voici un script qui va redéfinir foo, mais rétablir la définition précédente si vous demandez à:

// The script 
(function() { 
    var globalObject = this, // Or just use `window` on browsers 
     oldfoo, 
     ourfoo; 

    oldfoo = globalObject.foo; 
    ourfoo = globalObject.foo = { 
     version: "new", 
     restorePrevious: restorePrevious 
    }; 

    function restorePrevious() { 
     globalObject.foo = oldfoo; 
     return ourfoo; 
    } 
})(); 

Example with foo defined before the above

Example with foo defined after the above (si vous vous demandez pourquoi cela fonctionne malgré var foo être après le script, here's some reading le lire sur le pauvre, mal compris var)


A propos des plug-ins: Vous avez demandé ci-dessous à propos des plug-ins. Plug-ins s'enregistrent en attribuant leurs fonctions aux propriétés sur jQuery.fn et (dans certains cas) jQuery, comme ceci:

jQuery.fn.makeFoo = function() { 
}; 

Avec ce qui précède, vous pouvez accéder à une fonction makeFoo sur les instances jQuery (par exemple, $('foo').makeFoo();). Un bien écrit plug-in veillera à ce qu'elle joue bien avec les deux noConflict() et noConflict(true) en utilisant cette structure:

(function($) { 
    $.fn.makeFoo = function() { 
     $(this).addClass("foo"); 
    }; 
})(jQuery); 

... ou d'un tel. (Avec ce qui précède, nous avions jamais utiliser jQuery pour se référer à jQuery dans le corps de la fonction. Si nous voulions, nous pourrions ajouter var jQuery = $; en haut.)

qui définit une fonction anonyme et appelle immédiatement, en passant la valeur globale actuelle pour jQuery. Il reçoit cela comme argument, et donc dans la fonction le symbole $ sera toujours être l'instance jQuery qu'il a passé en lui-même. Il peut utiliser librement $ sachant qu'il fait référence à la version de jQuery sur laquelle il est enregistré. Un seul plug-in assez bien écrit peut supposer que jQuery sera toujours le même (par exemple, ne joue qu'avec juxtaposer noConflict() et pas avec noConflict(true)). Vous pouvez les réparer, cependant. Si vous rencontrez un, faire une copie de celui-ci et de mettre

(function($) { 
    var jQuery = $; 

... en haut et

})(jQuery); 

... au fond. 99% du temps, ça va le faire se comporter. Si vous souhaitez utiliser des plug-ins avec votre instance jQuery intégrée, il est préférable de les inclure dans votre fichier personnalisé.Ainsi, le contenu du fichier deviennent:

  • Le script jQuery
  • (script plug-in)
  • (script plug-in)
  • ...
  • Votre var jq151 = jQuery.noConflict(true);
+0

Je ne pense pas qu'il restaure ce qui peut avoir été la valeur de "$" avant, comme l'OP semble souhaiter – mattsven

+0

@ motionman95: C'est * exactement * ce qu'il fait, voir les documents liés pour plus de détails. –

+0

@Crowder Ah je vois. – mattsven

0

Voici une bonne solution: Ne pas utiliser jQuery. Au moins pas au début. Utilisez javascript pour attendre que tous les scripts soient chargés, stockez la valeur de "$", puis injectez jQuery dans via la balise de script et restaurez la valeur précédente de "$".

+0

Il est pas seulement '$', c'est aussi 'jQuery'. Heureusement, jQuery fait ce que vous suggérez (stocke l'ancienne valeur avant d'attribuer la nouvelle valeur). –

Questions connexes