2011-03-08 17 views
5

Vogliamo eseguire l'aggiornamento da una versione di jQuery a un'altra. Utilizziamo vari plug-in online e ne abbiamo scritti molti di nostri. La sfida ora si presenta sotto forma di cercare LENTAMENTE MIGRARE tutti gli oggetti scriptati LENTAMENTE senza una completa riscrittura. Ho un'idea su come gestire questo:C'è un modo elegante per aggiornare jQuery lentamente?

ma ho DOMANDE:

  1. è l'idea di sotto anche una buona idea?
  2. Posso dire (direttamente) a ciascun oggetto jQuery dove risiedono le dipendenze?
  3. Se questa è una cattiva idea ... come la gestisci?
  4. Devo semplicemente riscrivere OGNI oggetto che si verifica durante l'aggiornamento? (Sux!)

che illustrano il problema:
Se tutti i plug-in di vivere solo nell'ambito di una singola pagina, quindi diverse versioni sono facilmente affrontati: fare semplicemente il file-include la pagina livello invece del livello della pagina principale (duh!). Tuttavia, gli oggetti che vivono nella pagina principale o nei controlli utente sono un po 'più difficili ... poiché hanno bisogno di versioni specifiche per funzionare correttamente.

è qui la mia idea:
La definizione di un plug-in inizia con una funzione anonima.

Tutte le dipendenze che ho visto utilizzano questo come punto di partenza.

ESEMPI: dipendenze jQuery includono plug-in come: ui.widget, ui.position, ui.core, ecc

Che importa se mi riferisco ogni versione di jQuery (e le sue dipendenze) utilizzando un JavaScript opporsi e passare QUESTO OGGETTO nei vari plug-in interni e online?

RIFERIMENTI oggetto potrebbe andare in questo modo:

var jQueryVersion1_3_2 = function(){<!- paste the files contents here-->}; 
var jQueryVersion1_4_4 = function(){<!- paste the files contents here-->}; 

i plug-in:
mie in-house e plug-in on-line potrebbero ancora essere inclusi come (normale) file- link, ma con le seguenti modifiche

GO dA QUESTO:

// Plug-in X 
(function ($){<!- its untouched code -->})(jQuery); 
// Plug-in Y 
(function ($){<!- its untouched code -->})(jQuery); 
// Plug-in Z 
(function ($){<!- its untouched code -->})(jQuery); 

... versioning fa schifo qui!

A QUESTE ...

// Plug-in X 
(function ($){<!- its untouched code -->})(jQueryVersion1_3_2); 
// Plug-in Y 
(function ($){<!- its untouched code -->})(jQueryVersion1_3_2); 
// Plug-in Z 
(function ($){<!- its untouched code -->})(jQueryVersion1_4_4); 

... ora possiamo aggiornare i nostri oggetti lentamente.

L'unico problema che VEDERE:
La sfida diventa le dipendenze dei plug-in (tra le versioni).In un test di aggiornare il seguente ha cominciato a rompere attraverso vari plug-in, le cose come:

  • ui.widget, ui.position, ui.core, ecc (tutti hanno fatto irruzione sulla riqualificazione).

l'unica risposta che vedo è:
Wrapping jQuery e tutti i vari riferimenti in una singola funzione e risparmio energetico che nella variabile sopra. Quindi passare QUEST'oggetto intermedio in ogni plug-in AS jQuery.

Aiutami Obi-Wan Kenobi ... sei la mia unica speranza!

+3

Qual è il motivo? Pensi che alcuni dei tuoi plug-in smetteranno di funzionare dopo l'aggiornamento? (Solo curioso ... Nella mia esperienza, passare a una versione più recente di jQuery è sempre stato indolore) – Andrey

+2

Stai usando quelle funzioni deprecate? Puoi sempre controllare 'http: //docs.jquery.com/Release: jQuery_1.3.2' (cambiando 1.3.2 con la versione in questione) e guarda cosa potrebbe essere necessario modificare. altrimenti, caricare ogni libreria e 'var jQuery_1_3_2 = $ .noConflict()' potrebbe essere la soluzione migliore (anche se probabilmente un sacco di spese generali). –

+0

Ricorda, non vogliamo dover riscrivere tutti i plug-in. Vogliamo toccare solo alcuni alla volta. Abbiamo molti plug-in: alcuni sviluppati internamente e altri da fonti online. E sì ... gli oggetti falliscono una volta aggiornati per essere deprecati ecc. Ma questa non è la domanda. So già come indovinare e testare dolorosamente ... Sto cercando qualcosa di più elegante. –

risposta

1

Utilizzando $ .noConflict globalmente creare tutte le vostre versioni

<script src="jquery 1.x" /> 
<script> 
    var jQuery_1_x = $.noConflict(true); 
</script> 
... 

poi avvolgere tutti i plugin jQuery, interlocutore interno o 3 ° nel chiusure come:

(function(jQuery, $) { 

    ... // code 

}(jQuery_1_x, jQuery_1_x)); 

L'unica cosa che può rompere con questo metodo è codice di terze parti che utilizza var foo al di fuori di qualsiasi funzione per creare oggetti globali. È necessario cercare eventuali funzioni/oggetti/metodi globali e issare manualmente utilizzando

window.foo = ...

Per fortuna la creazione di funzioni/oggetti/metodi globali è considerato cattiva forma da quel metodo in ogni caso, quindi non ci dovrebbero essere troppi quelli.

+0

DOMANDA: L'uso di noConflict (true) rimuove tutte le variabili jQuery dall'ambito globale ... quindi come può aiutarti quando vuoi utilizzare 2 variabili per contenere versioni diverse di jQuery? - Grazie –

+0

Ecco cosa fa noConflict: window. $ = _ $; if (deep) window.jQuery = _jQuery; return jQuery; Tutto quello che vedo è che scrive l'oggetto jQuery su una variabile globale nella finestra (anziché su $) ... quindi mi manca qualcosa.-Grazie –

+0

@Robalot quando una versione di jQuery carica memorizza nella cache le variabili in '$' e 'jQuery' attualmente in' _S' e '_jQuery'. Il primo carico di jQuery verrà memorizzato nella cache 'undefined'. Quello che fa è impostare i valori "non definiti" e restituire un riferimento a "$". Quindi rimuove jQuery dall'ambito globale e restituisce jQuery. – Raynos

Problemi correlati