2009-07-21 10 views
10

Utilizo jquery para un módulo. Mi plantilla joomla tiene un menú jquery integrado. Entonces entran en conflicto entre ellos.Conflicto JQuery con otra biblioteca JQuery

Hay una manera de resolver este problema. Siguiendo el código de script del módulo

<script type="text/javascript" charset="utf-8"> 
    window.onload = function() { 
     var container = jQuery('div.sliderGallery'); 
     var ul = jQuery('ul', container); 

     var itemsWidth = ul.innerWidth() - container.outerWidth(); 

     jQuery('.slider', container).slider({ 
      min: 0, 
      max: itemsWidth, 
      handle: '.handle', 
      stop: function (event, ui) { 
       ul.animate({'left' : ui.value * -1},340); 
      }, 
      slide: function (event, ui) { 
       ul.css('left', ui.value * -1); 
      } 
     }); 
    }; 
</script> 

Respuesta

2

tratar

var J = jQuery.noConflict(); 

después de esa variable utilización J en lugar de $ o jQuery para su código personalizado

+0

Esta respuesta no es suficiente. debe especificar qué biblioteca desea volver a mapear para usar "J". escribir esto en el lugar equivocado puede dar lugar a diferentes resultados. – vsync

+0

no tengo idea de por qué te refieres. explique. – mkoryak

+0

¿De dónde viene el "jQuery"? ¿Cómo cargo (una versión específica de) jQuery sin contaminar espacios de nombres? –

1

tratar

jQuery.noConflict(); 

por ejemplo

<script type="text/javascript" charset="utf-8"> 
    $(document).ready(function() { 
     var container = jQuery('div.sliderGallery'); 
     var ul = jQuery('ul', container); 

     var itemsWidth = ul.innerWidth() - container.outerWidth(); 
     jQuery.noConflict(); 
     jQuery('.slider', container).slider({ 
      min: 0, 
      max: itemsWidth, 
      handle: '.handle', 
      stop: function (event, ui) { 
       ul.animate({'left' : ui.value * -1},340); 
      }, 
      slide: function (event, ui) { 
       ul.css('left', ui.value * -1); 
      } 
     }); 
    }); 
</script> 

He actualizado su código para usar jQuery para verificar la carga del documento. Los detalles para usar la función noConflict son here.

+0

Copio tu código y lo pego en mi archivo pero no cambia nada. ¿Tengo que hacer algo más? –

4

Lo que necesita hacer para solucionar su problema es quitar la función jQuery y asignarla a otro nombre de variable (recuerde: las variables pueden ser funciones). Necesita usar la función jQuery.noConflict() para desasociar la función $(). Aquí uno que lo haga:

// ...after all of Joomla's JS is done executing... 

// before loading your version of jQuery var jquery = {}; // aka new Object() 
jquery.joomla = jQuery.noConflict(); // moves jQuery into another namespace 

// load your version 

Ahora, cuando se carga la versión, que se hará cargo de la jQuery y $ espacios de nombres, pero todavía tendrá la otra referencia a la función jQuery de Joomla, si lo necesita. Para reiterar, el flujo básico es:

  1. carga jQuery de Joomla código
  2. de que Joomla jQuery dependiente
  3. Mover Joomla jQuery en otro espacio de nombres
  4. Carga tu jQuery
  5. Ejecutar el código utilizando $()
+2

"Mueva Joomla jQuery a otro espacio de nombres": no es una buena idea, ya que podría ejecutarse en algún otro lugar más adelante y buscar el antiguo espacio de nombre; en su lugar, debe cambiar el nombre de su nueva jQuery a j $. – vsync

0

¿quisiste decir que tu joomla cargó 2 tipos de jquery al mismo tiempo? Primero su menú carga jquery y luego su módulo carga jquery?

Aquí está la solución: En joomla plantillas, podemos anular los puntos de vista de módulos o componentes

  1. en sus plantillas creará un directorio llamado (supongo que debe utilizar Joomla 1.5.x ¿verdad?) html/ por ejemplo: plantillas/archivo de copia yourtemplate/html/

  2. de módulos tmpl /.* en su plantilla html (templates/yourtemplate/html/mod_yourMenu /)/mod_yourMenu/- no> * que haces necesita agregar tmpl/*

  3. editar los archivos php en el interior y eliminar todos los etiqueta que cargar jQuery

  4. hacer el paso 1-3 para los módulos que utilizan jQuery.

  5. edite su plantilla, ponga la etiqueta para cargar la última versión de jquery.

que debería funcionar ahora :)

+0

hm - podría funcionar, pero ¿qué ocurre si desea utilizar este módulo en muchos sitios? Tengo que hacer estos pasos todo el tiempo. ¿Conoces otra solución? –

0

Sólo para envolver su guión JQ en una función de auto-invocando.

(function($){ 
    $(document).ready(function(){ 

     $('div').click(function(){ alert('ding'); }); 

    }); 
})(jQuery); 

Esto crea un ámbito privado para que no tenga que preocuparse por las colisiones. Puede omitir toda la incomodidad con jQuery.noConflict(); solución y no tienes que renunciar a ese maravilloso $! Lo hago por hábito cuando sé que hay otros fragmentos de código en funcionamiento (por ejemplo, cualquier cms); incluso si se agrega una nueva extensión después de mi prueba, no debería romper mi jQuery.

Hay una gran descripción en el jQuery Cookbook (http://listic.ru/jQuery_Cookbook.pdf - capítulo 1.17). Si es lo suficientemente bueno para Resig, ¡supongo que funcionará para mí!

Cuestiones relacionadas