web-dev-qa-db-fra.com

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

Je viens de remarquer que je reçois des tonnes d’avertissements déconseillés dans la dernière version (canari) de Chrome.

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

On dirait que jQuery est en train de tout gâcher.

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

Est-il utile de mettre à niveau vers la dernière version de jQuery ou n'est-ce pas encore résolu ou s'agit-il d'un bogue Chrome ou est-ce autre chose?.

PS

Je ne peux pas vous montrer de code car je pense que c'est une erreur générale, mais je soupçonne que des avertissements sont émis lorsque j'essaie d'accéder à un objet jQuery ou lorsque jQuery tente d'accéder à layerX/layerY (enfin, je suis presque sûr que c'est le cas erreur: P).

jQuery copie probablement ces propriétés dans l'objet jQuery.

Alors...

Que se passe-t-il?

EDIT

jQuery 1.7 est sorti et corrige ce problème.

En savoir plus sur leur blog, ici .

507
PeeHaa

Que se passe-t-il!?

"jQuery copie probablement ces propriétés dans l'objet jQuery." Vous avez tout à fait raison, vous semblez donc le savoir déjà! :)

J'espère que jQuery mettra à jour leur code pour ne plus toucher à cela, mais WebKit aurait dû savoir qu'il ne fallait pas enregistrer un avertissement de dépréciation sur un événement (du moins à mon avis). Un manipulateur de souris et votre console explose. :)

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

UPDATE: Ceci est résolu maintenant si vous effectuez une mise à niveau vers jQuery 1.7.

Veuillez noter que si la mise à niveau de jQuery ne résout pas le problème, le problème peut avoir un rapport avec les extensions/plugins utilisés, comme Jake l'a déclaré dans son réponse .

463
Adam A

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

Le correctif temporaire consiste à exécuter ce code avant toute 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;
}());

UPDATE

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

74
David Murdoch

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

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

L'énorme quantité de ces messages (Je viens de recevoir 80000 d'entre eux en utilisant Gmail) est en effet un bug dans Chrome.

Vous devriez commencer le numéro sur le chrome .

21
törzsmókus

Cela peut également être causé par les extensions Chrome. Vérifiez-les donc si la mise à jour de jQuery ne fonctionne pas.

14
Jake

J'ai utilisé cela 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.

5
jca258

Voici un autre correctif d’une 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) })
5
DUzun

Outre les problèmes de configuration répertoriés dans les autres réponses, cette erreur peut être provoquée par une simple erreur dans votre propre code: vous oubliez le "#" dans le sélecteur d'ID jQuery.

J'avais un code ressemblant à

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

(il manque le # devant le "datenotset")

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

4
xgretsch

J'ai rencontré ce problème dans mon propre code. Il s’est avéré que j’étais en train de parcourir toutes les propriétés d’un objet événement dans le cadre d’un outil de débogage/d’inspection que j’utilisais. Dans ce cas particulier, j’utilisais le paramètre $ .extend de jQuery pour cloner l’objet en vue d’une inspection ultérieure, mais je pense que l’une quelconque des techniques d’itération standard des différents kits d’outil aurait également déclenché l’avertissement.

Je le mentionne ici parce que ma pensée initiale de simplement rechercher dans la base de code les occurrences 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 son nom.

3
Kris Giesing