Проблемы с WebKit с event.layerX и event.layerY
Я только заметил, что получаю тонну устаревших предупреждений в последней (канареечной) сборке 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
Что происходит!?
"jQuery, вероятно, копирует эти свойства в объект jQuery." Ты точно прав, так что, похоже, ты уже знаешь!:)
Надеюсь, что jQuery обновит свой код, чтобы не дотрагиваться до этого, но в то же время WebKit должен был знать лучше, чем регистрировать предупреждение о задержке на мероприятии (по крайней мере, на мой взгляд). Один mousemove обработчик и ваша консоль взрывается.:)
Вот недавний билет jQuery: http://bugs.jquery.com/ticket/10531
UPDATE: теперь это исправлено, если вы обновляетесь до jQuery 1.7.
Обратите внимание, что если обновление jQuery не поможет вам решить проблему, возможно, что-то связано с используемыми расширениями/плагинами, как заявил Джейк в своем answer.
Ответ 2
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
Посмотрите последние тесты производительности, чтобы узнать, какой самый быстрый способ - удалить реквизиты событий.
Ответ 3
Самое короткое решение этого - это однострочный:
$.event.props = $.event.props.join('|').replace('layerX|layerY|', '').split('|');
Ответ 4
Огромное количество этих сообщений (у меня только 80000 из них при использовании gmail) действительно является ошибкой в Chrome.
Вам следует нажать кнопку на Chromium.
Ответ 5
Это также может быть вызвано расширениями Chrome, поэтому проверьте их, если обновление jQuery не работает.
Ответ 6
Я использовал это после вызова любого события:
$.event.props.splice($.event.props.indexOf("layerY"),1);
$.event.props.splice($.event.props.indexOf("layerX"),1);
Это сработало для меня, у меня нет предупреждающих сообщений, так как я сделал этот патч в своем коде.
Ответ 7
Вот еще одно исправление одной строки, не заменяя исходный экземпляр $.event.props(который может быть или не быть массивом), на всякий случай: -)
$.each(["layerX","layerY"], function(i,v) { if((i=p.indexOf(v)) > -1) $.fn.splice.call($.event.props,i,1) })
Ответ 8
Как и проблемы с конфигурацией, перечисленные в других ответах, эта ошибка может быть вызвана простой ошибкой в вашем собственном коде: забыть "#" из селектора идентификаторов jQuery.
У меня был код, похожий на
$('datenotset_2341').click(function(){
....etc....
});
(пропускает # перед "datenotset" )
Как и (очевидно) не работает, он вызвал это сообщение об ошибке в Chrome.
Ответ 9
Я столкнулся с этой проблемой в своем собственном коде. Оказывается, я выполнял итерацию по всем свойствам объекта события как часть инструмента отладки/проверки, который я использовал. В этом конкретном случае я использовал jQuery $.extend для клонирования объекта для последующей проверки, но я считаю, что любой из стандартных методов итерации в различных инструментариях также вызвал бы предупреждение.
Я упоминаю это здесь, потому что моя первоначальная мысль о простом поиске базы кода для экземпляров layerX или layerY не помогла - свойство ссылалось в общем случае не по имени.