Problemas de WebKit con event.layerX y event.layerY

507

Acabo de notar que recibo toneladas de advertencias obsoletas en la última versión (canaria) de Chrome.

event.layerX y event.layerY están rotos y en desuso en WebKit. Serán retirados del motor en un futuro próximo.

Parece que jQuery está arruinando las cosas.

Estoy usando: jquery-1.6.1.min.js.

¿Sería útil actualizar a la última versión de jQuery o aún no está solucionado o es un error de Chrome o es otra cosa?

PD

No puedo mostrarle el código porque creo que es un error general, pero sospecho que se emiten advertencias cuando intento acceder a un objeto jQuery o cuando jQuery intenta acceder a la capaX / capaY (bueno, estoy bastante seguro de que ese es el caso teniendo en cuenta el error: P)

jQuery probablemente copia esas propiedades en el objeto jQuery.

Entonces...

¿Que esta pasando?

EDITAR

jQuery 1.7 está fuera y soluciona este problema.

Lea más en su blog, aquí .

PeeHaa
fuente
1
Acabo de notar esto hoy, también.
Dusda
55
jQuery 1.7 todavía arroja la advertencia parece que aún no se ha solucionado .......
Krish
3
@ Stuart.Sklinar No sé si también codifica en PHP, pero si lo hace, estoy bastante seguro de que también lo usa @para suprimir errores.
PeeHaa
1
Chrome solo agrupa errores similares si no ha habido errores intermedios en el medio. Entonces, el problema es realmente, que hace que sea más engorroso usar la consola para la depuración. Es irritante, pero aún no creo que ninguna funcionalidad de jQuery esté realmente rota
Carpii
2
Vale la pena señalar, para la posteridad, que WebKit ( error 86264 ) se ha retractado de su decisión de desaprobar layerXy layerY, al menos hasta que lo consideren más detenidamente. También vale la pena señalar que IE agregó recientemente layerXy layerYdespués de no tenerlo hasta la versión 9. Supongo que estas propiedades no desaparecerán, al menos hasta que haya un reemplazo W3C adecuado, que no será pronto. Las advertencias se han ido en versiones recientes de WebKit.
Nathan Wall

Respuestas:

463

¿¡Que esta pasando!?

"jQuery probablemente copia esas propiedades en el objeto jQuery". Estás exactamente en lo correcto, ¡así que parece que ya lo sabes! :)

Esperemos que jQuery actualice su código para dejar de tocar eso, pero al mismo tiempo WebKit debería haber sabido mejor que registrar una advertencia de desaprobación en un evento (al menos en mi opinión). Un controlador de mousemove y su consola explota. :)

Aquí hay un boleto jQuery reciente: http://bugs.jquery.com/ticket/10531

ACTUALIZACIÓN: Esto se soluciona ahora si actualiza a jQuery 1.7.

Tenga en cuenta que si la actualización de jQuery no soluciona el problema por usted, puede tener algo que ver con extensiones / complementos usados ​​como Jake declaró en su respuesta .

Adam A
fuente
8
@Neal en jQuery 1.7 se eliminará de acuerdo con el ticket
sensor
77
Todavía los veo en jQ 1.7
Victor S
22
Y todavía los veo en jQ 1.7.1. Así que no parece estar arreglado.
Paparappa
3
Estoy de acuerdo con 1.7.1, ¡las advertencias desaparecieron! Gracias.
Jk_
3
He inhabilitado todas mis extensiones y todavía recibir estos avisos con 1.7.2
basZero
74

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

La solución temporal es ejecutar este código antes de realizar cualquier enlace de evento a través de 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;
}());

ACTUALIZAR

Vea las últimas pruebas de rendimiento para descubrir cuál es la forma más rápida de eliminar los accesorios del evento.

David Murdoch
fuente
Buen enlace! Modifiqué la prueba de rendimiento. ¿El uso de una expresión regular pareció ralentizar algunas de las pruebas? A menos que rompa algo, usar === o! == en todas las pruebas parece hacer que mientras + elimine la mejor opción. jsperf.com/removing-event-props/3
Adam A
¿Además de la sobrecarga de descargar y ejecutar el código adicional? No
David Murdoch
¿Qué sentido tiene comparar las diferentes soluciones cuando solo se ejecutan una vez? La simplicidad y menos código sobre el rendimiento es lo que debería valorarse en este caso. Si queremos ambos, ¿por qué no simplemente reemplazar la matriz con los valores que carecen de capaX / capaY? Echa un vistazo al banco de perf (que de todos modos no importa).
mekwall
28

La solución más corta a esto es esta línea:

$.event.props = $.event.props.join('|').replace('layerX|layerY|', '').split('|');
Mekwall
fuente
1
@Louis No estoy familiarizado con prototype.js, así que no puedo ser de mucha ayuda, pero supongo que la solución debería ser muy similar a esto. Publica una pregunta y espero que alguien lo sepa :)
mekwall
21

La enorme cantidad de estos mensajes (acabo de recibir 80000 de ellos mientras uso gmail) es de hecho un error en Chrome.

Deberías destacar el tema en Chromium .

törzsmókus
fuente
1
Para su información, el problema se ha solucionado durante casi un año (es decir, la advertencia se ha eliminado de WebKit). Si aún ve este problema, considere actualizar su navegador.
törzsmókus
14

También puede ser causado por extensiones de Chrome, así que verifíquelas si la actualización de jQuery no funciona.

Jake
fuente
5

Aquí hay otra solución de una línea, sin reemplazar la instancia original de $ .event.props (que puede o no ser una matriz), por si acaso :-)

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

He usado esto después de llamar a cualquier evento:

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

Eso funcionó para mí, no tengo mensajes de advertencia desde que hice este parche en mi código.

jca258
fuente
4

Además de los problemas de configuración enumerados en las otras respuestas, este error puede ser provocado por un simple error en su propio código: olvidando el '#' de un selector de jQuery ID.

Tenía un código que parecía

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

(falta el # delante del "conjunto de datos")

Además de (obviamente) no funcionar, activó este mensaje de error en Chrome.

xgretsch
fuente
3

Me encontré con este problema en mi propio código. Resulta que estaba iterando sobre todas las propiedades en un objeto de evento como parte de una herramienta de depuración / inspección que estaba usando. En este caso particular, estaba usando $ .extend de jQuery para clonar el objeto para una inspección posterior, pero creo que cualquiera de las técnicas de iteración estándar en los diversos kits de herramientas también habría activado la advertencia.

Lo menciono aquí porque mi pensamiento inicial de simplemente buscar en la base del código las instancias de layerX o layerY no ayudó: la propiedad estaba siendo referenciada genéricamente, no por su nombre.

Kris Giesing
fuente