jQuery $(dokument).gotowe i aktualizowane Panele?

Używam jQuery do tworzenia efektów mouseover na elementach znajdujących się wewnątrz panelu aktualizacji. Wydarzenia są związane w $(document).ready. Na przykład:

$(function() {    
    $('div._Foo').bind("mouseover", function(e) {
        // Do something exciting
    });    
});

Oczywiście działa to dobrze przy pierwszym załadowaniu strony, ale gdy panel UpdatePanel wykonuje częściową aktualizację strony, nie jest uruchamiany, a efekty mouseover nie działają już wewnątrz panelu UpdatePanel.

Jakie jest zalecane podejście do okablowania rzeczy w jQuery nie tylko przy pierwszym załadowaniu strony, ale co kiedy Panel UpdatePanel uruchamia częściową aktualizację strony? Czy powinienem używać ASP.NET ajax lifecycle zamiast $(document).ready?

Author: Brian Tompsett - 汤莱恩, 2008-11-01

19 answers

Panel aktualizacji całkowicie zastępuje zawartość panelu aktualizacji podczas aktualizacji. Oznacza to, że wydarzenia, które subskrybowałeś, nie są już subskrybowane, ponieważ w tym panelu aktualizacji są nowe elementy.

To, co zrobiłem, aby obejść to, to ponowna subskrypcja wydarzeń, których potrzebuję po każdej aktualizacji. Używam $(document).ready() do początkowego ładowania, następnie używam Microsoftu PageRequestManager (dostępne, jeśli masz panel aktualizacji na swojej stronie), aby ponownie subskrybować każdą aktualizację.

$(document).ready(function() {
    // bind your jQuery events here initially
});

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

prm.add_endRequest(function() {
    // re-bind your jQuery events here
});

The PageRequestManager jest obiektem javascript, który jest automatycznie dostępny, jeśli na stronie znajduje się panel aktualizacji. Nie powinieneś robić niczego innego niż powyższy kod, aby używać go tak długo, jak UpdatePanel znajduje się na stronie.

Jeśli potrzebujesz bardziej szczegółowej kontroli, to zdarzenie przekazuje argumenty podobne do tego, jak zdarzenia. NET są przekazywane argumenty (sender, eventArgs), więc możesz zobaczyć, co wywołało Zdarzenie i tylko ponownie powiązać w razie potrzeby.

Oto najnowsza wersja dokumentacji firmy Microsoft: msdn.microsoft.com/.../bb383810.aspx


Lepszą opcją, którą możesz mieć, w zależności od potrzeb, jest użycie jQuery .on(). Metody te są bardziej wydajne niż ponowne subskrybowanie elementów DOM przy każdej aktualizacji. Przeczytaj całą dokumentację przed użyciem tego podejścia, ponieważ może ono lub nie zaspokoić Twoich potrzeb. Istnieje wiele wtyczek jQuery, które byłoby nieuzasadnione, aby refactor używać .delegate() lub .on(), więc w takich przypadkach, lepiej ponowna subskrypcja.

 547
Author: Dan Herbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-07 11:32:52
<script type="text/javascript">

        function BindEvents() {
            $(document).ready(function() {
                $(".tr-base").mouseover(function() {
                    $(this).toggleClass("trHover");
                }).mouseout(function() {
                    $(this).removeClass("trHover");
                });
         }
</script>

Obszar, który będzie aktualizowany.

<asp:UpdatePanel...
<ContentTemplate
     <script type="text/javascript">
                    Sys.Application.add_load(BindEvents);
     </script>
 *// Staff*
</ContentTemplate>
    </asp:UpdatePanel>
 158
Author: Barbaros Alp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-14 13:51:45

Kontrola użytkownika z jQuery wewnątrz panelu UpdatePanel

To nie jest bezpośrednia odpowiedź na pytanie, ale poskładałem To rozwiązanie, czytając odpowiedzi, które znalazłem tutaj, i pomyślałem, że ktoś może uznać to za przydatne.

Próbowałem użyć ogranicznika jQuery textarea wewnątrz kontrolki użytkownika. Było to trudne, ponieważ kontrola użytkownika Działa wewnątrz panelu UpdatePanel i traciła swoje powiązania podczas wywołania zwrotnego.

Gdyby to była tylko strona, odpowiedzi tutaj zastosowałby się bezpośrednio. Jednak kontrolki użytkownika nie mają bezpośredniego dostępu do tagu head, ani nie mają bezpośredniego dostępu do Panelu UpdatePanel, jak zakładają niektóre odpowiedzi.

W końcu umieściłem ten blok skryptów w górnej części znaczników mojej kontroli użytkownika. Dla początkowego wiązania używa $(document).gotowy, a następnie korzysta z prm.add_endRequest stamtąd:

<script type="text/javascript">
    function BindControlEvents() {
        //jQuery is wrapped in BindEvents function so it can be re-bound after each callback.
        //Your code would replace the following line:
            $('#<%= TextProtocolDrugInstructions.ClientID %>').limit('100', '#charsLeft_Instructions');            
    }

    //Initial bind
    $(document).ready(function () {
        BindControlEvents();
    });

    //Re-bind for callbacks
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 

    prm.add_endRequest(function() { 
        BindControlEvents();
    }); 

</script>
Więc... Pomyślałem, że ktoś chciałby wiedzieć, że to działa.
 63
Author: Brian MacKay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-04 11:43:46

Upgrade do jQuery 1.3 i użyj:

$(function() {

    $('div._Foo').live("mouseover", function(e) {
        // Do something exciting
    });

});

Uwaga: live działa z większością wydarzeń, ale nie wszystkie. Pełna lista znajduje się w dokumentacji .

 33
Author: svinto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-06 00:54:52

Możesz też spróbować:

<asp:UpdatePanel runat="server" ID="myUpdatePanel">
    <ContentTemplate>

        <script type="text/javascript" language="javascript">
        function pageLoad() {
           $('div._Foo').bind("mouseover", function(e) {
               // Do something exciting
           });
        }
        </script>

    </ContentTemplate>
</asp:UpdatePanel>

, ponieważ pageLoad() jest ASP.NET Zdarzenie ajax, które jest wykonywane za każdym razem, gdy strona jest ładowana po stronie klienta.

 20
Author: Daniel Hursan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-31 10:57:53

Moja odpowiedź?

function pageLoad() {

  $(document).ready(function(){

Itd.

Działał jak urok, gdzie wiele innych rozwiązań zawiodło nędznie.

 17
Author: Jono,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-10 23:36:27

Użyłbym jednego z następujących podejść:

  1. Zamknąć powiązanie zdarzeń w funkcji i uruchamiać je za każdym razem, gdy aktualizujesz stronę. Zawsze można zawrzeć powiązanie zdarzeń z określonymi elementami, aby nie wiązać zdarzeń wielokrotnie z tymi samymi elementami.

  2. Użyj wtyczki livequery , która w zasadzie wykonuje metodę pierwszą dla ciebie automatycznie-magicznie. Twoje preferencje mogą się różnić w zależności od ilości kontroli nad wydarzeniem Wiązanie.

 7
Author: Eran Galperin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-01 22:39:23

To mi pomogło:

$(document).ready(function() {

    // Do something exciting

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

    prm.add_endRequest(function() {
        // re-bind your jQuery events here
    });

});
 7
Author: Turbojohan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-26 11:14:55

Funkcja pageLoad() jest bardzo niebezpieczna w tej sytuacji. Zdarzenia mogą być łączone wielokrotnie. Też bym się trzymał z daleka .live() dołącza się do elementu dokumentu i musi przemierzać całą stronę (powoli i gównianie).

Najlepszym rozwiązaniem jakie widziałem do tej pory jest użycie jQuery .funkcja delegate() na opakowaniu poza panelem aktualizacji i wykorzystuje bubbling. Poza tym, zawsze można podłączyć obsługę za pomocą biblioteki Ajax Microsoftu, która został zaprojektowany do pracy z UpdatePanels.

 6
Author: Norm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-17 15:17:10

Gdy $(document).ready(function (){...}) nie działa po poście strony, użyj funkcji JavaScript pageLoad w Asp.strona jak następuje:

<script type="text/javascript" language="javascript">
function pageLoad() {
// Initialization code here, meant to run once. 
}
</script>
 6
Author: Pradeep More,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-10 12:19:53

Miałem podobny problem i okazało się, że sposób, który działał najlepiej było polegać na Event Bubbling i delegacja zdarzeń, aby poradzić sobie z tym. Miłą rzeczą w delegowaniu zdarzeń jest to, że po skonfigurowaniu nie musisz ponownie dodawać zdarzeń po aktualizacji AJAX.

To, co robię w moim kodzie, to ustawianie delegata na elemencie nadrzędnym panelu aktualizacji. Ten element nadrzędny nie jest zastępowany podczas aktualizacji i dlatego powiązanie zdarzeń nie ma wpływu.

Istnieje wiele dobrych artykułów i wtyczek do obsłuż delegację zdarzeń w jQuery, a funkcja prawdopodobnie zostanie upieczona w wydaniu 1.3. Artykuł / wtyczka, której używam w celach informacyjnych to:

Http://www.danwebb.net/2008/2/8/event-delegation-made-easy-in-jquery

Kiedy zrozumiesz, co się dzieje, myślę, że znajdziesz to znacznie bardziej eleganckie rozwiązanie, które jest bardziej niezawodne niż pamiętanie o ponownym powiązaniu zdarzeń po każdej aktualizacji. Ma to również dodatkową zaletę, że daje jedno zdarzenie do rozłączenia, gdy strona jest rozładowany.

 4
Author: Joe Brinkman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-03 12:36:02

FWIW, doświadczyłem podobnego problemu w / mootools. Ponowne dołączanie moich zdarzeń było poprawnym posunięciem, ale trzeba było to zrobić pod koniec request..eg

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

Po prostu coś, o czym należy pamiętać, jeśli beginRequest spowoduje, że otrzymasz wyjątki null reference JS.

Cheers

 4
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-03 16:28:13

Jest to świetna wtyczka do użytku z panelami aktualizacji:

Http://updatepanelplugin.codeplex.com/

 4
Author: A_Surtees,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-16 19:20:42
pageLoad = function () {
    $('#div').unbind();
    //jquery here
}

Funkcja pageLoad jest idealna do tego przypadku, ponieważ działa przy początkowym ładowaniu strony i każdym asynchronicznym postbacku updatepanel. Po prostu musiałem dodać metodę unbind, aby jQuery działało na postach UpdatePanel.

Http://encosia.com/document-ready-and-pageload-are-not-the-same/

 3
Author: Duane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-23 02:18:38

Moja odpowiedź opiera się na wszystkich powyższych komentarzach ekspertów, ale poniżej znajduje się następujący kod, który każdy może użyć, aby upewnić się, że na każdym postbacku i na każdym asynchronicznym postbacku kod JavaScript będzie nadal wykonywany.

w moim przypadku miałem kontrolę użytkownika na stronie. Wystarczy wkleić poniższy kod do kontrolki użytkownika.

<script type="text/javascript"> 
        var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_endRequest(EndRequestHandler);
    function EndRequestHandler(sender, args) {
        if (args.get_error() == undefined) {
            UPDATEPANELFUNCTION();
        }                   
    }

    function UPDATEPANELFUNCTION() {
        jQuery(document).ready(function ($) {
            /* Insert all your jQuery events and function calls */
        });
    }

    UPDATEPANELFUNCTION(); 

</script>
 2
Author: Abhishek Shrivastava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-27 16:26:38

Panel aktualizacji zawsze zastępuje twój Jquery wbudowanymi skryptami Scriptmanagera po każdym załadowaniu. Lepiej, jeśli używasz takich metod instancji pageRequestManager...

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(onEndRequest)
    function onEndRequest(sender, args) {
       // your jquery code here
      });
To będzie działać dobrze ...
 2
Author: Rohit Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-21 12:30:08

Użyj poniższego skryptu i odpowiednio Zmień treść skryptu.

       <script>
        //Re-Create for on page postbacks
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        prm.add_endRequest(function () {
           //your codes here!
        });
    </script>
 1
Author: mzonerz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-20 07:47:51

W odpowiedzi na odpowiedź Briana Mackaya:

Wstrzykuję JavaScript do mojej strony za pomocą ScriptManager zamiast umieszczać go bezpośrednio w HTML kontrolera UserControl. W moim przypadku muszę przewijać do formularza, który jest widoczny po zakończeniu I powrocie Panelu UpdatePanel. To jest w kodzie za plikiem. W moim przykładzie utworzyłem już zmienną prm na głównej stronie zawartości.

private void ShowForm(bool pShowForm) {
    //other code here...
    if (pShowForm) {
        FocusOnControl(GetFocusOnFormScript(yourControl.ClientID), yourControl.ClientID);
    }
}

private void FocusOnControl(string pScript, string pControlId) {
    ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "focusControl_" + pControlId, pScript, true);
}

/// <summary>
/// Scrolls to the form that is made visible
/// </summary>
/// <param name="pControlId">The ClientID of the control to focus on after the form is made visible</param>
/// <returns></returns>
private string GetFocusOnFormScript(string pControlId) {
    string script = @"
    function FocusOnForm() {
        var scrollToForm = $('#" + pControlId + @"').offset().top;
        $('html, body').animate({ 
            scrollTop: scrollToForm}, 
            'slow'
        );
        /* This removes the event from the PageRequestManager immediately after the desired functionality is completed so that multiple events are not added */
        prm.remove_endRequest(ScrollFocusToFormCaller);
    }
    prm.add_endRequest(ScrollFocusToFormCaller);
    function ScrollFocusToFormCaller(sender, args) {
        if (args.get_error() == undefined) {
            FocusOnForm();
        }
    }";
    return script;
}
 0
Author: fujiiface,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-04 21:10:54
Sys.Application.add_load(LoadHandler); //This load handler solved update panel did not bind control after partial postback
function LoadHandler() {
        $(document).ready(function () {
        //rebind any events here for controls under update panel
        });
}
 0
Author: Tony Dong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-18 22:41:57