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

507

Je viens de remarquer que je reçois des tonnes d'avertissements obsolètes 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 avenir proche.

On dirait que jQuery fout les choses.

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

Cela aiderait-il à passer à la dernière version de jQuery ou n'est-il pas encore corrigé ou s'agit-il d'un bogue Chrome ou s'agit-il d'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 les avertissements sont lancés lorsque j'essaie d'accéder à un objet jQuery ou lorsque jQuery essaie d'accéder au layerX / layerY (eh bien je suis sûr que c'est le cas compte tenu de la erreur: P).

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

Donc...

Que se passe-t-il?

ÉDITER

jQuery 1.7 est sorti et résout ce problème.

En savoir plus sur leur blog, ici .

PeeHaa
la source
1
Je viens de le remarquer aussi aujourd'hui.
Dusda
5
jQuery 1.7 est toujours jeter l'avertissement ne semble pas encore résolu .......
Krish
3
@ Stuart.Sklinar Je ne sais pas si vous codez également en PHP, mais si vous le faites, je suis sûr que vous l'utilisez également @pour supprimer les erreurs.
PeeHaa
1
Chrome ne regroupe les erreurs similaires que s'il n'y a pas eu d'erreurs intermédiaires entre les deux. Donc, le problème est vraiment, qu'il est plus difficile d'utiliser la console pour le débogage. C'est un irritant, mais pour l'instant je ne pense pas qu'une fonctionnalité jQuery soit réellement cassée
carpii
2
Il convient de noter, pour la postérité, que WebKit ( bug 86264 ) a reculé de sa décision de déprécier layerXet layerY, au moins jusqu'à ce qu'il y réfléchisse plus attentivement. Il convient également de noter qu'IE a récemment ajouté layerX et layerYaprès ne l'avoir pas jusqu'à la version 9. Je suppose que ces propriétés ne disparaissent pas - au moins jusqu'à ce qu'il y ait un remplacement W3C approprié, qui ne sera pas bientôt. Les avertissements ont disparu dans les versions récentes de WebKit.
Nathan Wall

Réponses:

463

Que se passe-t-il!?

"jQuery copie probablement ces propriétés dans l'objet jQuery." Vous avez exactement raison, il semble donc que vous le sachiez déjà! :)

J'espère que jQuery mettra à jour leur code pour ne plus y toucher, mais en même temps 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 déplacement de souris et votre console explosent. :)

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

MISE À JOUR: Ceci est résolu maintenant si vous mettez à niveau vers 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 déclaré dans sa réponse .

Adam A
la source
8
@Neal dans jQuery 1.7, il sera supprimé selon le ticket
capteur
7
Je les vois toujours dans jQ 1.7
Victor S
22
Et je les vois toujours dans jQ 1.7.1. Il ne semble donc pas être réglé.
Paparappa
3
Je suis d'accord avec 1.7.1, les avertissements ont disparu! Merci.
Jk_
3
J'ai désactivé toutes mes extensions et je reçois toujours ces avertissements avec 1.7.2
basZero
74

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

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

MISE À JOUR

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

David Murdoch
la source
Bon lien! J'ai modifié le test de perf. L'utilisation d'une expression régulière a semblé ralentir certains des tests? Sauf si j'ai cassé quelque chose, l'utilisation de === ou! == sur tous les tests semble faire en + supprimant la meilleure option. jsperf.com/removing-event-props/3
Adam A
Outre les frais généraux de téléchargement et d'exécution du code supplémentaire? Nan.
David Murdoch
Quel est l'intérêt de comparer les différentes solutions lorsqu'elles ne sont exécutées qu'une seule fois? La simplicité et moins de code sur les performances est ce qui devrait être évalué dans ce cas. Si nous voulons les deux, pourquoi ne pas simplement remplacer le tableau par les valeurs qui manquent layerX / layerY? Découvrez le banc de perf (qui n'a pas d'importance de toute façon).
mekwall
28

La solution la plus courte à ce problème est cette doublure:

$.event.props = $.event.props.join('|').replace('layerX|layerY|', '').split('|');
mekwall
la source
1
@Louis Je ne connais pas prototype.js donc je ne peux pas être d'une grande aide, mais je suppose que le correctif devrait être très similaire à cela. Postez une question et espérez que quelqu'un le sait :)
mekwall
21

L'énorme quantité de ces messages (je viens d'en recevoir 80000 en utilisant gmail) est en effet un bug dans Chrome.

Vous devriez lancer le problème sur Chrome .

törzsmókus
la source
1
Pour info, le problème a été corrigé depuis près d'un an (c'est-à-dire que l'avertissement a été supprimé de WebKit). Si ce problème persiste, envisagez de mettre à niveau votre navigateur.
törzsmókus
14

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

Jake
la source
5

Voici un autre correctif d'une ligne, sans remplacer l'instance d'origine de $ .event.props (qui peut ou non être 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) })
DUzun
la source
5

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 patch sur mon code.

jca258
la source
4

En plus des 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: oublier le «#» dans un sélecteur d'ID jQuery.

J'avais un code ressemblant

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

(manque le # devant le "datenotset")

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

xgretsch
la source
3

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

Je le mentionne ici parce que ma pensée initiale de simplement rechercher dans la base de code des instances de layerX ou layerY n'a pas aidé - la propriété était référencée de manière générique, pas par son nom.

Kris Giesing
la source