2009-02-09 33 views
66

Mi empresa ha comprado un producto que representa un control ASP.NET en la página. Este control usa jQuery 1.2.3 y agrega una etiqueta de script a la página para referenciarlo. Los desarrolladores del control no admitirán el uso del control si se modificó de alguna forma (incluida la modificación para hacer referencia a una versión diferente de jQuery).¿Cómo ejecuto diferentes versiones de jQuery en la misma página?

Estoy a punto de comenzar el desarrollo de mi propio control y me gustaría utilizar las funciones y las mejoras de velocidad de jQuery 1.3. Ambos controles deberán existir en la misma página.

¿Cómo puedo permitir que el control adquirido use jQuery 1.2.3 y nuevo desarrollo personalizado para usar jQuery 1.3? También por curiosidad, ¿qué pasaría si usáramos un control adicional que necesitara hacer referencia a otra versión de jQuery?

+1

¿El autor del autor del control no lanzar actualizaciones? ¿O es la versión más nueva incompatible? Es muy extraño que un proveedor comercial de control de terceros haya creado un control que está codificado de forma rígida para una versión particular de un código abierto javascript que se actualiza con frecuencia. – BlackMael

+0

No veo cómo no se atornilla si usa controles de servidor múltiples que insisten en versiones fijas de jQuery. – BlackMael

+1

No todos los autores de complementos actualizan meticulosamente/pueden actualizar su código de forma regular. Yo también enfrenté este problema, pero luego cambié a un equivalente impulsado por la comunidad y actualizado con frecuencia. –

Respuesta

99

Puede lograr esto ejecutando su versión de jQuery en no-conflict mode. El modo "Sin conflicto" es la solución típica para que jQuery trabaje en una página con otros marcos como prototype, y también se puede usar aquí, ya que esencialmente espacia el nombre de cada versión de jQuery que cargue.

<script src="jQuery1.3.js"></script> 
<script> 
    jq13 = jQuery.noConflict(true); 
</script> 

<!-- original author's jquery version --> 
<script src="jQuery1.2.3.js"></script> 

Este cambio significa que ninguna de las cosas jQuery que desea utilizar tendrá que ser llamada usando jq13 en lugar de $, por ejemplo,

jq13("#id").hide(); 

No es una situación ideal para tener las dos versiones que se ejecutan en la misma página, pero si usted no tiene ninguna alternativa, el método anterior debería permitir el uso de dos versiones diferentes a la vez.

También por curiosidad, ¿qué pasaría si usáramos un control adicional que necesitara hacer referencia a otra versión de jQuery?

Si necesita añadir otra versión de jQuery, que podría ampliar en lo anterior:

<script src="jQuery1.3.js"></script> 
<script> 
    jq13 = jQuery.noConflict(true); 
</script> 
<script src="jQuery1.3.1.js"></script> 
<script> 
    jq131 = jQuery.noConflict(true); 
</script> 

<!-- original author's jquery version --> 
<script src="jQuery1.2.3.js"></script> 

Las variables jq13 y jq131 cada uno serían utilizados para las características específicas de la versión que se requieren.

Es importante que el jQuery utilizado por el desarrollador original se carga última - el desarrollador original probablemente escribió su código bajo el supuesto de que $() estaría utilizando su versión de jQuery. Si carga otra versión después de la suya, el $ será "capturado" por la última versión que cargue, lo que significaría que el código del desarrollador original se ejecuta en la última versión de la biblioteca, lo que hace que el noConflicts sea algo redundante.

+11

¿El orden es realmente importante? ¿No es el objetivo de la función noConflict devolver la variable "$" al propietario original? Ordenar no debería ser importante. Lo que es importante, sin embargo, es que jQuery.noConflict se llame ** inmediatamente ** después de que se cargue la versión de jQuery que debería entrar en modo no conflictivo. – mtyaka

+4

mtyaka es exactamente correcto. Si pasa el parámetro 'verdadero', no necesita preocuparse por el orden en que carga los guiones. Pasar de 'verdadero' a no conflicto restaura la variable 'jQuery' y la variable '$' a lo que eran. Sin él, solo se restaura '$'. – Muhd

2

Parece que el orden no importa ... por ejemplo: http://gist.github.com/136686. La salida de la consola está en la parte superior y todas las versiones parecen estar en los lugares correctos.

24

Como dijo ConroyP puedes hacer esto con jQuery.noConflict pero no olvides var al declarar variables. Me gusta esto.

<script src="jQuery1.3.js"></script> 
<script> 
    var jq13 = jQuery.noConflict(true); 
</script> 

<!-- original author's jquery version --> 
<script src="jQuery1.2.3.js"></script> 

Puede conectar todos $ 's de jq13 añadiendo (jq13) después de la función de }).como esto

(function($) { 
... 
})(jq13); 
+5

No tener var no es un gran problema aquí. Las variables definidas sin var tienen alcance global. Usted ** quiere ** que el objeto jq13 tenga alcance global. –

+3

Globals implícitos es una mala práctica de codificación. Si está seguro de que desea una variable global, debe declararla en el ámbito global con una palabra clave var, o bien, adjuntar la variable al objeto ventana manualmente si está dentro de una función. Ver http://javascript.crockford.com/code.html#variable%20declarations – Muhd

0

En la segunda versión declarar una variable como $ .noConflict (verdadero). Y use la variable declarada en lugar de $ used en el código jquery. Por favor, compruebe el código de abajo: Este código se utiliza después de la declaración de segundas versiones de jQuery:

<script type="text/javascript"> 
var jQuery_1_9_1 = $.noConflict(true); function pageLoad(sender, args) { 

     var $ddl = jQuery_1_9_1("select[name$=drpClassCode]"); 
     var $ddl1 = jQuery_1_9_1("select[name$=drpSubContractors]"); 
     $ddl.select2(); 
     $ddl1.select2(); 

     $ddl.bind("change keyup", function() { 
      $ddl.fadeIn("slow"); 


     }); 

     $ddl.bind("change keyup", function() { 
      $ddl1.fadeIn("slow"); 


     }); 
    } 
1

hacen que falsa para trabajar

var jq16 = $.noConflict(false); 
Cuestiones relacionadas