Masalah WebKit dengan event.layerX dan event.layerY

507

Saya baru saja memperhatikan bahwa saya mendapatkan banyak sekali peringatan yang sudah ketinggalan zaman dalam pembuatan Chrome terbaru (kenari).

event.layerX dan event.layerY rusak dan tidak digunakan lagi di WebKit. Mereka akan dikeluarkan dari mesin dalam waktu dekat.

Sepertinya jQuery mengacaukan semuanya.

Saya menggunakan: jquery-1.6.1.min.js.

Apakah akan membantu untuk meningkatkan ke versi jQuery terbaru atau belum diperbaiki atau apakah itu bug Chrome atau itu sesuatu yang lain.

PS

Saya tidak dapat menunjukkan kode kepada Anda karena saya pikir ini adalah kesalahan umum, tetapi saya curiga peringatan tersebut dilemparkan ketika saya mencoba mengakses objek jQuery atau ketika jQuery mencoba mengakses layerX / layerY (well, saya cukup yakin itu masalahnya mengingat kesalahan: P).

jQuery mungkin menyalin properti-properti itu ke objek jQuery.

Begitu...

Apa yang sedang terjadi?

EDIT

jQuery 1.7 keluar dan memperbaiki masalah ini.

Baca lebih lanjut di blog mereka, di sini .

PeeHaa
sumber
1
Hanya memperhatikan ini hari ini, juga.
Dusda
5
jQuery 1.7 masih melempar peringatan sepertinya belum diperbaiki .......
Krish
3
@ Stuart.Sklinar Saya tidak tahu apakah Anda juga kode dalam PHP, tetapi jika Anda melakukannya saya cukup yakin Anda juga gunakan @untuk menekan kesalahan.
PeeHaa
1
chrome hanya mengelompokkan kesalahan yang serupa jika tidak ada kesalahan sementara di antaranya. Jadi masalahnya benar-benar, itu membuatnya lebih rumit untuk menggunakan konsol untuk debugging. Ini menjengkelkan, tetapi sampai sekarang saya tidak berpikir fungsionalitas jQuery benar-benar rusak
carpii
2
Perlu dicatat, untuk anak cucu, bahwa WebKit ( bug 86264 ) telah mundur dari keputusan mereka untuk mundur layerXdan layerY, setidaknya sampai mereka memberikan pertimbangan lebih hati-hati. Perlu juga dicatat bahwa IE baru-baru ini ditambahkan layerX dan layerYsetelah tidak memilikinya sampai versi 9. Dugaan saya adalah properti ini tidak akan hilang - setidaknya sampai ada pengganti W3C yang sesuai, yang tidak akan segera. Peringatan hilang dalam versi terbaru dari WebKit.
Nathan Wall

Jawaban:

463

Apa yang sedang terjadi!?

"jQuery mungkin menyalin properti-properti itu ke objek jQuery." Kamu benar sekali, jadi sepertinya kamu sudah tahu! :)

Semoga jQuery akan memperbarui kode mereka untuk berhenti menyentuh itu, tetapi pada saat yang sama WebKit seharusnya tahu lebih baik daripada mencatat peringatan penghentian pada suatu acara (setidaknya menurut saya). Satu pengendali mouse dan konsol Anda meledak. :)

Ini tiket jQuery terbaru: http://bugs.jquery.com/ticket/10531

UPDATE: Ini diperbaiki sekarang jika Anda meningkatkan ke jQuery 1.7.

Harap dicatat bahwa jika memutakhirkan jQuery tidak memperbaiki masalah untuk Anda, itu mungkin ada hubungannya dengan ekstensi / plugin yang digunakan seperti yang dinyatakan Jake dalam jawabannya .

Adam A
sumber
8
@Neal di jQuery 1.7 itu akan dihapus sesuai dengan tiket
sensor
7
Saya masih melihat mereka di jQ ​​1,7
Victor S
22
Dan saya masih melihatnya di jQ ​​1.7.1. Jadi sepertinya tidak diperbaiki.
Paparappa
3
Saya setuju dengan 1.7.1, peringatan menghilang! Terima kasih.
Jk_
3
Saya telah menonaktifkan semua ekstensi saya dan saya masih mendapatkan peringatan ini dengan 1.7.2
basZero
74

http://jsperf.com/removing-event-props/2

Perbaikan sementara adalah menjalankan kode ini sebelum Anda melakukan acara apa pun yang mengikat melalui jQuery:

(function(){
    // remove layerX and layerY
    var all = $.event.props,
        len = all.length,
        res = [];
    while (len--) {
      var el = all[len];
      if (el != 'layerX' && el != 'layerY') res.push(el);
    }
    $.event.props = res;
}());

MEMPERBARUI

Lihat tes kinerja terbaru untuk mengetahui apa cara tercepat untuk menghapus alat peraga acara.

David Murdoch
sumber
Tautan yang bagus! Saya memodifikasi tes perf. Penggunaan regex tampaknya memperlambat beberapa tes? Kecuali saya memecahkan sesuatu, menggunakan === atau! == pada semua tes tampaknya membuat sementara + menghapus opsi terbaik. jsperf.com/removing-event-props/3
Adam A
Selain overhead mengunduh dan menjalankan kode tambahan? Nggak.
David Murdoch
Apa gunanya membandingkan solusi yang berbeda ketika hanya dijalankan sekali? Kesederhanaan dan lebih sedikit kode atas kinerja adalah apa yang harus dinilai dalam kasus ini. Jika kita menginginkan keduanya, mengapa tidak mengganti array dengan nilai-nilai yang tidak memiliki layerX / layerY? Periksa bangku perf (yang tidak masalah lagi).
mekwall
28

Solusi terpendek untuk ini adalah ini satu kalimat:

$.event.props = $.event.props.join('|').replace('layerX|layerY|', '').split('|');
mekwall
sumber
1
@ Louis Saya tidak terbiasa dengan prototipe.js jadi saya tidak bisa banyak membantu, tapi saya kira perbaikannya harus sangat mirip dengan ini. Posting pertanyaan dan harap ada yang tahu :)
mekwall
21

Jumlah pesan ini yang sangat besar (saya baru mendapatkan 80000 dari mereka saat menggunakan gmail) memang merupakan bug di Chrome.

Anda harus memberi bintang pada masalah pada Chromium .

törzsmókus
sumber
1
FYI, masalah telah diperbaiki selama hampir satu tahun (yaitu peringatan telah dihapus dari WebKit). Jika Anda masih melihat masalah ini, pertimbangkan untuk memutakhirkan browser Anda.
törzsmókus
14

Ini juga dapat disebabkan oleh ekstensi Chrome, jadi periksa apakah pembaruan jQuery tidak berfungsi.

Jake
sumber
5

Berikut ini satu perbaikan lagi, tanpa mengganti instance asli dari $ .event.props (yang mungkin atau mungkin bukan array), untuk berjaga-jaga :-)

$.each(["layerX","layerY"], function(i,v) { if((i=p.indexOf(v)) > -1) $.fn.splice.call($.event.props,i,1) })
DUzun
sumber
5

Saya telah menggunakan ini setelah memanggil acara apa pun:

$.event.props.splice($.event.props.indexOf("layerY"),1);
$.event.props.splice($.event.props.indexOf("layerX"),1);

Itu bekerja untuk saya, saya tidak punya pesan peringatan karena saya sudah membuat patch ini pada kode saya.

jca258
sumber
4

Selain masalah konfigurasi yang tercantum dalam jawaban lain, kesalahan ini dapat dipicu oleh kesalahan sederhana dalam kode Anda sendiri: melupakan tanda '#' dari pemilih ID jQuery.

Saya memiliki kode yang terlihat seperti

$('datenotset_2341').click(function(){
 ....etc....
});

(kehilangan # di depan "datenotset")

Serta (jelas) gagal berfungsi, itu memicu pesan kesalahan ini di Chrome.

xgretsch
sumber
3

Saya mengalami masalah ini dalam kode saya sendiri. Ternyata saya mengulangi semua properti pada objek acara sebagai bagian dari alat debugging / inspeksi yang saya gunakan. Dalam contoh khusus ini saya menggunakan $ .Exp jQuery untuk mengkloning objek untuk pemeriksaan nanti, tapi saya percaya salah satu teknik iterasi standar dalam berbagai toolkit akan memicu peringatan juga.

Saya menyebutkannya di sini karena pemikiran awal saya hanya mencari basis kode untuk contoh layerX atau layerY tidak membantu - properti sedang dirujuk secara umum, bukan dengan nama.

Kris Giesing
sumber