Problemas do WebKit com event.layerX e event.layerY

507

Acabei de perceber que recebo toneladas de avisos obsoletos na versão mais recente (canária) do Chrome.

event.layerX e event.layerY estão quebrados e preteridos no WebKit. Eles serão removidos do motor em um futuro próximo.

Parece que o jQuery está estragando tudo.

Eu estou usando: jquery-1.6.1.min.js.

Ajudaria a atualizar para a versão mais recente do jQuery ou ainda não foi corrigido ou é um bug do Chrome ou é outra coisa.

PS

Não consigo mostrar o código porque acho que é um erro geral, mas suspeito que os avisos são lançados quando tento acessar um objeto jQuery ou quando o jQuery tenta acessar o layerX / layerY (bem, tenho certeza de que é o caso, considerando o erro: P).

O jQuery provavelmente copia essas propriedades no objeto jQuery.

Assim...

O que está acontecendo?

EDITAR

O jQuery 1.7 foi lançado e corrige esse problema.

Leia mais em seu blog, aqui .

PeeHaa
fonte
1
Apenas notei isso hoje também.
Dusda 20/10
5
jQuery 1.7 ainda é lançar o aviso ainda não parece fixo .......
Krish
3
@ Stuart.Sklinar Não sei se você também codifica em PHP, mas se o fizer, tenho certeza de que também usará @para suprimir erros.
PeeHaa
1
o chrome apenas agrupa erros semelhantes se não houver erros intermediários. Portanto, o problema é realmente, que torna mais complicado o uso do console para depuração. Sua um irritante, mas ainda eu não acho que qualquer funcionalidade jQuery é realmente quebrado
carpii
2
Vale a pena notar, para a posteridade, que o WebKit ( bug 86264 ) recuou de sua decisão de depreciar layerXe layerY, pelo menos até que eles considerem com mais cuidado. Também vale a pena notar que o IE foi adicionado recentemente layerXe layerYdepois de não o ter até a versão 9. Meu palpite é que essas propriedades não vão desaparecer - pelo menos até que haja uma substituição adequada do W3C, o que não será em breve. Os avisos desapareceram nas versões recentes do WebKit.
Nathan parede

Respostas:

463

O que está acontecendo!?

"o jQuery provavelmente copia essas propriedades no objeto jQuery." Você está exatamente correto, então parece que você já sabe! :)

Espero que o jQuery atualize seu código para parar de tocá-lo, mas, ao mesmo tempo, o WebKit deveria saber melhor do que registrar um aviso de descontinuação em um evento (pelo menos na minha opinião). Um manipulador de mouse e seu console explode. :)

Aqui está um ticket recente do jQuery: http://bugs.jquery.com/ticket/10531

ATUALIZAÇÃO: Isso é corrigido agora se você atualizar para o jQuery 1.7.

Observe que, se a atualização do jQuery não resolver o problema, pode ter algo a ver com extensões / plugins usados, como Jake afirmou em sua resposta .

Adam A
fonte
8
O @Neal no jQuery 1.7 será removido de acordo com o ticket
sensor
7
Ainda os vejo no jQ 1.7 #
Victor S
22
E ainda os vejo no jQ 1.7.1. Portanto, não parece estar consertado.
Paparappa
3
Concordo com 1.7.1, avisos desapareceram! Obrigado.
Jk_
3
Tenho deficientes todas as minhas extensões e eu ainda obter esses avisos com 1.7.2
basZero
74

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

A correção temporária é executar esse código antes de fazer qualquer ligação de evento 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;
}());

ATUALIZAR

Veja os testes de desempenho mais recentes para descobrir qual é a maneira mais rápida de remover os acessórios do evento.

David Murdoch
fonte
Bom link! Eu modifiquei o teste de desempenho. O uso de uma regex pareceu desacelerar alguns dos testes? A menos que eu quebrei algo, usar === ou! == em todos os testes parece fazer enquanto + excluir a melhor opção. jsperf.com/removing-event-props/3 #
Adam A
Além da sobrecarga de baixar e executar o código adicional? Não.
David Murdoch
Qual é o objetivo de comparar as diferentes soluções quando elas são executadas apenas uma vez? Simplicidade e menos código sobre desempenho é o que deve ser avaliado nesse caso. Se queremos os dois, por que não substituir a matriz pelos valores que faltam na camadaX / camadaY? Confira o banco de perf (o que não importa de qualquer maneira).
21712 mekwall
28

A solução mais curta para isso é esta linha:

$.event.props = $.event.props.join('|').replace('layerX|layerY|', '').split('|');
mekwall
fonte
1
@ Louis Não estou familiarizado com prototype.js, então não posso ajudar muito, mas acho que a correção deve ser muito semelhante a isso. Postar uma pergunta e espero que alguém sabe :)
mekwall
21

A enorme quantidade dessas mensagens (acabei de receber 80000 delas enquanto uso o gmail) é realmente um bug no Chrome.

Você deve marcar o problema com estrela no Chromium .

törzsmókus
fonte
1
Para sua informação, o problema foi corrigido por quase um ano (ou seja, o aviso foi removido do WebKit). Se você ainda vir esse problema, considere atualizar seu navegador.
törzsmókus
14

Também pode ser causado por extensões do Chrome; verifique-as se a atualização do jQuery não funcionar.

Jake
fonte
5

Aqui está outra correção de uma linha, sem substituir a instância original de $ .event.props (que pode ou não ser uma matriz), apenas no caso de :-)

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

Eu usei isso depois de chamar qualquer evento:

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

Isso funcionou para mim, não tenho mensagens de aviso desde que fiz esse patch no meu código.

jca258
fonte
4

Além dos problemas de configuração listados nas outras respostas, esse erro pode ser desencadeado por um erro simples no seu próprio código: esquecendo o '#' de um seletor de jQuery ID.

Eu tinha código parecido com

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

(perdendo o # na frente do "conjunto de dados")

Além de (obviamente) não funcionar, essa mensagem de erro foi acionada no Chrome.

xgretsch
fonte
3

Eu encontrei esse problema no meu próprio código. Acontece que eu estava iterando sobre todas as propriedades em um objeto de evento como parte de uma ferramenta de depuração / inspeção que eu estava usando. Nesse caso em particular, eu estava usando o $ .extend do jQuery para clonar o objeto para inspeção posterior, mas acredito que qualquer uma das técnicas de iteração padrão nos vários kits de ferramentas também teria acionado o aviso.

Mencionei aqui porque meu pensamento inicial de simplesmente pesquisar na base de código por instâncias de layerX ou layerY não ajudou - a propriedade estava sendo referenciada genericamente, não pelo nome.

Kris Giesing
fonte