2009-05-25 7 views
12

Mam kontroli użytkownika (ascx), w tym formantu użytkownika Chcę użyć pliku .js.Skąd wiadomo, czy plik javascript został już umieszczony na stronie najwyższego poziomu?

Dołączam więc do niego.

Z drugiej strony, czasami używam tej kontroli użytkownika na stronie internetowej, że ten skrypt został już wcześniej załadowany.

Jak mogę utworzyć deklarację i uczynić ją aktualną tylko wtedy, gdy strona nie zawiera innego znacznika dla tego skryptu?

+0

Czy istnieje powód, dlaczego nie można po prostu zawierać javascript biblioteki we wszystkich stronach – jfar

+4

jfar mam witryn, które tylko kiedykolwiek potrzebny plik javaScript w? na jednej konkretnej stronie, gdy pokazuję konkretną kontrolę, w większości przypadków ta kontrola nie będzie w ogóle używana na tej stronie. Byłoby nieekonomiczne, aby dołączyć javascript do każdego użytkownika, który odwiedził każdą stronę w witrynie, szczególnie jeśli ich brat Wser nalegał na żądanie pliku na każde żądanie. –

+1

Powodem, dla którego nie chcę uwzględniać go na wszystkich stronach, jest wydajność: nie potrzebuję go we wszystkich. Neil, dzięki za wyjaśnienie. – Shimmy

Odpowiedz

11

Jak używasz ASP.NET, warto zrobić wyboru po stronie serwera, jak to będzie gdzie możesz dodać odniesienie do pliku javascript. Z pliku .ascx można zarejestrować się, co następuje:

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

... ze swojej strony po prostu zadzwonić przedmiotem clientScript bezpośrednio:

ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile); 

do „GlobalUniqueKey” może być dowolny ciąg znaków (I użyj również adresu URL pliku javascript)

Jeśli spróbujesz zarejestrować skrypt z tym samym ciągiem znaków, to nic nie zrobi. Więc jeśli zadzwonisz na tę stronę, kontrolę lub gdziekolwiek indziej, otrzymasz tylko jedno odniesienie na twojej stronie. Zaletą tego jest to, że możesz mieć wiele instancji kontrolki na stronie i mimo, że wszystkie starają się zarejestrować ten sam skrypt, jest to robione maksymalnie jednorazowo. I żaden z nich nie musi się martwić, że skrypt jest już zarejestrowany.

Istnieje metoda "IsClientScriptIncludeRegistered (stringkey)", której można użyć do sprawdzenia, czy skrypt został już zawarty w tym kluczu, ale wydaje się dość niepotrzebny, aby wykonać to sprawdzenie przed rejestracją, ponieważ wielokrotne próby rejestracji nie powodują wyjątków lub spowodować inne błędy.

Wykonanie sprawdzania po stronie klienta oznacza, że ​​zakładając, że wiele odwołań do javascript jest buforowanych przez przeglądarkę (mogą one nie być), nadal masz wiele znaczników, a nadmiar każdego z nich powoduje uruchomienie javascriptu. Jeśli masz 20 instancji kontroli na stronie, możesz napotkać poważne problemy.

+0

nie znam ASP, ale wygląda na to o wiele ładniejsze rozwiązanie niż robi to po stronie klienta, tak jak ja to zrobiłem. – mysomic

+2

Na podstawie Twojej odpowiedzi zbudowałem na mojej stronie bazowej właściwości boolean "AttachJqery", "AttachEngine" itd. i to kontroluje attatchement, więc nie muszę się brudzić kodem. Mam również opcję ustawienia wartości domyślnych. Jeśli chcesz, możesz opublikować komentarz na ten temat. – Shimmy

0

użycie coś jak poniżej:

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

Te testy, jeśli obiekt lub funkcja już istnieje, a tym samym zapobiega ponowna.

6

Można zrobić jedną z dwóch rzeczy po stronie klienta ...

  1. Sprawdź Dom na tagu skryptu odpowiadającego javascript złożyć chcesz sprawdzić
  2. przetestować zmienną lub funkcjonować wiesz ma/zostanie zdefiniowany w pliku javascript dla niezdefiniowanych.

Oto krótki funkcja JS, który używa jQuery zrobić to, czego potrzebujesz:

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

Dzięki. Używam jQuery, to byłoby niesamowite. Dziękuję wszystkim, którzy udzielili odpowiedzi, na pewno skorzystam z nich w przyszłości. – Shimmy

+3

Jednym z problemów jest to, że sam jQuery jest skryptem, który chcę sprawdzić :) – Shimmy

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

wykorzystanie tego w głównym widoku i wywołanie funkcji obejmują z argumentem javascript nazwa pliku

0

Jak chcesz dołączyć JavaScript na jednej stronie tylko swojej stronie.
Jeśli używasz Asp.net (4.0), to jest bardzo proste.
Wystarczy zawierać następujący kod

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

w ContentPlaceHolder strony treścią.

0

@Shimmy Natknę się na to po dłuższej chwili, ale może to może być przydatne lub przynajmniej pomóc innym przyjść od tyłu. Aby sprawdzić, czy jquery jest już załadowany, wykonaj tę czynność, aby nie przegapić znaku escape w znaczniku skryptu zamykającego w instrukcji document.write.

@mysomic, dlaczego o tym nie pomyślałem. kciuki w górę:

PS: Bardzo bym chciał napisać to tuż pod linią, w której @Shimmy napisał, że jQuery sam jest skryptem, który chce załadować. Ale nie wiem, jak to tam napisać. Nie widzę odpowiedzi lub podobnego linku. To może zabrzmieć głupio, ale może czegoś brakuje. Pls o tym wszystkim mówią?

-1

Jeśli potrzebujesz go od strony serwera, a Page.ClientScript.RegisterClientScriptInclude nie będzie działać dla Ciebie w przypadku, gdy skrypt został dołączony w jakiś inny sposób niż Strona.ClientScript.RegisterClientScript (na przykład page.Header.Controls.Add (..), można użyć coś takiego:

static public void AddJsFileToHeadIfNotExists(Page page, string jsRelativePath) 
{ 
     foreach (Control ctrl in page.Header.Controls) 
     { 
      if (ctrl is HtmlLink) 
      { 
       if ((ctrl as HtmlLink).Href.ToLower().Contains(jsRelativePath.ToLower())) return; 
      } 
      if (ctrl is LiteralControl || ctrl is Literal) 
      { 
       if ((ctrl as ITextControl).Text.ToLower().Contains(jsRelativePath.ToLower())) return; 
      } 
      if (ctrl is HtmlControl) 
      { 
       if ((ctrl as HtmlControl).Attributes["src"] != null) 
        if ((ctrl as HtmlControl).Attributes["src"].ToLower().Contains(jsRelativePath.ToLower())) return; 
      } 
     } 

     HtmlGenericControl Include = new HtmlGenericControl("script"); 
     Include.Attributes.Add("type", "text/javascript"); 
     Include.Attributes.Add("src", page.ResolveUrl(jsRelativePath)); 
     page.Header.Controls.Add(Include); 
    } 
+0

Za dużo rzutowania ctrl to HtmlLink, a następnie ctrl jako łącze HTML. Rozważ: var lnk = ctrl jako HtmlLink; jeśli ctrl! = null. Zapisuje obsadę. – Roland

Powiązane problemy