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

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

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

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

Я: jquery-1.6.1.min.js.

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

PS

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

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

Так...

что происходит?

редактировать

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

подробнее в своем блоге, здесь.

9 ответов


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

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

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

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

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

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


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

обновление

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


самым коротким решением для этого является этот однострочный:

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

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

вы должны звезды выпуск на Chromium.


Это также может быть вызвано расширениями Chrome, поэтому проверьте их, если обновление jQuery не работает.


вот еще одно исправление одной строки, без замены исходного экземпляра $.событие.реквизит (который может быть или не быть массивом), на всякий случай: -)

$.each(["layerX","layerY"], function(i,v) { if((i=p.indexOf(v)) > -1) $.fn.splice.call($.event.props,i,1) })

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

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

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


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

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

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

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

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


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

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