2009-07-21 7 views
0

Ich versuche Nutzung der Yahoo außergewöhnlichen Leistung Regel zu machen: avoiding duplicate scriptEntfernen von doppeltem Skript von Seite

Um dies zu tun, würde ich in der Lage sein will zu wissen, ob ein Skript bereits zur Seite hinzugefügt wurde vor der Injektion es in der Seite. Es sieht so aus, als könnte ich nicht herausfinden, was im asp.net-Code hinzugefügt wurde, es sei denn, ich habe einen Scriptmanager zur Seite hinzugefügt. aber ich möchte vermeiden, asp.net AJAX zu verwenden. Aus der Beschreibung der Regel geht hervor, dass es in PHP zwar möglich ist.

Angenommen, dass ich die Überprüfung in meinem Code nicht machen kann, dachte ich über die jQuery $ .getString-Funktion, aber es überprüft nicht, bevor Sie das Skript abrufen. Wenn ich die Javascript-Datei wählen müsste, müsste ich die gesamte HTTP-Antwort analysieren, um herauszufinden, welches Skript auf der Seite geladen wurde?

Antwort

2

Wenn die Seite die Skripts mit den ASP.NET Page.ClientScript-Registrierungs-APIs registriert, können Sie Page.ClientScript.IsClientScriptIncludeRegistered verwenden. Auf der anderen Seite, wenn Sie diese APIs verwenden, müssen Sie es nicht wirklich aufrufen, da es bereits gewährleistet, dass nur einer von jedem registriert ist.

http://msdn.microsoft.com/en/us/library/system.web.ui.clientscriptmanager.isclientscriptincluderegistered.aspx

Wenn die Seite nur regelmäßige ole Script-Elemente statisch im Markup hat, und Sie müssen erkennen, ob ein Skript auf der Client-Seite geladen wird, müssen Sie alle Script-Elemente auf der Seite erhalten und schauen Sie sich ihre .src-Werte an. Die Sache ist, dass einige Browser diese URL automatisch auf einen vollständigen Pfad auflösen, nicht nur den von Ihnen deklarierten. Sie können dies auf verschiedene Arten berücksichtigen: Sie können einfach nach dem Ende der Zeichenfolge suchen, die das gewünschte Skript ist, oder Sie können die URL, mit der Sie vergleichen möchten, auch auflösen, indem Sie sie auf eine dynamisch erstellte Datei setzen Skriptelement (das Sie dem DOM nicht hinzufügen, aber immer noch für Sie aufgelöst wird).

Das direkt an der Spitze von meinem Kopf ist, tut mir leid, wenn ich etwas falsch:

var s = document.createElement("script"); 
s.src = "foo.js"; 

var loaded, scripts = document.getElementsByTagName("script"); 
for (var i = 0; i < scripts.length; i++) { 
    if (scripts[i].src === s.src) { 
     loaded = true; 
     break; 
    } 
} 
if (loaded) { 
    // this script is already loaded 
    // assuming you dont have multiple copies in different locations 
} 
+0

Wenn Sie sich bemühen würden, Ihr Skript zu ändern, um eine JavaScript-Funktion zur Verwaltung von Duplikaten zu verwenden, wäre es viel besser, sie zu ändern, um die eingebauten Server-Side-Manager zu verwenden. – Alconja

+0

Einverstanden. Aber ich wollte nichts annehmen, er/sie hat vielleicht keine Kontrolle über andere Teile der Seite. – InfinitiesLoop

+0

Messepunkt. Ich denke, Sie beantworten die Frage auf den Buchstaben. :) – Alconja

-1

ja Sie müssen analysieren die gesamte Antwort ...

warum nicht Sie einen erstellen Javascript-Datei und setzen Sie alle Ihre Javascript dort und importieren Sie dann diese Javascript-Datei in Ihrem Code ??? Auf diese Weise können Sie das Einfügen von doppelten Skripten vermeiden.

1

Sie müssen dazu kein clientseitiges Scripting verwenden ... Sie können dies in Ihrem Code hinter dem ClientScriptManager tun, ohne ASP.NET AJAX verwenden zu müssen (ich denke, Sie sind verwirrend ClientScriptManager mit ScriptManager *) in Ihrer Kontrolle/Seite benutzen Sie einfach:

ClientScript.RegisterClientScriptInclude("some-script", "myScript.js"); 

oder von Ihrer Benutzerkontrolle:

Page.ClientScript.RegisterClientScriptInclude("some-script", "myScript.js"); 

Dies wird die Taste „etwas-Skript“ & nur registrieren, eine Kopie der Verwendung Skript auf der Seite.

* Um klar zu sein Ich denke, die Verwirrung aus der Differenz zwischen dieser ist arrising:

  • ClientScriptManager wenn eine serverseitiger Hilfsklasse, die Client-seitige Scripts zur Verwaltung verwendet wird (mit anderen Worten seines ganzer Zweck ist genau das zu tun, was Sie versuchen zu tun). Der Zugriff erfolgt über die ClientScript-Eigenschaft der Page.
  • ScriptManager ist eine Steuer verwendet, um Client-Seite Ajax-Scripting in ASP.NET AJAX

(Hölle ich verwirrte auch mich & den falschen Beispiel-Code zunächst gab) zu unterstützen

0

gut das wäre nicht tatsächlich arbeiten in einem Master-Detail-Szenario mit mehreren Web-Benutzersteuerelementen.

Dann hätten Sie keine Kontrolle darüber, wer die Skript-Initialisierung durchführen muss, wenn das Web-Benutzer-Steuerelement dynamisch ist.

Es ist einfacher, einmal zu verknüpfen, aber ein Entwickler müsste seine Optionen zwischen ClientManager und einem Skriptladen abwägen.

Verwandte Themen