jQuery $(document).ready a UpdatePanels?

Používám jQuery k propojení některých efektů přejetí myší na prvky, které jsou uvnitř UpdatePanel. Události jsou vázány v $(document).ready . Například:

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

Samozřejmě to funguje dobře při prvním načtení stránky, ale když UpdatePanel provede částečnou aktualizaci stránky, nespustí se a efekty přejetí myší už uvnitř UpdatePanelu nefungují.

Jaký je doporučený přístup pro zapojování věcí do jQuery nejen při prvním načtení stránky, ale pokaždé, když UpdatePanel spustí částečnou aktualizaci stránky? Mám používat životní cyklus ajax ASP.NET místo $(document).ready ?

Odpověď

Aktualizační panel zcela nahradí obsah aktualizačního panelu při aktualizaci. To znamená, že události, k jejichž odběru jste se přihlásili, již nejsou odebírány, protože na panelu aktualizací jsou nové prvky.

Co jsem udělal, abych to vyřešil, je opětovné přihlášení k odběru událostí, které potřebuji po každé aktualizaci. Používám $(document).ready() pro počáteční načtení pak použijte PageRequestManager společnosti Microsoft (k dispozici, pokud máte na své stránce panel aktualizací) pro opětovné přihlášení ke každé aktualizaci.

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

PageRequestManager je javascriptový objekt, který je automaticky dostupný, pokud je na stránce aktualizační panel. Pokud je UpdatePanel na stránce, neměli byste dělat nic jiného než výše uvedený kód, abyste jej mohli používat.

Pokud potřebujete podrobnější kontrolu, tato událost předává argumenty podobné tomu, jak jsou události .NET předávány argumenty (sender, eventArgs) takže můžete vidět, co událost vyvolalo, a znovu se svázat pouze v případě potřeby.

Zde je nejnovější verze dokumentace od společnosti Microsoft:msdn.microsoft.com/…/bb383810.aspx

Lepší možností, kterou můžete mít, v závislosti na vašich potřebách, je použít jQuery .on() . Tyto metody jsou efektivnější než opětovné přihlášení k odběru prvků DOM při každé aktualizaci. Před použitím tohoto přístupu si však přečtěte celou dokumentaci, protože může nebo nemusí splňovat vaše potřeby. Existuje mnoho zásuvných modulů jQuery, které by bylo nerozumné refaktorovat na použití .delegate() nebo .on() , takže v těchto případech je lepší se přihlásit znovu.