2009-08-25 11 views
9

Wydaje mi się to trochę dziwne, że można zrobić ..Dlaczego nie możesz UnRegisterStartupScript?

Page.ClientScript.RegisterStartupScript(this.GetType(), "KeyName", "alert('changed my mind')", true); 

a potem na nie można wyrejestrować lub zatrzymać skrypt z renderowane są programowo.

Dlaczego Microsoft miałby to zrobić?

Nie lubię pracę tutaj .. http://hemant-vikram.blogspot.com/2005/11/unregister-startup-script-workaround.html

I nie podoba mi się możliwość ponownej rejestracji po prostu go i po to zrobić nic ..

myśli?

+2

Po prostu nie interesuje mnie, ** dlaczego ** chciałbyś wyrejestrować skrypt? –

+0

@Ian: ponieważ jeśli przejdziesz do innej strony internetowej iz powrotem za pomocą opcji BACK przeglądarki, skrypt ponownie uruchomi się ponownie! – Fandango68

+0

@IanKemp W moim przypadku było to spowodowane tym, że musiałem uruchomić wyskakujące okienko, ale dopiero po wystąpieniu odrzutu. Sprawdź moją odpowiedź, podczas gdy ten cały problem jest kludge, to był zdecydowanie najmniej kludgy. – paqogomez

Odpowiedz

5

Przypuszczam, że chciałby pan „wyrejestrować” skrypt (który został już zarejestrowany) pod pewnym warunkiem, tak:

Page.ClientScript.RegisterStartupScript(this.GetType(), "KeyName", "alert('changed my mind')", true); 
... 
if(condition) 
    Page.ClientScript.UnregisterStartupScript(this.GetType(), "KeyName", "alert('changed my mind')", true); 

Dlaczego nie może to być po prostu zmienione na:

if(!condition) 
    Page.ClientScript.RegisterStartupScript(this.GetType(), "KeyName", "alert('changed my mind')", true); 
+2

Masz rację zamiast naprawiać zapach kodu z refaktoryzacją Szukałem szybszego rozwiązania .. niegrzeczny! –

+0

Zrobione teraz działa uczta. –

+0

Gdyby to było tak celowe, jak ochrona przed wywołaniem Wyrejestrowania się zbyt późno. To naprawdę bezpieczne aż do etapu renderowania, ale RegisterStartupScript jest całkiem zadowolony z wywołania po Renderowaniu, gdy jest za późno, aby uwzględnić skrypt w odpowiedzi. – stevemegson

9

To jest rzeczywiście gorsze niż myślisz - "tylko ponowne zarejestrowanie go i nie wykonanie go" nie jest również opcją. Metoda rejestru sprawdza, czy skrypt jest już zarejestrowany z tym kluczem i nic nie robi, jeśli jest. Po wywołaniu RegisterStartupScript, nic, co możesz zrobić, nie spowoduje wyłączenia tego skryptu.

Jeśli chodzi o to, dlaczego Microsoft to zrobił, domyślam się, że możliwość zmiany lub usunięcia zarejestrowanych skryptów została po prostu zapomniana po pierwszym zaprojektowaniu RegisterStartupScript. Wybrane opcje sprawiły, że nietrywialne stało się cofnięcie i utworzenie metody wyrejestrowania, więc teraz będą mieli do tego dobry powód.

Po zarejestrowaniu skryptu jest on przechowywany w dwóch miejscach w kliencie ClientScriptManager. ListDictionary pozwala sprawdzić, czy skrypt jest już zarejestrowany, a ArrayList przechowuje rzeczywiste skrypty, ponieważ będą one renderowane. Zakładam, że ArrayList służy do zapewnienia, że ​​skrypty są renderowane w kolejności, w jakiej zostały zarejestrowane, ale oznacza to również, że nie można stwierdzić, który ciąg w tablicy ArrayList należy do którego klucza.

Nie byłoby strasznie trudno wyposażyć własną klasę stron metodami MaybeAddStartupScript(key,script) i ChangedMyMindAboutThatStartupScript(key). Przechowuj klucze i skrypty we własnym słowniku, a następnie w PreRender, rejestruj te skrypty, które dotarły do ​​tej pory. Z pewnością jest to irytujące, że trzeba to zrobić samemu.

+3

Kluczową kwestią, którą podjąłem w tej odpowiedzi, było rejestrowanie skryptów w Pre_Render, zamiast rejestrowania w Page_Load, a następnie próba ponownej rejestracji na podstawie zdarzenia na stronie. –

+0

@BrianHinchey Zgadzam się i chociaż moja odpowiedź tutaj nie używa prerender, pomaga zrozumieć, co dzieje się za kulisami. Spójrz i powiedz mi, czy podoba ci się moje rozwiązanie. – paqogomez

1

Po wielu badaniach, znalazłem rozwiązanie problemu, jeśli chcesz uruchamiać zarejestrowany skrypt tylko raz na na podstawie zdarzenia. Specjalne podziękowania za odpowiedź @ stevemegsona, która pomogła mi zrozumieć, czym właściwie był problem.

Rozwiązanie obejmuje metody javascript: Sys.Application.add_load i .

To działa tak. Ogólny funkcja javascript, że najpierw wywołuje funkcję pracownika, a następnie usuwa się to pierwsze sprawozdanie, a następnie add_load następująco go przez wywołanie tej funkcji:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    var script = @"<script language='javascript'> 
         function f(){ MyWorkerFunction(); 
            Sys.Application.remove_load(f);}; 
         Sys.Application.add_load(f); 
       </script>"; 

    ClientScript.RegisterStartupScript(GetType(), 
            "MyWorkerFunctionKey", 
            script, 
            false); 
} 

ta opiera się na telerik solution. Odwołuje się do elementów sterujących teleriksem, ale cała funkcjonalność to ASP.NET.

+0

To nadal powoduje, że skrypt jest uruchamiany ponownie dla mnie po powrocie. –

+0

@JamesWierzba Jeśli nie włożysz tego do ładowania strony, uruchomi się, a następnie natychmiast zwolni tę metodę. Być może mógłbyś duplikować swój problem na skrzypcach? – paqogomez

+0

Spróbuję tego –

0

How do I overwrite a Javascript function added (dynamically) by Asp.Net UpdatePanel?

Myślę, że za pomocą UpdatePanel jest jednym z roztworu, aby zastąpić js. Gdy używamy panel zaktualizować JavaScript nie jest prowadzony na częściowym postu tyłu i musi być zarejestrowana przez kod:

var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    prm.add_endRequest(someFunciton); 

Jeśli nie to wtedy możemy zarejestrować/renderowanie zmodyfikowaną funkcję ponownie częściowego słupka z powrotem w panelu aktualizacji . W takim przypadku występują pewne problemy z zakresem funkcji.

Przepraszamy za mój angielski.

Powiązane problemy