Problemy z WebKit z event.layerX i event.layerY

507

Właśnie zauważyłem, że dostaję mnóstwo przestarzałych ostrzeżeń w najnowszej (kanaryjskiej) wersji Chrome.

event.layerX i event.layerY są uszkodzone i nieaktualne w WebKit. Zostaną one usunięte z silnika w najbliższej przyszłości.

Wygląda na to, że jQuery coś psuje.

Używam: jquery-1.6.1.min.js.

Czy pomógłby zaktualizować do najnowszej wersji jQuery, czy nie został jeszcze naprawiony, czy jest to błąd Chrome, czy jest to coś innego.

PS

Nie mogę wyświetlić kodu, ponieważ myślę, że to ogólny błąd, ale podejrzewam, że ostrzeżenia są generowane, gdy próbuję uzyskać dostęp do obiektu jQuery lub gdy jQuery próbuje uzyskać dostęp do warstwyX / layerY (cóż, jestem pewien, że tak jest, biorąc pod uwagę błąd: P).

jQuery prawdopodobnie kopiuje te właściwości do obiektu jQuery.

Więc...

Co się dzieje?

EDYTOWAĆ

jQuery 1.7 jest już dostępny i rozwiązuje ten problem.

Przeczytaj więcej na ich blogu tutaj .

PeeHaa
źródło
1
Właśnie to zauważyłem dzisiaj.
Dusda,
5
jQuery 1.7 wciąż rzuca ostrzeżenie wydaje się jeszcze nie naprawione .......
Krish
3
@ Stuart.Sklinar Nie wiem, czy ty również kodujesz w PHP, ale jeśli to zrobisz, jestem pewien, że używasz również @do tłumienia błędów.
PeeHaa,
1
chrome grupuje podobne błędy tylko wtedy, gdy między nimi nie było żadnych błędów pośrednich. Problem polega na tym, że korzystanie z konsoli do debugowania jest bardziej kłopotliwe. Jest drażniący, ale nie sądzę, aby jakakolwiek funkcja jQuery była faktycznie zepsuta
carpii
2
Dla potomnych warto zauważyć, że WebKit ( błąd 86264 ) wycofał się ze swojej decyzji o wycofaniu się, layerXa layerYprzynajmniej do czasu, aż dokładniej się nad tym zastanowią. Warto również zauważyć, że IE ostatnio dodał layerX i layerYnie miał go aż do wersji 9. Domyślam się, że te właściwości nie znikną - przynajmniej dopóki nie będzie odpowiedniej wymiany W3C, co nie nastąpi wkrótce. Ostrzeżenia zniknęły w najnowszych wersjach WebKit.
Nathan Wall,

Odpowiedzi:

463

Co się dzieje!?

„jQuery prawdopodobnie kopiuje te właściwości do obiektu jQuery.” Masz dokładnie rację, więc brzmi to tak, jakbyś już wiedział! :)

Mam nadzieję, że jQuery zaktualizuje swój kod, aby przestać go dotykać, ale jednocześnie WebKit powinien był wiedzieć lepiej niż rejestrować ostrzeżenie o wycofaniu się z wydarzenia (przynajmniej moim zdaniem). Jeden manipulator myszy i twoja konsola wybucha. :)

Oto najnowszy bilet jQuery: http://bugs.jquery.com/ticket/10531

AKTUALIZACJA: Zostało to naprawione teraz, jeśli uaktualnisz do jQuery 1.7.

Pamiętaj, że jeśli aktualizacja jQuery nie rozwiąże problemu, może to mieć coś wspólnego z używanymi rozszerzeniami / wtyczkami, jak stwierdził Jake w swojej odpowiedzi .

Adam A.
źródło
8
@ Neal w jQuery 1.7 zostanie usunięty zgodnie z biletem
czujnik
7
Nadal je widzę w JQ 1.7
Victor S,
22
I nadal widzę je w JQ 1.7.1. Więc nie wydaje się być naprawiony.
Paparappa,
3
Zgadzam się z 1.7.1, ostrzeżenia zniknęły! Dzięki.
Jk_
3
Wyłączyłem
74

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

Tymczasową poprawką jest uruchomienie tego kodu przed wykonaniem jakiegokolwiek wiązania zdarzenia za pomocą 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;
}());

AKTUALIZACJA

Zobacz najnowsze testy wydajności, aby dowiedzieć się, jaki jest najszybszy sposób usunięcia rekwizytów zdarzeń.

David Murdoch
źródło
Dobry link! Zmodyfikowałem test perf. Wydaje się, że użycie wyrażenia regularnego spowalnia niektóre testy? Chyba że coś zepsułem, użycie === lub! == na wszystkich testach wydaje się robić, a + usuń najlepszą opcję. jsperf.com/removing-event-props/3
Adam
Oprócz obciążenia związanego z pobieraniem i uruchamianiem dodatkowego kodu? Nie.
David Murdoch
Po co porównywać różne rozwiązania, gdy są uruchamiane tylko raz? W tym przypadku należy docenić prostotę i mniej kodu niż wydajność. Jeśli chcemy obu, to po prostu zastąp tablicę wartościami, które nie mają warstwy X / warstwy Y? Sprawdź ławkę perf (która i tak nie ma znaczenia).
mekwall
28

Najkrótszym rozwiązaniem tego jest jeden linijka:

$.event.props = $.event.props.join('|').replace('layerX|layerY|', '').split('|');
mekwall
źródło
1
@Louis Nie znam Prototype.js, więc nie mogę wiele pomóc, ale myślę, że poprawka powinna być bardzo podobna do tej. Zadaj pytanie i mam nadzieję, że ktoś wie :)
mekwall
21

Ogromna liczba tych wiadomości (właśnie otrzymałem ich 80000 podczas korzystania z Gmaila) jest rzeczywiście błędem w Chrome.

Powinieneś oznaczyć gwiazdkę na Chromium .

törzsmókus
źródło
1
Do Twojej wiadomości problem został rozwiązany przez prawie rok (tj. Ostrzeżenie zostało usunięte z WebKit). Jeśli nadal występuje ten problem, rozważ uaktualnienie przeglądarki.
törzsmókus
14

Przyczyną mogą być również rozszerzenia Chrome, więc sprawdź je, jeśli aktualizacja jQuery nie działa.

Jake
źródło
5

Oto kolejna poprawka dla jednej linii, bez zastępowania oryginalnej instancji $ .event.props (która może, ale nie musi być tablicą), na wszelki wypadek :-)

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

Użyłem tego po wywołaniu dowolnego zdarzenia:

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

To działało dla mnie, nie mam żadnych komunikatów ostrzegawczych, ponieważ wykonałem tę łatkę w moim kodzie.

jca258
źródło
4

Oprócz problemów z konfiguracją wymienionych w innych odpowiedziach, ten błąd może zostać wywołany przez prosty błąd we własnym kodzie: zapomnienie „#” z selektora jQuery ID.

Miałem wygląd kodu

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

(brakuje # przed „zestawem danych”)

Oprócz (oczywiście) awarii, wywołał ten komunikat o błędzie w Chrome.

Xgretsch
źródło
3

Natrafiłem na ten problem we własnym kodzie. Okazuje się, że iterowałem wszystkie właściwości obiektu zdarzenia jako część używanego narzędzia do debugowania / inspekcji. W tym konkretnym przypadku użyłem $ .extend jQuery do sklonowania obiektu do późniejszej kontroli, ale wierzę, że każda ze standardowych technik iteracji w różnych zestawach narzędzi również wywołałaby ostrzeżenie.

Wspominam o tym tutaj, ponieważ moja pierwotna myśl o zwykłym przeszukaniu bazy kodu w poszukiwaniu instancji warstwy X lub warstwy Y nie pomogła - do właściwości odwoływano się ogólnie, a nie według nazwy.

Kris Giesing
źródło