WebKit与event.layerX和event.layerY有关的问题


507

我刚刚注意到,在最新版(金丝雀)的Chrome浏览器中,我收到了很多不推荐使用的警告。

WebKit中的event.layerX和event.layerY已损坏和弃用。它们将在不久的将来从引擎中删除。

看起来jQuery搞砸了。

我正在使用:jquery-1.6.1.min.js

它是否有助于升级到最新的jQuery版本,或者它是否已修复,或者是Chrome浏览器错误,还是其他原因。

聚苯乙烯

我无法向您显示代码,因为我认为这是一个普遍错误,但是我怀疑当我尝试访问jQuery对象或jQuery尝试访问layerX / layerY时会抛出警告(嗯,我很确定这是考虑到错误:P)。

jQuery可能会将这些属性复制到jQuery对象中。

所以...

这是怎么回事?

编辑

jQuery 1.7已经发布并解决了此问题。

在这里,在他们的博客上阅读更多内容。


1
今天也刚刚注意到这一点。
2011年

5
jQuery 1.7仍然抛出警告,似乎尚未修复.......
Krish 2012年

3
@ Stuart.Sklinar我不知道您是否也使用PHP编写代码,但是如果您这样做,我很确定您也可以使用它@来抑制错误。
PeeHaa

1
如果两者之间没有临时错误,则chrome仅将相似的错误分组。因此,问题实际上是,使得使用控制台进行调试变得更加麻烦。它很烦人,但
到目前为止,

2
值得一提的,为后人,WebKit所(错误86264)已经从他们决定弃用退出了layerXlayerY,至少要等到他们给它更仔细的考虑。另外值得一提的是,IE最近添加的 layerX,并layerY没有它,直到9版后,我的猜测是,这些属性不会消失-至少要等到有合适的W3C更换,这不会很快。这些警告在WebKit的最新版本中已消失。
内森·沃尔

Answers:


463

这是怎么回事!?

“ jQuery可能会将这些属性复制到jQuery对象中。” 您完全正确,因此听起来您已经知道了!:)

希望jQuery将更新其代码以使其停止运行,但与此同时WebKit应该比在事件中记录弃用警告更好(至少在我看来)。一个mousemove处理程序和您的控制台爆炸。:)

这是最近的jQuery票证:http : //bugs.jquery.com/ticket/10531

更新:如果您升级到jQuery 1.7,现在已修复。

请注意,如果升级jQuery不能为您解决问题,则可能与使用的扩展名/插件有关,如Jake在其回答中所述


8
@Neal在jQuery 1.7中将根据票证将其删除
传感器

7
我还看到他们在JQ 1.7
维克多小号

22
我仍然在jQ 1.7.1中看到它们。因此,似乎并不固定。
Paparappa 2011年

3
我同意1.7.1,警告消失了!谢谢。
Jk_ 2011年

3
我已经停用所有的扩展和我仍然得到这些警告与1.7.2
basZero

74

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

临时解决方法是在通过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;
}());

更新

查看最新的性能测试以了解最快的方法是删除事件道具。


好的链接!我修改了性能测试。使用正则表达式似乎会减慢某些测试的速度?除非我弄坏了东西,否则在所有测试上使用===或!==似乎会使+删除最佳选择。 jsperf.com/removing-event-props/3
亚当A

除了下载和运行其他代码的开销之外?不。
David Murdoch

当不同解决方案仅运行一次时,对它们进行基准测试有什么意义?在这种情况下,应该重视简单性和较少的代码性能。如果我们都想要,为什么不只用缺少layerX / layerY的值替换数组?检查一下性能测试(无论如何都没关系)。
mekwall

28

最简单的解决方案是这种单线:

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

1
@Louis我对prototype.js并不熟悉,所以我不能提供太多帮助,但是我想此修复应该与此非常相似。发表问题并希望有人知道:)
mekwall

21

这些消息的数量之多(使用gmail时我刚收到80000条消息确实是Chrome中的错误。

您应该在Chromium上给该问题加注星标。


1
仅供参考,该问题已解决了将近一年(即,警告已从WebKit中删除)。如果仍然出现此问题,请考虑升级浏览器。
törzsmókus

14

它也可能是由Chrome扩展引起的,因此,请检查它们是否jQuery更新不起作用。


5

这是另一行修补程序,没有替换$ .event.props的原始实例(可能是也可能不是数组),以防万一:-)

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

5

我在调用任何事件后都使用了此方法:

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

这对我有用,因为我已经在代码中制作了此补丁,所以没有警告消息。


4

除了其他答案中列出的配置问题之外,此错误也可能由您自己的代码中的一个简单错误触发:忘记了jQuery ID选择器中的“#”。

我的代码看起来像

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

(缺少“ datenotset”前面的#)

以及(显然)无法正常工作,它在Chrome中触发了此错误消息。


3

我在自己的代码中遇到了这个问题。事实证明,我正在迭代事件对象的所有属性,这是我使用的调试/检查工具的一部分。在此特定实例中,我使用jQuery的$ .extend克隆对象以供以后检查,但我相信各种工具箱中的任何标准迭代技术也会触发该警告。

我在这里提到它是因为我最初的想法只是简单地在代码库中搜索layerX或layerY实例并没有帮助-该属性是通用引用的,而不是名称。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.