2009-07-21 8 views
10

Uso jquery per un modulo. Il mio template joomla ha un menu jquery integrato. Quindi sono in conflitto tra loro.JQuery conflitto con un'altra libreria JQuery

C'è un modo per risolvere questo problema. In seguito il codice di script del modulo

<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> 

risposta

2

provare

var J = jQuery.noConflict(); 

dopo quella variabile uso J invece di $ o jQuery per il codice personalizzato

+0

Questa risposta non è abbastanza buona. devi specificare quale libreria vuoi re-mappare per usare "J". scrivere questo nel posto sbagliato può portare a risultati diversi. – vsync

+0

Non ho idea del perché intendi. spiegare. – mkoryak

+0

Da cosa proviene la "jQuery"? Come carico (una versione specifica di) jQuery senza spazi dei nomi inquinanti? –

1

provare

jQuery.noConflict(); 

esempio

<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> 

Ho aggiornato il codice per utilizzare jQuery per verificare la presenza di documenti caricati. Dettagli per l'utilizzo della funzione noConflict è here.

+0

Copia il tuo codice e lo incollo nel mio file ma non cambia nulla. Devo fare qualcos'altro? –

4

Quello che devi fare per correggere il tuo problema è annullare l'alias della funzione jQuery e assegnarla a un altro nome di variabile (ricorda: le variabili possono essere funzioni). È necessario utilizzare la funzione jQuery.noConflict() per annullare l'alias della funzione $(). Qui si a farlo:

// ...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 

Ora, quando si carica la tua versione, si assumerà la jQuery e $ spazi dei nomi, ma ci si può comunque avere l'altro riferimento alla funzione di jQuery di Joomla se ne avete bisogno. Per ribadire, il flusso di base è:

  1. carico di Joomla jQuery codice
  2. di utilizzare Joomla jQuery-dipendente
  3. Spostare Joomla jQuery in un altro spazio dei nomi
  4. Caricare il jQuery
  5. eseguire il codice utilizzando $()
+2

"Sposta Joomla jQuery in un altro spazio dei nomi" - non è una buona idea, perché potrebbe essere eseguito in un secondo momento e cercare il vecchio namepace, invece, si dovrebbe rinominare il nuovo jQuery in j $. – vsync

0

intendevi che il tuo joomla ha caricato 2 tipi di jQuery contemporaneamente? Prima il tuo menu carica jquery e quindi il tuo modulo carica jquery?

Ecco la soluzione: In Joomla Templates, possiamo ignorando il punto di vista del modulo o componente

  1. nei template Creare una directory denominata (presumo è necessario utilizzare Joomla 1.5.x giusto?) html/ esempio: templates/

  2. file di yourtemplate/html/copia da moduli/mod_yourMenu/tmpl /.* nel vostro template HTML (templates/yourtemplate/html/mod_yourMenu /) -> * non è è necessario aggiungere tmpl/*

  3. modificare i file php all'interno ed eliminare tutti i tag che caricare jQuery

  4. fare il passo 1-3 per i moduli che utilizzano jQuery.

  5. modifica il modello, inserisci tag per caricare l'ultima versione di jquery.

dovrebbe funzionare ora :)

+0

hm - potrebbe funzionare ma cosa succede se si desidera utilizzare questo modulo su molti siti. Devo fare questo passo ogni volta. Conosci un'altra soluzione? –

0

Solo per avvolgere lo script JQ in una funzione di auto-invocazione.

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

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

    }); 
})(jQuery); 

Questo crea un ambito privato in modo da non doversi preoccupare di eventuali collisioni. Puoi saltare tutta la disagio con jQuery.noConflict(); soluzione e non devi rinunciare a quel meraviglioso $! Lo faccio come una questione di habbit quando so che ci sono altri pezzi di codice al lavoro (ad esempio, qualsiasi cms) - anche se una nuova estensione viene aggiunta dopo il mio test, non dovrebbe rompere il mio jQuery.

C'è una grande panoramica nel jQuery Cookbook (http://listic.ru/jQuery_Cookbook.pdf - capitolo 1.17). Se è abbastanza buono per Resig, immagino che funzionerà per me!