Проблемы WebKit с event.layerX и event.layerY


507

Я только что заметил, что я получаю тонны устаревших предупреждений в последней сборке Chrome.

event.layerX и event.layerY не работают и не рекомендуются в WebKit. Они будут сняты с двигателя в ближайшее время.

Похоже, jQuery все испортил.

Я использую: jquery-1.6.1.min.js.

Поможет ли это обновить до последней версии jQuery или еще не исправлено, или это ошибка Chrome, или это что-то еще?

PS

Я не могу показать вам код, потому что я думаю, что это общая ошибка, но я подозреваю, что предупреждения появляются, когда я пытаюсь получить доступ к объекту jQuery или когда jQuery пытается получить доступ к layerX / layerY (ну, я вполне уверен, что это так, учитывая ошибка: P).

jQuery, вероятно, копирует эти свойства в объект jQuery.

Так...

В чем дело?

РЕДАКТИРОВАТЬ

jQuery 1.7 вышел и исправляет эту проблему.

Узнайте больше на их блоге, здесь .


1
Просто заметил это и сегодня.
— Dusda

5
jQuery 1.7 все еще выбрасывает предупреждение, кажется, еще не исправлено .......
— Криш

3
@ Stuart.Sklinar Я не знаю, кодируете ли вы также в PHP, но если вы это сделаете, я уверен, что вы также используете @для подавления ошибок.
— PeeHaa

1
chrome группирует только похожие ошибки, если между ними не было промежуточных ошибок. Таким образом, проблема в том, что использование консоли для отладки становится более громоздким. Это раздражает, но пока я не думаю, что какая-либо функциональность jQuery действительно нарушена
— carpii

2
Стоит отметить, для потомков, что WebKit ( ошибка 86264 ) отступил от своего решения принизить layerXи layerY, по крайней мере , пока они не дают более тщательного рассмотрения. Стоит также отметить, что IE недавно был добавлен layerX и layerYпосле того, как его не было до версии 9. Я предполагаю, что эти свойства не исчезнут - по крайней мере, пока не появится подходящая замена W3C, которая будет не скоро. Предупреждения исчезли в последних версиях WebKit.
— Натан Уолл

Ответы:


463

В чем дело!?

msgstr "jQuery, вероятно, копирует эти свойства в объект jQuery." Вы абсолютно правы, так что, похоже, вы уже знаете! :)

Надеюсь, jQuery обновит свой код, чтобы перестать касаться этого, но в то же время WebKit должен был знать об этом лучше, чем записывать предупреждение об устаревании события (по крайней мере, на мой взгляд). Один обработчик перемещения мыши и ваша консоль взрывается. :)

Вот недавний билет jQuery: http://bugs.jquery.com/ticket/10531

ОБНОВЛЕНИЕ: Это исправлено сейчас, если вы обновляетесь до jQuery 1.7.

Обратите внимание, что если обновление jQuery не решит проблему для вас, это может быть связано с используемыми расширениями / плагинами, как сказал Джейк в своем ответе .


8
@Neal в jQuery 1.7 будет удален по заявке
— датчик

7
Я все еще вижу их в JQ 1.7
— Виктор С

22
И я все еще вижу их в JQ 1.7.1. Так что, похоже, не исправлено.
— Папараппа

3
Я согласен с 1.7.1, предупреждения исчезли! Спасибо.
— Jk_

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
— Адам

Помимо затрат на загрузку и запуск дополнительного кода? Нет.
— Дэвид Мердок

Какой смысл сравнивать различные решения, когда они запускаются только один раз? В этом случае следует ценить простоту и меньший объем кода по сравнению с производительностью. Если мы хотим и то и другое, почему бы просто не заменить массив значениями, в которых отсутствует layerX / layerY? Посмотрите на скамейку для перфорирования (что в любом случае не имеет значения).
— Мекволл

28

Самое короткое решение для этого - это одна строка:

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

1
@ Луис Я не знаком с prototype.js, поэтому я не могу помочь, но я думаю, что исправление должно быть очень похоже на это.
— Отправьте

21

Огромное количество этих сообщений (я только что получил 80000 при использовании gmail) действительно является ошибкой в ​​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 не помогла - на свойство ссылались в общем, а не по имени.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.