Saya mendapatkan pesan kesalahan "Tidak Tertangkap RangeError: Ukuran tumpukan panggilan maksimum terlampaui" di chrome. di sini adalah fungsi jQuery saya
$('td').click(function () {
if ($(this).context.id != null && $(this).context.id != '') {
foo($('#docId').val(), $(this).attr('id'));
}
return false;
});
Perhatikan bahwa ada puluhan ribu sel di halaman. Namun, saya biasanya mengasosiasikan stack overflows dengan rekursi dan dalam kasus ini sejauh yang saya lihat tidak ada.
Apakah membuat lambda seperti ini secara otomatis menghasilkan banyak barang di tumpukan? apakah ada jalan lain untuk itu?
Saat ini satu-satunya solusi yang saya miliki adalah menghasilkan peristiwa onclick secara eksplisit di setiap sel saat merender HTML, yang membuat HTML jauh lebih besar.
foo($('#docId').val(), $(this).attr('id'));
baris? - Tip kinerja ekstra: simpan hasil penyeleksi dalam cache - misalnya simpan hasil$(this)
dalam variabel dan gunakan di seluruh handler sesuai kebutuhan.Jawaban:
Karena "ada puluhan ribu sel di halaman" yang mengikat peristiwa klik ke setiap sel akan menyebabkan masalah performa yang buruk. Ada cara yang lebih baik untuk melakukan ini, yaitu mengikat peristiwa klik ke badan & kemudian mencari tahu apakah elemen sel adalah target klik. Seperti ini:
Metode ini tidak hanya akan melakukan tugas Anda dengan tag "td" asli tetapi juga dengan "td" yang kemudian ditambahkan. Saya rasa Anda akan tertarik dengan artikel ini tentang event binding & delegate
Atau Anda cukup menggunakan metode " .on () " dari jQuery dengan efek yang sama:
sumber
Anda juga bisa mendapatkan kesalahan ini jika Anda memiliki loop tak terbatas. Pastikan Anda tidak memiliki referensi diri rekursif yang tak ada habisnya.
sumber
<a id="linkDrink" onclick="drinkBeer();">Drink</a>
, dan$('#linkDrink').click();
masukdrinkBeer()
.Milik saya lebih merupakan kesalahan, yang terjadi adalah klik loop (saya kira) pada dasarnya dengan mengklik login orang tua juga diklik yang akhirnya menyebabkan ukuran tumpukan panggilan maksimum terlampaui.
sumber
Masalah ini terjadi pada saya ketika saya menggunakan jQUery Fancybox di dalam situs web dengan banyak plugin jQuery lainnya. Ketika saya menggunakan LightBox ( situs di sini ) daripada Fancybox, masalahnya hilang.
sumber
Anda bisa menggunakan
sumber
Saya baru-baru ini mengalami masalah ini juga. Saya memiliki tabel yang sangat besar di div dialog. Itu> 15.000 baris. Ketika .empty () dipanggil pada dialog div, saya mendapatkan kesalahan di atas.
Saya menemukan solusi bulat di mana sebelum saya memanggil pembersihan kotak dialog, saya akan menghapus setiap baris lainnya dari tabel yang sangat besar, lalu memanggil .empty (). Sepertinya itu berhasil. Tampaknya JQuery versi lama saya tidak dapat menangani elemen sebesar itu.
sumber