Domanda

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

Così mi includo <script src="file.js" type"text/javascript"></script> sulla pagina.

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

Come posso aggiungere una dichiarazione <script /> che renderà sulla pagina solo se la pagina non contiene già un altro tag <script /> per lo stesso copione?

È stato utile?

Soluzione

Come si utilizza asp.net, ha senso fare il lato server di controllo, come che sarà in cui si sceglie di aggiungere il riferimento al file javascript. Dal file ascx è possibile registrare con il seguente:

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

... dalla tua pagina basta chiamare l'oggetto ClientScript direttamente:

ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);

Il 'GlobalUniqueKey' può essere qualsiasi stringa (io uso l'URL del file javascript anche per questo)

Se si tenta di registrare uno script con la stessa stringa chiave, non fa nulla. Quindi, se si chiama questo nella tua pagina, il vostro controllo o in qualsiasi altro, si ritroverà con un solo riferimento nella tua pagina. Il vantaggio di questo è che si può avere più istanze di un controllo in una pagina e anche se tutti cercano di registrare lo stesso copione, è sempre e solo fatto un massimo di un tempo. E nessuno di loro hanno bisogno di preoccuparsi per la sceneggiatura di essere già registrato.

C'è un metodo 'IsClientScriptIncludeRegistered (stringkey)', che si può usare per vedere se uno script è già stato incluso in quella chiave, ma sembra abbastanza ridondante di farlo controllo prima di registrare come più tentativi di registrare non gettare eccezioni o causare altri errori.

Fare il controllo lato client significa che, supponendo che i molteplici riferimenti javascript vengono memorizzati nella cache dal browser (non possono essere), è ancora più tag e la testa sopra di ognuno causando qualche JavaScript per funzionare. Se tu avessi 20 istanze del controllo in una pagina, si potrebbe ottenere seri problemi.

Altri suggerimenti

Si può fare una delle due cose lato client ...

  1. Controllare il dom per il tag script corrispondente al file javascript tuo voler controllare
  2. Prova una variabile o funzione si sa ha sarà definito / all'interno del file javascript per indefinito.

Ecco una funzione JS rapido che utilizza JQuery per fare quello che ti serve:

function requireOnce(url) {    
    if (!$("script[src='" + url + "']").length) {
        $('head').append("<script type='text/javascript' src='" + url + "'></script>"); 
    }
}

l'uso simile al seguente:

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

Questo test se l'oggetto o la funzione esiste già e quindi impedisce ridichiarazione.

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

utilizzare questo nella tua pagina principale e chiamare la funzione includere con l'argomento javascript nome di file

Come si desidera includere javascript solo su una pagina del tuo sito.
Se si utilizza Asp.net (4,0), allora è molto facile.
È sufficiente includere seguente codice

<script type="text/javascript" scr="filepath and name here"></script>

in ContentPlaceHolder della pagina di contenuto.

@Shimmy io vengo in questo dopo un po 'lungo ma forse potrebbe ancora essere utile o almeno contribuire altro provenienti da dietro. Per verificare se jQuery è già caricato fare questo

<script>window.jQuery || document.write('<script src="js/libs/jquery-1.x.x.min.js"><\/script>')</script>

Da non perdere il carattere di escape nel tag script di chiusura nella dichiarazione document.write.

@mysomic, perché non pensare a questo. pollice in alto

PS: mi sarebbe piaciuto scrivere questo proprio sotto la linea in cui ha scritto che @Shimmy jQuery per sé è lo script che vuole caricare. Ma non so come scrivere lì. posso vedere una risposta o qualcosa di simile legame. Questo può sembrare stupido, ma forse mi manca qualcosa. Pls indicarlo, nessuno?

Se avete bisogno dal lato server, e Page.ClientScript.RegisterClientScriptInclude non funziona per voi nel caso in cui lo script è stato incluso in qualche altra maniera altri poi Page.ClientScript.RegisterClientScript (ad esempio page.Header.Controls.Add ( ..), si può usare qualcosa di simile a 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);    
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top