Проблемы 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.