jQuery $(document).ready und UpdatePanels?

Lesezeit: 7 Minuten

jQuery documentready und UpdatePanels
Herb Caudill

Ich verwende jQuery, um einige Mouseover-Effekte auf Elemente zu verdrahten, die sich in einem UpdatePanel befinden. Die Ereignisse sind eingebunden $(document).ready . Zum Beispiel:

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

Natürlich funktioniert dies beim ersten Laden der Seite gut, aber wenn das UpdatePanel eine teilweise Seitenaktualisierung durchführt, wird es nicht ausgeführt und die Mouseover-Effekte funktionieren nicht mehr innerhalb des UpdatePanels.

Was ist der empfohlene Ansatz, um Dinge in jQuery nicht nur beim Laden der ersten Seite zu verdrahten, sondern jedes Mal, wenn ein UpdatePanel eine teilweise Seitenaktualisierung auslöst? Sollte ich stattdessen den ASP.NET-Ajax-Lebenszyklus verwenden? $(document).ready?

  • Probieren Sie es aus, ich denke, es wird Ihr Problem lösen codeproject.com/Articles/21962/…

    – Baxterboom

    23. Februar 2013 um 9:01 Uhr

  • Ähnlich wie bei dieser Frage: stackoverflow.com/questions/301473/…

    – Per Hornshøj-Schierbeck

    20. April 2015 um 12:26 Uhr

Ein UpdatePanel ersetzt den Inhalt des Update-Panels bei einem Update vollständig. Das bedeutet, dass die von Ihnen abonnierten Veranstaltungen nicht mehr abonniert sind, da es neue Elemente in diesem Aktualisierungsbereich gibt.

Was ich getan habe, um dies zu umgehen, ist, die Ereignisse, die ich nach jedem Update benötige, erneut zu abonnieren. ich benutze $(document).ready() Verwenden Sie für den anfänglichen Ladevorgang dann die von Microsoft PageRequestManager (verfügbar, wenn Sie ein Update-Panel auf Ihrer Seite haben), um jedes Update erneut zu abonnieren.

$(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
});

Die PageRequestManager ist ein Javascript-Objekt, das automatisch verfügbar ist, wenn ein Update-Panel auf der Seite ist. Sie sollten nichts anderes als den obigen Code tun müssen, um ihn zu verwenden, solange sich das UpdatePanel auf der Seite befindet.

Wenn Sie eine detailliertere Steuerung benötigen, übergibt dieses Ereignis Argumente, ähnlich wie .NET-Ereignisse Argumente übergeben (sender, eventArgs) So können Sie sehen, was das Ereignis ausgelöst hat, und nur bei Bedarf erneut binden.

Hier ist die neueste Version der Dokumentation von Microsoft: msdn.microsoft.com/…/bb383810.aspx


Eine bessere Option, die Sie je nach Bedarf haben, ist die Verwendung von jQuery .on(). Diese Methoden sind effizienter als das erneute Abonnieren von DOM-Elementen bei jedem Update. Lesen Sie jedoch die gesamte Dokumentation, bevor Sie diesen Ansatz verwenden, da er möglicherweise Ihren Anforderungen entspricht oder nicht. Es gibt viele jQuery-Plug-ins, deren Verwendung nicht sinnvoll wäre .delegate() oder .on()also ist es in diesen Fällen besser, wenn Sie sich erneut anmelden.

  • Bitte seien Sie bei der Erklärung genauer. Ich meine, ein Anwendungsbeispiel ist viel besser als ein paar verstreute Codezeilen. Siehe Erklärung von Brian MacKay. Es ist perfekt!

    – Wahrheitssucher

    8. November 2010 um 15:22 Uhr

  • @Dan, ab jQuery 1.7, .delegate() wurde durch die ersetzt .on()

    – Gabriele Petrioli

    8. Dezember 2011 um 20:04 Uhr

  • @GabyakaG.Petrioli Mir ist klar, dass es ersetzt wurde, aber da diese Antwort ein häufiges Problem zu lösen scheint, wollte ich die Kompatibilität mit älteren Versionen von jQuery maximieren, die noch nicht aktualisiert wurden. Meine Antwort zuvor empfohlen .live(...) die in 1.7 offiziell veraltet ist und in einer zukünftigen Version möglicherweise entfernt wird. Ich habe bewusst gewählt .delegate() da es seit einiger Zeit in jQuery unterstützt wird und wahrscheinlich nicht in absehbarer Zeit entfernt wird. Ich werde jedoch meine Antwort aktualisieren, um sie zu erwähnen .on() auch für diejenigen, die es verwenden können.

    – Dan Herbert

    8. Dezember 2011 um 20:17 Uhr

  • Es ist besser, die Prm-Variable innerhalb von $(document).ready zu deklarieren und zu verbinden, da es möglich ist, dass Sys noch nicht deklariert wurde (je nachdem, wo sich das Skript befindet).

    – Drakarah

    19. März 2012 um 12:19 Uhr

  • @AhmedSamy Es wird nicht empfohlen, es zu verwenden jQuery.delegate() mehr. Es wurde ersetzt durch jQuery.on() Dies ist die bevorzugte API. delegate() ist einfach ein Wrapper für eine bestimmte Verwendung von on(), und es ist möglich, dass es in Zukunft veraltet sein wird. Mein vorheriger Kommentar erwähnt delegate() wurde vor über einem Jahr geschrieben, als jQuery 1.7 (das die on() API) wurde neu veröffentlicht. Da jQuery 1.9 bereits verfügbar ist und 2.0 in der Betaphase zur Veröffentlichung vorbereitet wird, ist es eine gute Idee, die Verwendung zu vermeiden delegate() in jedem neuen Code.

    – Dan Herbert

    7. Februar 2013 um 1:51 Uhr


<script type="text/javascript">

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

Der Bereich, der aktualisiert wird.

<asp:UpdatePanel...
<ContentTemplate
     <script type="text/javascript">
                    Sys.Application.add_load(BindEvents);
     </script>
 *// Staff*
</ContentTemplate>
    </asp:UpdatePanel>

  • Funktioniert gut für asp: GridView TextBox innerhalb von

    – Dan Randolph

    8. Februar 2017 um 18:40 Uhr

  • Das Problem bei dieser Lösung besteht darin, dass sie, obwohl sie funktioniert, den asynchronen Postback des UpdatePanels beendet, wodurch das UpdatePanel wieder unbrauchbar wird. (Seufzen)

    – MC9000

    7. September 2018 um 6:32 Uhr

jQuery documentready und UpdatePanels
Brian MacKay

Benutzersteuerung mit jQuery in einem UpdatePanel

Dies ist keine direkte Antwort auf die Frage, aber ich habe diese Lösung zusammengestellt, indem ich die Antworten gelesen habe, die ich hier gefunden habe, und ich dachte, jemand könnte sie nützlich finden.

Ich habe versucht, einen jQuery-Textbereichsbegrenzer innerhalb eines Benutzersteuerelements zu verwenden. Dies war schwierig, da das Benutzersteuerelement innerhalb eines UpdatePanels ausgeführt wird und beim Rückruf seine Bindungen verliert.

Wenn dies nur eine Seite wäre, hätten die Antworten hier direkt zugetroffen. Benutzersteuerelemente haben jedoch weder direkten Zugriff auf das Head-Tag noch direkten Zugriff auf das UpdatePanel, wie einige der Antworten vermuten.

Am Ende habe ich diesen Skriptblock ganz oben in das Markup meiner Benutzersteuerung eingefügt. Für die anfängliche Bindung verwendet es $(document).ready und dann von dort aus prm.add_endRequest:

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

Also … dachte nur, jemand würde gerne wissen, ob das funktioniert.

  • Ich konnte das nicht für mein ganzes Leben zum Laufen bringen. Dann habe ich es von der Kopf- in die Fußzeile verschoben und es hat funktioniert. Nicht positiv, aber ich denke, es musste nach dem von mir verwendeten ScriptManager kommen.

    – Adam Jünger

    8. September 2011 um 22:45 Uhr

  • In meinem Fall habe ich das Skript mit ScriptManager.RegisterClientScriptBlock hinzugefügt, wodurch das Skript hinzugefügt wird, bevor Sys definiert wird, also habe ich stattdessen RegisterStartupScript verwendet (siehe Unterschied hier).

    – Firas Assaad

    9. Januar 2012 um 9:00 Uhr

  • Coole Antwort! Es funktionierte wie ein Zauber in meiner asp.net-Web-App. + für dich

    – Pranesh Janarthanan

    26. Mai 2017 um 5:23 Uhr

Aktualisieren Sie auf jQuery 1.3 und verwenden Sie:

$(function() {

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

});

Hinweis: Live funktioniert mit den meisten Events, aber nicht mit allen. Es gibt eine vollständige Liste in die Dokumentation.

jQuery documentready und UpdatePanels
Daniel Hursan

Du könntest auch versuchen:

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

da pageLoad() ein ASP.NET-Ajax-Ereignis ist, das jedes Mal ausgeführt wird, wenn die Seite auf der Clientseite geladen wird.

  • pageLoad dupliziert die Ereignisse bei jedem ASync-Postback des Update-Panels.

    – Zo hat

    16. Oktober 2012 um 7:48 Uhr

1646027469 841 jQuery documentready und UpdatePanels
Jason Planke

Meine Antwort?

function pageLoad() {

  $(document).ready(function(){

usw.

Funktionierte wie ein Zauber, wo eine Reihe anderer Lösungen kläglich scheiterten.

  • pageLoad dupliziert die Ereignisse bei jedem ASync-Postback des Update-Panels.

    – Zo hat

    16. Oktober 2012 um 7:48 Uhr

1646027470 902 jQuery documentready und UpdatePanels
Eran Galperin

Ich würde einen der folgenden Ansätze verwenden:

  1. Kapseln Sie die Ereignisbindung in einer Funktion und führen Sie sie jedes Mal aus, wenn Sie die Seite aktualisieren. Sie können die Ereignisbindung immer auf bestimmte Elemente beschränken, um Ereignisse nicht mehrmals an dieselben Elemente zu binden.

  2. Verwenden Sie die Liveabfrage Plug-in, das Methode eins automatisch für Sie ausführt. Ihre Präferenz kann variieren, je nachdem, wie viel Kontrolle Sie über die Ereignisbindung haben möchten.

884860cookie-checkjQuery $(document).ready und UpdatePanels?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy