Проблеми WebKit з event.layerX та event.layerY


507

Щойно я помітив, що в останній (канарній) збірці Chrome я отримую тони застарілих попереджень.

event.layerX та event.layerY порушені та застарілі в WebKit. Вони будуть вилучені з двигуна найближчим часом.

Схоже, jQuery накручує річ.

Я використовую: jquery-1.6.1.min.js.

Чи допоможе оновити до останньої версії jQuery, чи це ще не виправлено, чи це помилка Chrome чи це щось інше.

PS

Я не можу показати вам код, тому що я думаю, що це загальна помилка, але я підозрюю, що попередження кидаються, коли я намагаюся отримати доступ до об’єкта jQuery або коли jQuery намагається отримати доступ до шаруX / layerY (добре, я впевнений, що це так з огляду на помилка: Р).

jQuery, ймовірно, копіює ці властивості в об'єкт jQuery.

Тому...

Що відбувається?

EDIT

jQuery 1.7 не працює і виправляє цю проблему.

Детальніше читайте в їхньому блозі тут .


1
Щойно це помітив і сьогодні.
Дусда

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

Що відбувається!?

"jQuery, ймовірно, копіює ці властивості в об'єкт jQuery." Ви абсолютно правильні, тому це здається, що ви вже знаєте! :)

Сподіваємось, jQuery оновить свій код, щоб перестати торкатися цього, але в той же час WebKit повинен був знати краще, ніж записувати попередження про депресію про подію (принаймні, на мою думку). Один обробник миші та ваша консоль вибухає. :)

Ось останній квиток на jQuery: http://bugs.jquery.com/ticket/10531

ОНОВЛЕННЯ: Це виправлено зараз, якщо ви оновите до jQuery 1.7.

Зауважте, що якщо оновлення jQuery не вирішує проблему, це може мати щось спільне з використаними розширеннями / плагінами, як Джейк заявив у своїй відповіді .


8
@Neal в jQuery 1.7 він буде видалений відповідно до квитка
датчик

7
Я все ще бачу їх у jQ 1.7
Victor S

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
Адам А

Окрім накладних витрат на завантаження та запуск додаткового коду? Ні.
Девід Мердок

Який сенс у порівняльному оцінці різних рішень, коли вони запускаються лише один раз? У цій справі слід цінувати простоту та менше коду над продуктивністю. Якщо ми хочемо обох, чому б просто не замінити масив значеннями, у яких відсутні рівеньX / layerY? Ознайомтеся з парф-лавкою (що все одно не має значення).
mekwall

28

Найкоротшим рішенням цього є такий одноколісний:

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

1
@Louis Я не знайомий з prototype.js, тому я не можу багато допомогти, але я думаю, що виправлення має бути дуже подібним до цього.
Залиште

21

Величезна кількість цих повідомлень (я щойно отримала 80000 з них під час використання gmail) - це справді помилка в Chrome.

Ви повинні зірочку випустити на Chromium .


1
FYI, проблема виправлена ​​майже рік (тобто попередження було видалено з 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

Я зіткнувся з цим питанням у власному коді. Виявляється, я повторював усі властивості об’єкта події як частина інструменту налагодження / перевірки, який я використовував. У цьому конкретному випадку я використовував $ .extend jQuery для клонування об'єкта для подальшої перевірки, але я вважаю, що будь-яка зі стандартних ітераційних методів у різних наборах інструментів також призведе до попередження.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.