Проблемы 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 вышел и исправляет эту проблему.

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

PeeHaa
источник
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('|');
mekwall
источник
1
@ Луис Я не знаком с prototype.js, поэтому я не могу помочь, но я думаю, что исправление должно быть очень похоже на это.
Отправьте
21

Огромное количество этих сообщений (я только что получил 80000 при использовании gmail) действительно является ошибкой в ​​Chrome.

Вы должны отметить вопрос о Chromium .

törzsmókus
источник
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) })
DUzun
источник
5

Я использовал это после вызова любого события:

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

Это сработало для меня, у меня нет предупреждений, так как я сделал этот патч для своего кода.

jca258
источник
4

Помимо проблем с конфигурацией, перечисленных в других ответах, эта ошибка может быть вызвана простой ошибкой в ​​вашем собственном коде: забыв '#' из селектора jQuery ID.

У меня был код, похожий на

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

(пропуская # перед "datenotset")

Так же как (очевидно) не работающий, это вызвало это сообщение об ошибке в Chrome.

xgretsch
источник
3

Я столкнулся с этой проблемой в моем собственном коде. Оказывается, я перебирал все свойства объекта события как часть инструмента отладки / проверки, который я использовал. В этом конкретном случае я использовал jQuery $ .extend для клонирования объекта для последующей проверки, но я считаю, что любой из стандартных методов итерации в различных наборах инструментов также вызвал бы предупреждение.

Я упоминаю об этом здесь, потому что моя первоначальная мысль о простом поиске в кодовой базе экземпляров layerX или layerY не помогла - на свойство ссылались в общем, а не по имени.

Крис Гизинг
источник