Problèmes WebKit avec event.layerX et event.layerY

Je viens de remarquer que je reçois des tonnes d’avertissements obsolètes dans la dernière version (canary) de Chrome.

event.layerX et event.layerY sont cassés et obsolètes dans WebKit. Ils seront retirés du moteur dans un avenir proche.

On dirait que jQuery est en train de foutre en l’air.

J’utilise: jquery-1.6.1.min.js .

Serait-il utile de passer à la dernière version de jQuery ou n’est-ce pas encore corrigé ou s’agit-il d’un bug de Chrome ou est-ce autre chose?

PS

Je ne peux pas vous montrer le code parce que je pense que c’est une erreur générale, mais je soupçonne que les avertissements sont lancés lorsque j’essaie d’accéder à un object jQuery ou lorsque jQuery tente d’accéder au layerX / layerY. erreur: P).

jQuery copie probablement ces propriétés dans l’object jQuery.

Alors…

Que se passe-t-il?

MODIFIER

jQuery 1.7 est sorti et corrige ce problème.

Lisez plus sur leur blog, ici .

Que se passe-t-il!?

“jQuery copie probablement ces propriétés dans l’object jQuery.” Vous avez tout à fait raison, alors vous avez l’impression que vous le savez déjà! 🙂

Espérons que jQuery mettra à jour son code pour ne plus y toucher, mais WebKit aurait dû savoir mieux que de consigner un avertissement de dépréciation sur un événement (du moins à mon avis). Un gestionnaire de mousemove et votre console explose. 🙂

Voici un ticket jQuery récent: http://bugs.jquery.com/ticket/10531

UPDATE: Ceci est corrigé maintenant si vous passez à jQuery 1.7.

Veuillez noter que si la mise à niveau de jQuery ne résout pas le problème pour vous, cela peut avoir quelque chose à voir avec les extensions / plugins utilisés, comme Jake l’a indiqué dans sa réponse .

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

Le correctif temporaire consiste à exécuter ce code avant de faire une liaison d’événement via 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; }()); 

METTRE À JOUR

Consultez les derniers tests de performance pour savoir quel est le moyen le plus rapide de supprimer les accessoires d’événement.

La solution la plus courte à cela est ce one-liner:

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

L’énorme quantité de ces messages (j’en ai juste 80000 en utilisant gmail) est en effet un bogue dans Chrome.

Vous devriez regarder le problème sur Chrome .

Il peut également être causé par des extensions Chrome, alors vérifiez-les si la mise à jour de jQuery ne fonctionne pas.

Voici un autre correctif de ligne, sans remplacer l’instance originale de $ .event.props (qui peut être ou non un tableau), juste au cas où 🙂

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

Je l’ai utilisé après avoir appelé n’importe quel événement:

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

Cela a fonctionné pour moi, je n’ai aucun message d’avertissement depuis que j’ai fait ce correctif sur mon code.

Outre les problèmes de configuration répertoriés dans les autres réponses, cette erreur peut être déclenchée par une simple erreur dans votre propre code: en oubliant le ‘#’ d’un sélecteur d’ID jQuery.

J’avais un code ressemblant à

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

(manquant le # devant le “datenotset”)

En plus (évidemment) de ne pas fonctionner, il a déclenché ce message d’erreur dans Chrome.

J’ai rencontré ce problème dans mon propre code. Il s’est avéré que je parcourais toutes les propriétés d’un object événement dans le cadre d’un outil de débogage / inspection que j’utilisais. Dans ce cas particulier, j’utilisais le $ .extend de jQuery pour cloner l’object pour une inspection ultérieure, mais je pense que toutes les techniques d’itération standard dans les différentes boîtes à outils auraient également déclenché l’avertissement.

Je le mentionne ici parce que mon idée initiale de rechercher simplement la base de code pour des instances de layerX ou de layerY n’a pas aidé – la propriété était référencée de manière générique, pas par nom.