Come posso sapere se un file JavaScript è già stato incluso in una pagina ASP.NET?

Ho un controllo utente ASP.NET (file .ascx). In questo controllo utente voglio usare un file .js.

Quindi includo nella pagina.

Tuttavia, a volte uso questo controllo utente in una pagina web in cui questo stesso script è già stato caricato.

Come posso aggiungere una dichiarazione che eseguirà il rendering sulla pagina solo se la pagina non contiene già un altro per lo stesso script?

Dato che stai usando asp.net, ha senso fare il check sul lato server in quanto sarà dove sceglierai di aggiungere il riferimento al file javascript. Dal tuo file .ascx puoi registrare con il seguente:

 this.Page.ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile); 

… dalla tua pagina chiami direttamente l’object ClientScript:

 ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile); 

Il ‘GlobalUniqueKey’ può essere qualsiasi stringa (io uso l’url del file javascript anche per questo)

Se provi a registrare uno script con la stessa stringa di chiavi, non fa nulla. Quindi se lo chiami nella tua pagina, nel tuo controllo o in qualsiasi altro luogo, finirai con un solo riferimento nella tua pagina. Il vantaggio di questo è che puoi avere più istanze di un controllo su una pagina e anche se provano tutti a registrare lo stesso script, viene eseguito sempre al massimo una volta. E nessuno di loro deve preoccuparsi che lo script sia già registrato.

Esiste un metodo ‘IsClientScriptIncludeRegistered (stringkey)’ che puoi usare per vedere se uno script è già stato incluso sotto quella chiave ma sembra piuttosto ridondante per fare quel controllo prima di registrarti come più tentativi di registrazione non lanciare eccezioni o causare nessun altro errori.

Fare il check lato client significa che, supponendo che i riferimenti multipli di javascript siano memorizzati nella cache dal browser (potrebbero non esserlo), si hanno ancora più tag e l’overhead di ognuno causando l’esecuzione di alcuni javascript. Se avessi 20 istanze del tuo controllo su una pagina, potresti avere seri problemi.

Puoi fare una delle due cose lato client …

  1. Controlla dom per il tag script corrispondente al file javascript che vuoi controllare
  2. Prova una variabile o funzione che sai è / sarà definita all’interno del file javascript per indefinito.

Ecco una rapida funzione JS che usa JQuery per fare ciò di cui hai bisogno:

 function requireOnce(url) { if (!$("script[src='" + url + "']").length) { $('head').append(""); } } 

usa qualcosa come il seguente:

 if(typeof myObjectOrFunctionDecalredInThisScript != 'undefined') { // code goes here var myObjectOrFunctionDecalredInThisScript = { }; } 

Verifica se il tuo object o funzione esiste già e quindi impedisce la redeclaration.

 var storePath = []; function include(path){ if(!storePath[path]){ storePath[path]= true; var e = document.createElement("script"); e.src = path; e.type = "text/javascript"; document.getElementsByTagName("head")[0].appendChild(e); return false; } } 

usa questo nella tua pagina principale e chiama la funzione include con argomento nome file javascript

Come vuoi includere javascript su una sola pagina del tuo sito.
Se usi Asp.net (4.0), allora è molto semplice.
Basta includere il seguente codice

  

in ContentPlaceHolder della pagina di contenuto.

@Shimmy Sto attraversando questo dopo molto tempo, ma forse potrebbe essere ancora utile o almeno aiutare altri che arrivano da dietro. Per verificare se jquery è già caricato, fare questo

  

Non perdere il carattere di escape nel tag di script di chiusura nell'istruzione document.write.

@mysomic, perché non ci ho pensato. pollice su

PS: Mi sarebbe piaciuto scrivere proprio sotto la riga in cui @Shimmy ha scritto che jQuery stesso è lo script che vuole caricare. Ma non so come scriverlo lì. non posso vedere una risposta o qualcosa di simile. Questo può sembrare stupido ma forse mi manca qualcosa. Pls lo fa notare, qualcuno?

Se ne hai bisogno dal lato server, e Page.ClientScript.RegisterClientScriptInclude non funzionerà per te nel caso in cui lo script fosse incluso in qualche altro modo diverso da Page.ClientScript.RegisterClientScript (ad esempio page.Header.Controls.Add (..) , puoi usare qualcosa come questo:

 static public void AddJsFileToHeadIfNotExists(Page page, string jsRelativePath) { foreach (Control ctrl in page.Header.Controls) { if (ctrl is HtmlLink htmlLink) { if (htmlLink.Href.ToLower().Contains(jsRelativePath.ToLower())) return; } if (ctrl is ITextControl textControl && (textControl is LiteralControl || textControl is Literal)) { if (textControl.Text.ToLower().Contains(jsRelativePath.ToLower())) return; } if (ctrl is HtmlControl htmlControl) { if (htmlControl.Attributes["src"]?.ToUpper() .Contains(jsRelativePath.ToUpper())) return; } } HtmlGenericControl Include = new HtmlGenericControl("script"); Include.Attributes.Add("type", "text/javascript"); Include.Attributes.Add("src", page.ResolveUrl(jsRelativePath)); page.Header.Controls.Add(Include); }