Ho diviso il mio javascript in diversi file. Voglio evitare che i file javascript vengano caricati due volte. Come lo posso fare?Come posso verificare se un file JS è già stato incluso?
risposta
Non utilizzando qualsiasi quadro (che io sappia), è possibile farlo solo controllando se è già stata dichiarata una certa variabile nell'ambito globale.
Si potrebbe dichiarare una variabile var include1 = true;
all'interno include1.js
, e fare qualcosa di simile
if (window.include1 !== true) {
// load file dynamically
}
Non includere due volte. Sei tu che stai facendo gli include, dopotutto.
Se stai facendo queste inclusioni in modo dinamico, però, si può verificare se qualche funzione globale o di un oggetto è stata impostata dallo script. Per esempio, se ho lo script di seguito in un file:
Foo = function() {};
E poi mi includere in questo modo:
<script src="../foo.js"></script>
Prima che tag script viene analizzato dal browser, Foo
è undefined
. Dopo l'elaborazione del tag, Foo
è un Function
. È possibile utilizzare una logica basata su questo per determinare se è necessario includere alcuni file o meno.
Ecco un test per vedere se uno script è stato incluso in base al percorso del file js:
function isScriptAlreadyIncluded(src){
var scripts = document.getElementsByTagName("script");
for(var i = 0; i < scripts.length; i++)
if(scripts[i].getAttribute('src') == src) return true;
return false;
}
Essa opererà per tutti gli script non caricato tramite AJAX, anche se si consiglia di modificarlo se hai il codice jsonp in esecuzione.
Mi piace questa risposta perché mostra che è possibile tenere traccia di quali file sono stati inclusi, ma in pratica non consiglierei mai questo approccio, dal momento che anche se si può avere la suddivisione degli script in file diversi ora, è possibile combinarli in un unico file per ottenere prestazioni migliori, nel qual caso questo approccio non funzionerebbe più. –
@MattBrowne Sono d'accordo in linea di principio, ma spesso non è così semplice. A volte uno sta lavorando all'interno di un framework (o per qualche altro motivo non ha il controllo) che può includere o meno un file di script. – cwallenpoole
Esattamente @cwallenpoole! Questo è un punto ENORME! +1! –
Si avrebbe bisogno di tenere traccia manualmente e assicurarsi. Anche il suggerimento di UweB funzionerebbe.
Si potrebbe anche verificare Require.js che potrebbero aiutare ad organizzare i file.
Ho affrontato questo in un paio di modi.
1 - dichiarando un nuovo array vuoto nel mio file di base o uno script che sarà sempre caricato, cioè la pagina principale nel mio caso index.php e innescando l'esecuzione del carico,
var scriptsLoaded = new Array();
Quindi, come una linea di apertura in ogni script caricato dinamicamente, comincio aggiungendo un valore di stringa personalizzato a questo array. Ho usato la convenzione di denominazione di questo semplicemente il nome del file. Ad esempio, la prima linea è in uno script di caricare in modo dinamico è
scriptsLoaded[] = 'thisScriptName.js';
allora è un caso abbastanza semplice di verificare se esiste il nome del file.
Questo funziona per ajax script caricati troppo.E sembra funzionare bene la maggior parte del tempo per quanto riguarda lo script effettivamente caricato
e 2, un ulteriore miglioramento al metodo è quello di aggiungere un'altra linea in basso, una funzione personalizzata per il file caricato js esempio:
function JSthisScriptName() {return true}
Da qui un semplice approccio try-catch può verificare se lo script viene effettivamente caricata prima dell'esecuzione e se non impostare un timeout
apprezzo questo non è completamente automatizzato ma sembra robusto.
E, 3, se si scusa la brevità su questo, un altro metodo che ho usato è di chiamare una funzione di controllo invece della funzione di script esterno direttamente dove il correttore prende il nome della funzione e il nome dello script e gli assegni se è utilizzabile prima di provare o impostare un timeout e caricare lo script
- 1. Come verificare se un file è già aperto in C
- 2. Come posso sapere se un file javascript è già stato incluso in una pagina di livello superiore?
- 3. JavaScript: come verificare se l'evento è già stato aggiunto
- 4. Come posso verificare se un identificatore di riutilizzo è già stato registrato con un UITableView?
- 5. Come verificare se un file è già stato aperto (nello stesso processo)
- 6. Incluso un file .js all'interno di un file .js
- 7. Come posso verificare se un CGPoint è stato inizializzato?
- 8. come verificare se un file è stato selezionato usando javascript?
- 9. Come verificare se un file è stato creato da pickle?
- 10. PHP - Come posso verificare se return() è stato chiamato da un file di inclusione()?
- 11. Include jQuery, se non incluso già
- 12. Verificare se un CALayer è già aggiunto come sottolivello
- 13. Come verificare se WaitHandle è stato impostato?
- 14. Verificare se è stato definito un metodo
- 15. come posso verificare se esiste un file?
- 16. Come verificare se un modulo python è stato importato?
- 17. Come verificare se un viewStub è già gonfiato?
- 18. Verificare se il file è già nel controllo sorgente
- 19. Come posso verificare se session_start è stato inserito?
- 20. Come posso verificare se un file è eseguibile in node.js?
- 21. Come posso verificare se un file è o meno un'immagine?
- 22. Come determinare se un evento è già stato sottoscritto
- 23. Come verificare se HealthKit è stato autorizzato
- 24. Come posso verificare se sono già state lanciate delle eccezioni?
- 25. Come verificare se un prodotto è già stato acquistato utilizzando l'acquisto in app in iOS?
- 26. Come verificare se un thread è già stato avviato o meno in Java?
- 27. Come posso verificare se un filehandle è aperto in Perl?
- 28. Come verificare se jQuery è già nella cache?
- 29. Verificare se un evento esiste già
- 30. Come verificare se un evento è stato impedito
Basta includerli solo una volta. No seriamente come li includi? –
sei in grado di modificare il contenuto dei file JS – ferdynator
Di solito dovresti avere solo uno o più file js (concatenazione/minificazione), quindi è piuttosto semplice controllarlo a mano. –