Problemi di WebKit con event.layerX ed event.layerY


507

Ho appena notato che ricevo tonnellate di avvisi deprecati nell'ultima build (canaria) di Chrome.

event.layerX e event.layerY sono rotti e deprecati in WebKit. Saranno rimossi dal motore nel prossimo futuro.

Sembra che jQuery stia rovinando tutto.

Sto utilizzando: jquery-1.6.1.min.js.

Aiuterebbe l'aggiornamento all'ultima versione di jQuery o non è ancora stato risolto o è un bug di Chrome o è qualcos'altro.

PS

Non riesco a mostrarti il ​​codice perché penso che sia un errore generale, ma sospetto che gli avvisi vengano emessi quando provo ad accedere a un oggetto jQuery o quando jQuery tenta di accedere a layerX / layerY (beh, sono abbastanza sicuro che sia il caso considerando il errore: P).

jQuery probabilmente copia quelle proprietà nell'oggetto jQuery.

Così...

Cosa sta succedendo?

MODIFICARE

jQuery 1.7 è uscito e risolve questo problema.

Leggi di più sul loro blog, qui .


1
L'ho notato anche oggi.
Dusda,

5
jQuery 1.7 viene ancora lanciato l'avviso non sembra ancora risolto .......
Krish,

3
@ Stuart.Sklinar Non so se codifichi anche in PHP, ma se lo fai sono abbastanza sicuro che usi anche @per sopprimere gli errori.
PeeHaa,

1
chrome raggruppa errori simili solo se non ci sono stati errori intermedi tra. Quindi il problema è davvero, che rende più complicato utilizzare la console per il debug. È irritante, ma per ora non credo che nessuna funzionalità jQuery sia effettivamente rotta
carpii,

2
Vale la pena notare, per i posteri, che WebKit ( bug 86264 ) si è ritirato dalla sua decisione di deprecare layerXe layerY, almeno fino a quando non lo hanno tenuto in maggiore considerazione. Vale anche la pena notare che IE ha aggiunto di recente layerXe layerYdopo non averlo fino alla versione 9. La mia ipotesi è che queste proprietà non andranno via - almeno fino a quando non vi sarà una sostituzione W3C adatta, che non sarà presto. Gli avvisi sono spariti nelle versioni recenti di WebKit.
Nathan Wall,

Risposte:


463

Cosa sta succedendo!?

"jQuery probabilmente copia quelle proprietà nell'oggetto jQuery." Hai esattamente ragione, quindi sembra che tu lo sappia già! :)

Speriamo che jQuery aggiornerà il loro codice per smettere di toccarlo, ma allo stesso tempo WebKit avrebbe dovuto sapere meglio che registrare un avviso di deprecazione su un evento (almeno secondo me). Un gestore mousemove e la tua console esplode. :)

Ecco un recente biglietto jQuery: http://bugs.jquery.com/ticket/10531

AGGIORNAMENTO: risolto ora se si aggiorna a jQuery 1.7.

Si noti che se l'aggiornamento di jQuery non risolve il problema, potrebbe avere a che fare con estensioni / plug-in usati, come indicato da Jake nella sua risposta .


8
@Neal in jQuery 1.7 verrà rimosso in base al ticket
sensore

7
Li vedo ancora nel jQ 1.7
Victor S

22
E li vedo ancora nel jQ 1.7.1. Quindi non sembra essere risolto.
Paparappa,

3
Sono d'accordo con 1.7.1, gli avvisi sono scomparsi! Grazie.
Jk_

3
Ho disabilitato tutte le mie estensioni e ricevo ancora questi avvisi con 1.7.2
basZero

74

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

La correzione temporanea consiste nell'eseguire questo codice prima di eseguire qualsiasi associazione di eventi tramite 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;
}());

AGGIORNARE

Guarda gli ultimi test delle prestazioni per scoprire qual è il modo più veloce per rimuovere gli oggetti di scena dell'evento.


Buon collegamento! Ho modificato il test perf. L'uso di un regex sembrava rallentare alcuni dei test? A meno che non abbia rotto qualcosa, usando === o! == su tutti i test sembra fare + eliminare l'opzione migliore. jsperf.com/removing-event-props/3
Adam A

Oltre al sovraccarico di scaricare ed eseguire il codice aggiuntivo? No.
David Murdoch,

Qual è il punto di riferimento delle diverse soluzioni quando vengono eseguite una sola volta? Semplicità e meno codice rispetto alle prestazioni è ciò che dovrebbe essere valutato in questo caso. Se vogliamo entrambi, perché non sostituire semplicemente l'array con i valori che mancano layerX / layerY? Dai un'occhiata alla panca perf (che non importa comunque).
Mekwall,

28

La soluzione più breve a questo è questo one-liner:

$.event.props = $.event.props.join('|').replace('layerX|layerY|', '').split('|');

1
@Louis Non ho familiarità con prototype.js, quindi non posso essere di grande aiuto, ma immagino che la correzione dovrebbe essere molto simile a questa. Posta una domanda e spero che qualcuno lo sappia :)
Mekwall,

21

L'enorme quantità di questi messaggi (ne ho appena ricevuti 80000 mentre utilizzo Gmail) è davvero un bug in Chrome.

Dovresti iniziare il problema su Chromium .


1
Cordiali saluti, il problema è stato risolto per quasi un anno (ovvero l'avviso è stato rimosso da WebKit). Se il problema persiste, prendi in considerazione l'aggiornamento del browser.
törzsmókus

14

Può anche essere causato dalle estensioni di Chrome, quindi controllali se l'aggiornamento jQuery non funziona.


5

Ecco un'altra correzione di una riga, senza sostituire l'istanza originale di $ .event.props (che può essere o meno un array), nel caso in cui :-)

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

5

L'ho usato dopo aver chiamato qualsiasi evento:

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

Ha funzionato per me, non ho messaggi di avvertimento da quando ho creato questa patch sul mio codice.


4

Oltre ai problemi di configurazione elencati nelle altre risposte, questo errore può essere innescato da un semplice errore nel tuo codice: dimenticando '#' in da un selettore ID jQuery.

Avevo il codice

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

(manca il # davanti al "datenotset")

Oltre a non funzionare (ovviamente), ha innescato questo messaggio di errore in Chrome.


3

Ho riscontrato questo problema nel mio codice. Si scopre che stavo iterando su tutte le proprietà di un oggetto evento come parte di uno strumento di debug / ispezione che stavo usando. In questo caso specifico stavo usando $ .extend di jQuery per clonare l'oggetto per successive ispezioni, ma credo che anche qualsiasi delle tecniche di iterazione standard nei vari toolkit avrebbe innescato l'avvertimento.

Lo menziono qui perché il mio pensiero iniziale di cercare semplicemente nella base di codice le istanze di layerX o layerY non ha aiutato: la proprietà veniva referenziata genericamente, non per nome.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.