Saya menggunakan jQuery untuk menghubungkan beberapa efek mouseover pada elemen yang ada di dalam UpdatePanel. Peristiwa terikat $(document).ready
. Sebagai contoh:
$(function() {
$('div._Foo').bind("mouseover", function(e) {
// Do something exciting
});
});
Tentu saja, ini berfungsi dengan baik pertama kali halaman dimuat, tetapi ketika UpdatePanel melakukan pembaruan sebagian halaman, itu tidak berjalan dan efek mouseover tidak berfungsi lagi di dalam UpdatePanel.
Apa pendekatan yang disarankan untuk memasang kabel di jQuery tidak hanya pada pemuatan halaman pertama, tetapi setiap kali UpdatePanel mengaktifkan pembaruan sebagian halaman? Haruskah saya menggunakan siklus hidup ASP.NET ajax bukan $(document).ready
?
javascript
jquery
asp.net
asp.net-ajax
jquery-events
Ramuan Caudill
sumber
sumber
Jawaban:
UpdatePanel sepenuhnya menggantikan konten panel pembaruan pada pembaruan. Ini berarti bahwa peristiwa yang Anda langgani tidak lagi berlangganan karena ada elemen baru di panel pembaruan itu.
Apa yang telah saya lakukan untuk mengatasi ini adalah berlangganan kembali ke acara yang saya butuhkan setelah setiap pembaruan. Saya menggunakan
$(document).ready()
untuk memuat awal, kemudian menggunakan MicrosoftPageRequestManager
(tersedia jika Anda memiliki panel pembaruan pada halaman Anda) untuk berlangganan kembali setiap pembaruan.Ini
PageRequestManager
adalah objek javascript yang tersedia secara otomatis jika panel pembaruan ada di halaman. Anda tidak perlu melakukan apa pun selain kode di atas untuk menggunakannya selama UpdatePanel ada di halaman.Jika Anda memerlukan kontrol yang lebih terperinci, peristiwa ini meneruskan argumen yang mirip dengan bagaimana .NET peristiwa dilewati argumen
(sender, eventArgs)
sehingga Anda dapat melihat apa yang mengangkat peristiwa tersebut dan hanya mengikat kembali jika diperlukan.Ini adalah versi terbaru dari dokumentasi dari Microsoft: msdn.microsoft.com/.../bb383810.aspx
Opsi yang lebih baik yang mungkin Anda miliki, tergantung pada kebutuhan Anda, adalah menggunakan jQuery's
.on()
. Metode ini lebih efisien daripada berlangganan ulang ke elemen DOM pada setiap pembaruan. Baca semua dokumentasi sebelum Anda menggunakan pendekatan ini, karena mungkin atau mungkin tidak memenuhi kebutuhan Anda. Ada banyak plugin jQuery yang tidak masuk akal untuk ditolak untuk digunakan.delegate()
atau.on()
, jadi dalam kasus itu, Anda lebih baik berlangganan ulang.sumber
.delegate()
telah digantikan oleh.on()
.live(...)
yang secara resmi tidak digunakan lagi di 1.7 dan dapat dihapus di versi yang akan datang. Saya sengaja memilih.delegate()
karena telah didukung di jQuery untuk sementara waktu sekarang dan tidak mungkin dihapus dalam waktu dekat. Namun, saya akan memperbarui jawaban saya untuk menyebutkan.on()
juga bagi mereka yang dapat menggunakannya.jQuery.delegate()
lagi. Itu telah digantikan olehjQuery.on()
yang merupakan API yang disukai untuk digunakan.delegate()
hanya pembungkus untuk penggunaan khususon()
, dan mungkin saja itu akan menjadi usang di masa depan. Penyebutan komentar saya sebelumnyadelegate()
ditulis lebih dari setahun yang lalu ketika jQuery 1.7 (yang memperkenalkanon()
API) baru dirilis. Dengan jQuery 1.9 yang sudah keluar dan 2.0 dalam versi beta sedang disiapkan untuk rilis, adalah ide yang baik untuk menghindari penggunaandelegate()
dalam kode baru apa pun.Area yang akan diperbarui.
sumber
Kontrol Pengguna dengan jQuery Di dalam UpdatePanel
Ini bukan jawaban langsung untuk pertanyaan itu, tetapi saya memang menyatukan solusi ini dengan membaca jawaban yang saya temukan di sini, dan saya pikir seseorang mungkin menganggapnya berguna.
Saya mencoba menggunakan pembatas teks jQuery di dalam Kontrol Pengguna. Ini rumit, karena Kontrol Pengguna berjalan di dalam UpdatePanel, dan kehilangan ikatannya saat dipanggil kembali.
Jika ini hanya sebuah halaman, jawaban di sini akan diterapkan secara langsung. Namun, Kontrol Pengguna tidak memiliki akses langsung ke tag kepala, juga tidak memiliki akses langsung ke UpdatePanel seperti yang diasumsikan oleh beberapa jawaban.
Saya akhirnya menempatkan blok skrip ini tepat di atas markup Kontrol Pengguna saya. Untuk ikatan awal, ia menggunakan $ (dokumen). Sudah, dan kemudian menggunakan prm.add_endRequest dari sana:
Jadi ... Hanya berpikir seseorang mungkin ingin tahu bahwa ini berhasil.
sumber
Tingkatkan ke jQuery 1.3 dan gunakan:
Catatan: siaran langsung dengan sebagian besar acara, tetapi tidak semua. Ada daftar lengkap dalam dokumentasi .
sumber
live()
metode di IE7 (proyek jQuery 1.5.1 / VS2010). Bila menggunakanlive()
dalam sebuah UpdatePanel di v3.5 ASP.NET biasaAutoPostback
dari<asp:DropDownList />
penyebab 2 postbacks parsial yang bertentangan dengan 1. diharapkan The postback ekstra yang dikeluarkan oleh browser tidak memiliki konten (dibatalkan) menyebabkanPage.IsPostBack
menjadifalse
(yang membunuh negara dalam terikat saya kontrol). Saya menemukan pelakunya menjadi metode live (). Saya menyadari bahwa postback pertama dibatalkan oleh UpdatePanel per spec tetapi hanya jika ada satu lagi dalam antrian yang tidak ada.Anda juga dapat mencoba:
, karena pageLoad () adalah peristiwa ajax ASP.NET yang dijalankan setiap kali halaman dimuat di sisi klien.
sumber
Jawabanku?
dll.
Bekerja seperti pesona, di mana sejumlah solusi lain gagal total.
sumber
Saya akan menggunakan salah satu pendekatan berikut:
Meringkas peristiwa yang mengikat dalam suatu fungsi dan menjalankannya setiap kali Anda memperbarui halaman. Anda selalu dapat berisi acara yang mengikat elemen tertentu agar tidak mengikat acara berulang kali ke elemen yang sama.
Gunakan plug-in livequery , yang pada dasarnya melakukan metode satu untuk Anda secara otomatis. Preferensi Anda dapat bervariasi tergantung pada jumlah kontrol yang ingin Anda miliki pada acara yang mengikat.
sumber
Ini bekerja untuk saya:
sumber
fungsi pageLoad () sangat berbahaya untuk digunakan dalam situasi ini. Anda bisa membuat acara menjadi kabel beberapa kali. Saya juga akan tinggal jauh dari .live () karena melekat pada elemen dokumen dan harus melintasi seluruh halaman (lambat dan jelek).
Solusi terbaik yang saya lihat sejauh ini adalah dengan menggunakan fungsi jQuery .delegate () pada pembungkus di luar panel pembaruan dan memanfaatkan penggelembungan. Selain itu, Anda selalu bisa memasang penangan menggunakan perpustakaan Ajax Microsoft yang dirancang untuk bekerja dengan UpdatePanels.
sumber
Ketika
$(document).ready(function (){...})
tidak berfungsi setelah posting halaman kembali maka gunakan fungsi JavaScript pageLoad di Asp.page sebagai berikut:sumber
Saya memiliki masalah yang sama dan menemukan cara yang paling berhasil adalah mengandalkan Event Bubbling dan delegasi acara untuk menanganinya. Hal yang menyenangkan tentang pendelegasian acara adalah bahwa sekali pengaturan, Anda tidak harus membatalkan acara setelah pembaruan AJAX.
Apa yang saya lakukan dalam kode saya adalah mengatur delegasi pada elemen induk dari panel pembaruan. Elemen induk ini tidak diganti pada pembaruan dan oleh karena itu pengikatan acara tidak terpengaruh.
Ada sejumlah artikel dan plugin yang bagus untuk menangani delegasi acara di jQuery dan fitur ini kemungkinan akan dimasukkan ke rilis 1.3. Artikel / plugin yang saya gunakan untuk referensi adalah:
http://www.danwebb.net/2008/2/8/event-delegation-made-easy-in-jquery
Setelah Anda memahami apa yang terjadi, saya pikir Anda akan menemukan ini solusi yang jauh lebih elegan yang lebih dapat diandalkan daripada mengingat untuk mengikat kembali acara setelah setiap pembaruan. Ini juga memiliki manfaat tambahan yaitu memberi Anda satu acara untuk dilepas saat halaman dibongkar.
sumber
FWIW, saya mengalami masalah serupa w / mootools. Melampirkan kembali acara saya adalah langkah yang benar, tetapi perlu dilakukan di akhir permintaan..ceg
Hanya sesuatu yang perlu diingat jika beginRequest menyebabkan Anda mendapatkan referensi JS pengecualian nol.
Bersulang
sumber
Ini adalah plugin yang bagus untuk digunakan dengan panel pembaruan:
http://updatepanelplugin.codeplex.com/
sumber
Fungsi pageLoad sangat cocok untuk kasus ini karena berjalan pada halaman awal dan setiap postback updatepanel async. Saya hanya perlu menambahkan metode unbind untuk membuat jquery bekerja pada postback updatepanel.
http://encosia.com/document-ready-and-pageload-are-not-the-same/
sumber
Jawaban saya didasarkan pada semua komentar ahli di atas, tetapi di bawah ini adalah kode berikut yang dapat digunakan siapa pun untuk memastikan pada setiap postback dan pada setiap postback asinkron, kode JavaScript masih akan dieksekusi.
Dalam kasus saya, saya memiliki kontrol pengguna dalam satu halaman. Cukup tempel kode di bawah ini di kontrol pengguna Anda.
sumber
Panel Pembaruan selalu menggantikan Jquery Anda dengan skrip Scriptmanager bawaannya setelah setiap pemuatan. Lebih baik jika Anda menggunakan metode instance pageRequestManager seperti ini ...
itu akan bekerja dengan baik ...
sumber
Gunakan skrip di bawah ini dan ubah badan skrip yang sesuai.
sumber
Menanggapi jawaban Brian MacKay:
Saya menyuntikkan JavaScript ke halaman saya melalui ScriptManager alih-alih memasukkannya langsung ke HTML UserControl. Dalam kasus saya, saya perlu menggulir ke formulir yang dibuat terlihat setelah UpdatePanel selesai dan dikembalikan. Ini berlaku pada kode di belakang file. Dalam sampel saya, saya sudah membuat variabel PRM di halaman konten utama.
sumber
sumber