jquery browser - Problemas de WebKit con event.layerX y event.layerY




detection javascript (9)

Acabo de darme cuenta de que recibí 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. Se retirarán del motor en un futuro próximo.

Parece que jQuery está arruinando la cosa.

Estoy usando: jquery-1.6.1.min.js .

¿Le ayudaría actualizar a la última versión de jQuery o aún no se ha corregido 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 las advertencias cuando intento acceder a un objeto jQuery o cuando jQuery intenta acceder a layerX / layerY (bueno, estoy bastante seguro de que ese es el caso considerando el error: p).

jQuery probablemente copia esas propiedades en el objeto jQuery.

Asi que...

¿Que esta pasando?

EDITAR

jQuery 1.7 está fuera y soluciona este problema.

Lea más en su blog, aquí .


Answers

La enorme cantidad de estos mensajes (solo obtuve 80000 de ellos mientras uso gmail) es un error en Chrome.

Deberías protagonizar el tema sobre el cromo .


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

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

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 de eventos.


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

Tenía un código que parecía

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

(perdiendo el # en frente del "conjunto de datos")

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


¿¡Que esta pasando!?

"jQuery probablemente copia esas propiedades en el objeto jQuery". Eres exactamente correcto, así que parece que ya lo sabes. :)

Con suerte, jQuery actualizará su código para dejar de tocar eso, pero al mismo tiempo WebKit debería haber sabido que no debe 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 reciente de jQuery: http://bugs.jquery.com/ticket/10531

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

Tenga en cuenta que si actualizar jQuery no soluciona el problema, es posible que tenga algo que ver con las extensiones / complementos usados, tal como Jake declaró en su answer .


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 me funcionó, no tengo mensajes de advertencia desde que hice este parche en mi código.


Me encontré con este problema en mi propio código. Resulta que estaba iterando sobre todas las propiedades de 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 distintos kits de herramientas también habría activado la advertencia.

Lo menciono aquí porque mi idea inicial de simplemente buscar en la base del código las instancias de layerX o layerY no fue de ayuda: se hacía referencia a la propiedad de forma genérica, no por nombre.


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) })

Estaba sufriendo el mismo problema. La corrección de "pantalla de alternancia" de Danorton funcionó para mí cuando se agregó a la función de pasos de mi animación, pero me preocupaba el rendimiento y busqué otras opciones.

En mi circunstancia, el elemento que no se repintaba estaba dentro de un elemento de posición absoluta que, en ese momento, no tenía un índice z. La adición de un índice z a este elemento cambió el comportamiento de Chrome y las repeticiones ocurrieron como se esperaba -> las animaciones se volvieron suaves.

Dudo que esto sea una panacea, imagino que depende de por qué Chrome ha elegido no volver a dibujar el elemento, pero estoy publicando esta solución específica aquí con la ayuda que espera de alguien.

Saludos, Rob

tl; dr >> Intente agregar un índice z al elemento o un elemento primario del mismo.





jquery google-chrome webkit