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

476

Я только заметил, что получаю тонну устаревших предупреждений в последней (канареечной) сборке 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
    Просто заметил это и сегодня.
  • 0
    Предупреждение все еще распространено в Chrome ... однако сообщение не видно в Safari
Показать ещё 7 комментариев
Теги:
google-chrome
webkit

9 ответов

438
Лучший ответ

Что происходит!?

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

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

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

UPDATE: теперь это исправлено, если вы обновляетесь до jQuery 1.7.

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

  • 0
    Примечание. Билет Jquery теперь регистрирует это как закрытое: исправлено 2 дня назад, поэтому последний Jquery должен удалить эти предупреждения из консоли!
  • 0
    @ MemeDeveloper ... rrrg, когда это будет?
Показать ещё 14 комментариев
70

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;
}());

UPDATE

Посмотрите последние тесты производительности, чтобы узнать, какой самый быстрый способ - удалить реквизиты событий.

  • 0
    Хорошая ссылка! Я изменил тест на перф. Использование регулярных выражений, похоже, замедлило некоторые тесты? Если я что-то не сломал, использование === или! == во всех тестах, похоже, пока делает + удаляет лучший вариант. jsperf.com/removing-event-props/3
  • 0
    Есть ли побочные эффекты?
Показать ещё 2 комментария
28

Самое короткое решение этого - это однострочный:

$.event.props = $.event.props.join('|').replace('layerX|layerY|', '').split('|');
  • 0
    Теперь все, что мне нужно, это то же самое для prototype.js ...
  • 1
    @ Луис Я не знаком с prototype.js, поэтому я не могу помочь, но я думаю, что исправление должно быть очень похоже на это. Отправьте вопрос и надеюсь, кто-то знает :)
20

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

Вам следует нажать кнопку на Chromium.

  • 1
    К вашему сведению, проблема была исправлена почти год (т.е. предупреждение было удалено из WebKit). Если вы все еще видите эту проблему, рассмотрите возможность обновления вашего браузера.
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.

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

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

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

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

3

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню