Wie kann ich feststellen, ob eine Datei JavaScript bereits in einer ASP.NET-Seite enthalten sind?

StackOverflow https://stackoverflow.com/questions/908425

Frage

Ich habe ein ASP.NET-Benutzersteuerelement (ASCX-Datei). In dieser Benutzerkontrolle möchte ich eine Js-Datei verwenden.

So schließe ich <script src="file.js" type"text/javascript"></script> auf der Seite.

Aber manchmal benutze ich diese Benutzer die Kontrolle in einer Webseite, wo das gleiche Skript bereits geladen wurde.

Wie kann ich eine <script /> Erklärung hinzufügen, die nur auf der Seite machen, wenn die Seite nicht bereits einen anderen <script /> Tag für das gleiche Skript enthält?

War es hilfreich?

Lösung

Wie Sie asp.net verwenden, macht es Sinn, die Scheck-Server-Seite zu tun, wie das sein wird, wo Sie den Verweis auf die JavaScript-Datei hinzuzufügen, wählen. Von Ihrer .ascx Datei, die Sie mit folgendem registrieren können:

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

... von Ihrer Seite rufen Sie einfach das ClientScript Objekt direkt:

ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);

Die ‚GlobalUniqueKey‘ kann eine beliebige Zeichenfolge sein (ich die URL der JavaScript-Datei verwenden, um diese zu)

Wenn Sie versuchen, ein Skript mit dem gleichen Schlüssel Zeichenfolge zu registrieren, ist es nichts. Also, wenn Sie diese in Ihre Seite aufrufen, Ihre Kontrolle oder anderswo, werden Sie mit nur einem Verweis auf Ihrer Seite landen. Der Vorteil davon ist, dass Sie mehrere Instanzen einer Kontrolle auf einer Seite haben kann und obwohl sie alle versuchen, das gleiche Skript zu registrieren, ist es immer nur maximal ein Mal getan. Und keiner von ihnen müssen sich Sorgen zu machen über das Skript bereits registriert.

Es gibt einen ‚IsClientScriptIncludeRegistered (stringkey)‘ Methode, die Sie sehen, verwenden können, um, wenn ein Skript bereits unter diesem Schlüssel eingeschlossen worden ist, aber es scheint ziemlich überflüssig, dass der Check zu tun, bevor sie als mehrere Versuche Registrierung Ausnahmen registrieren nicht werfen oder verursachen keine anderen Fehler.

das Kontrollclientseitige Doing bedeutet, dass die mehreren Javascript Referenzen angenommen vom Browser zwischengespeichert werden (sie können nicht sein), können Sie immer noch mehrere Tags und die über den Kopf eines jeden haben verursacht einige Javascript auszuführen. Wenn Sie 20 Instanzen Ihrer Steuerelement auf einer Seite haben, konnte man ernsthafte Probleme bekommen.

Andere Tipps

Sie können tun, eines von zwei Dingen Client-Seite ...

  1. Überprüfen Sie die dom für das Tag-Skript auf die JavaScript-Datei Ihr wollen entsprechend überprüfen
  2. Testen Sie eine Variable oder Funktion, die Sie wissen, ist / wird in der JavaScript-Datei für nicht definierte definiert werden.

Hier ist eine schnelle JS-Funktion, die JQuery verwendet, um zu tun, was Sie brauchen:

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

Verwendung etwas wie folgt aus:

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

Diese prüft, ob Ihr Objekt oder die Funktion bereits vorhanden ist und verhindert somit Neudeklaration.

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

verwenden Sie diese in Ihrer Hauptseite und rufen Funktion sind mit dem Argument JavaScript-Datei Name

Wie Sie Javascript auf einer Seite Ihrer Website nur aufnehmen möchten.
Wenn Sie Asp.net (4,0), dann ist es sehr einfach.
Nur umfassen folgende Code

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

in ContentPlaceHolder der Content-Seite.

@Shimmy ich nach langer Zeit über das komme aber vielleicht könnte es immer noch nützlich sein, oder zumindest helfen, andere von hinten. Um zu überprüfen, ob jquery bereits tun dies geladen

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

Sie das Escape-Zeichen in Schließ Script-Tag in document.write-Anweisung nicht entgehen lassen.

@mysomic, warum habe ich nicht daran denken. Daumen nach oben

PS: Ich hätte gerne dieses Recht unter der Leitung zu schreiben, wo @Shimmy schrieb, dass jQuery selbst das Skript ist er laden will. Aber weiß nicht, wie es dort zu schreiben. kippe sehen Sie eine Antwort oder ähnlichen Link. Das mag dumm klingen, aber vielleicht bin ich etwas fehlt. Pls weisen darauf hin, jemand?

Wenn Sie es von Server-Seite benötigen, und Page.ClientScript.RegisterClientScriptInclude wird für Sie im Falle Skript nicht funktioniert wurde durch eine andere Art und Weise enthalten andere dann Page.ClientScript.RegisterClientScript (zB page.Header.Controls.Add ( ..), können Sie so etwas wie folgt verwenden:

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);    
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top