2011-02-14 17 views
6

tengo algo así como en un archivo Test.js decir:jQuery Singleton

(function($){  
$.test= function(){ 
    alert('test'); 
    } 
})(jQuery); 
jQuery.test(); 

Ahora bien, si se carga Test.js dos veces en mi página es decir src = Test.js en dos lugares diferentes, se da el doble de alerta . Quiero que sea como un singleton. ¿Alguna idea sobre cómo lograr esto?

+0

No está nada claro si intenta evitar _calling_ test dos veces, o _defining_ test dos veces. –

+0

Corrígeme si esta es una pregunta estúpida, pero ¿por qué necesitarías cargar un archivo más de una vez? ¿Por qué no simplemente almacenar la función en una variable y llamarla cuando la necesite en el documento? – LandonSchropp

+0

@Squeegy Llamo y defino la prueba dos veces. Quiero que eso suceda solo una vez. –

Respuesta

7

Use un atajo condicional:.

(function($){  
    !$.test && $.test= function(){ 
     alert('test'); 
    } 
})(jQuery); 

jQuery.test(); 

!$.test evalúa a true si $.test no está definido y el código de la rightside después de la && se ejecuta lo contrario, simplemente voy a saltar la parte Otro patrón útil para que pudiera verse como:..

$.test = $.test || function() { 
    alert('test'); 
} 

Esto hace lo lo mismo en realidad. Si $.test ya está definido, se utiliza; de lo contrario, asigne la función anónima al $.test. Ambas versiones pueden (y probablemente deberían) optimizarse, pero no solo verificar si se definieron, sino también si son del tipo function.

0

¿Has probado algo como esto?

if(typeof $.test == "undefined") { 
    (function($){  
    $.test= function(){ 
     alert('test'); 
    } 
    })(jQuery); 
    jQuery.test(); 
} 
0
(function($){  
    $.test = function() { 
    if (!$.test.hasBeenRun) { 
     $.test.hasBeenRun = true; 
     alert('test'); 
    } 
    } 
    $.test.hasBeenRun = false; 
})(jQuery); 
jQuery.test(); 
0

¿Por qué no extraer el código compartido en un tercer archivo?

Aparte de eso, depende de lo que haga el código. En general, se puede envolver toda la función en una condición y sólo ejecutar "si una cosa en conflicto aún no se ha realizado