Sự cố WebKit với event.layerX và event.layerY


507

Tôi chỉ nhận thấy rằng tôi nhận được vô số cảnh báo không dùng nữa trong bản dựng mới nhất (hoàng yến) của Chrome.

event.layerX và event.layerY bị hỏng và không dùng nữa trong WebKit. Chúng sẽ được gỡ bỏ khỏi động cơ trong tương lai gần.

Có vẻ như jQuery đang làm hỏng việc.

Tôi đang sử dụng : jquery-1.6.1.min.js.

Nó có giúp nâng cấp lên phiên bản jQuery mới nhất hay chưa được sửa hay là lỗi Chrome hay là lỗi khác.

PS

Tôi không thể hiển thị mã cho bạn vì tôi nghĩ đó là lỗi chung, nhưng tôi nghi ngờ các cảnh báo sẽ bị ném khi tôi cố truy cập vào một đối tượng jQuery hoặc khi jQuery cố gắng truy cập layerX / layerY (tôi khá chắc chắn đó là trường hợp đang xem xét lỗi: P).

jQuery có thể sao chép các thuộc tính đó vào đối tượng jQuery.

Vì thế...

Chuyện gì đang xảy ra vậy?

BIÊN TẬP

jQuery 1.7 đã ra và khắc phục vấn đề này.

Đọc thêm tại blog của họ, ở đây .


1
Chỉ cần chú ý điều này ngày hôm nay, là tốt.
Dusda

5
jQuery 1.7 vẫn đưa ra cảnh báo dường như chưa được khắc phục .......
KR

3
@ Stuart.Sklinar Tôi không biết liệu bạn cũng viết mã bằng PHP hay không, nhưng nếu bạn chắc chắn bạn cũng sẽ sử dụng @để khắc phục lỗi.
PeeHaa

1
chrome chỉ nhóm các lỗi tương tự nếu không có lỗi tạm thời ở giữa. Vì vậy, vấn đề là thực sự, nó làm cho nó trở nên cồng kềnh hơn khi sử dụng bàn điều khiển để gỡ lỗi. Thật khó chịu, nhưng tôi chưa nghĩ rằng bất kỳ chức năng jQuery nào thực sự bị hỏng
carpii

2
Điều đáng chú ý, đối với hậu thế, WebKit ( lỗi 86264 ) đã từ chối quyết định từ chối của họ layerXlayerY, ít nhất là cho đến khi họ cân nhắc kỹ lưỡng hơn. Cũng đáng lưu ý rằng IE gần đây đã thêm layerXlayerYsau khi không có nó cho đến phiên bản 9. Tôi đoán là các thuộc tính này sẽ không biến mất - ít nhất là cho đến khi có một sự thay thế W3C phù hợp, sẽ không sớm xuất hiện. Các cảnh báo đã biến mất trong các phiên bản gần đây của WebKit.
Tường Tường

Câu trả lời:


463

Chuyện gì đang xảy ra vậy!?

"jQuery có thể sao chép các thuộc tính đó vào đối tượng jQuery." Bạn chính xác, vì vậy có vẻ như bạn đã biết! :)

Hy vọng rằng jQuery sẽ cập nhật mã của họ để ngừng chạm vào điều đó, nhưng đồng thời WebKit nên biết rõ hơn là ghi nhật ký cảnh báo về sự kiện (ít nhất là theo ý kiến ​​của tôi). Một trình xử lý mousemove và giao diện điều khiển của bạn phát nổ. :)

Đây là một vé jQuery gần đây: http://bugs.jquery.com/ticket/10531

CẬP NHẬT: Điều này được khắc phục ngay bây giờ nếu bạn nâng cấp lên jQuery 1.7.

Xin lưu ý rằng nếu việc nâng cấp jQuery không khắc phục được sự cố cho bạn thì nó có thể có liên quan đến các tiện ích mở rộng / plugin đã sử dụng như Jake đã nêu trong câu trả lời của mình .


8
@Neal trong jQuery 1.7, nó sẽ bị xóa theo vé
cảm biến

7
Tôi vẫn thấy họ trong jQ 1.7
Victor S

22
Và tôi vẫn thấy chúng trong jQ 1.7.1. Vì vậy, dường như không được sửa chữa.
Paparappa

3
Tôi đồng ý với 1.7.1, cảnh báo biến mất! Cảm ơn.
Jk_

3
Tôi đã vô hiệu hóa tất cả các tiện ích mở rộng của mình và tôi vẫn nhận được các cảnh báo này với 1.7.2
basZero

74

http://jsperf.com/removing-event-props/2

Cách khắc phục tạm thời là chạy mã này trước khi bạn thực hiện bất kỳ ràng buộc sự kiện nào thông qua 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;
}());

CẬP NHẬT

Xem các bài kiểm tra hiệu suất mới nhất để tìm ra cách nhanh nhất để loại bỏ các đạo cụ sự kiện.


Liên kết tốt! Tôi đã sửa đổi các bài kiểm tra hoàn hảo. Việc sử dụng regex dường như làm chậm một số bài kiểm tra? Trừ khi tôi phá vỡ thứ gì đó, sử dụng === hoặc! == trên tất cả các bài kiểm tra dường như thực hiện trong khi + xóa tùy chọn tốt nhất. jsperf.com/removing-event-props/3
Adam A

Bên cạnh chi phí tải xuống và chạy mã bổ sung? Không.
David Murdoch

Điểm nào trong điểm chuẩn các giải pháp khác nhau khi chúng chỉ được chạy một lần? Đơn giản và ít mã hơn hiệu suất là những gì nên được coi trọng trong trường hợp này. Nếu chúng ta muốn cả hai, tại sao không chỉ thay thế mảng bằng các giá trị thiếu layerX / layerY? Kiểm tra băng ghế hoàn hảo (dù sao cũng không thành vấn đề).
mekwall

28

Giải pháp ngắn nhất cho vấn đề này là lớp lót này:

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

1
@Louis Tôi không quen thuộc với mẫu.j.j vì vậy tôi không thể giúp được gì nhiều, nhưng tôi đoán cách khắc phục sẽ rất giống với điều này. Gửi câu hỏi và hy vọng ai đó biết :)
mekwall

21

Số lượng lớn các tin nhắn này (tôi vừa nhận được 80000 trong số chúng trong khi sử dụng gmail) thực sự là một lỗi trong Chrome.

Bạn nên đánh dấu sao vấn đề trên Chromium .


1
FYI, vấn đề đã được khắc phục trong gần một năm (tức là cảnh báo đã bị xóa khỏi WebKit). Nếu bạn vẫn thấy vấn đề này, hãy xem xét nâng cấp trình duyệt của bạn.
törzsmókus

14

Nó cũng có thể do các tiện ích mở rộng của Chrome gây ra, vì vậy hãy kiểm tra chúng nếu bản cập nhật jQuery không hoạt động.


5

Đây là một sửa chữa một dòng khác, mà không thay thế phiên bản gốc của $ .event.props (có thể hoặc không phải là một mảng), chỉ trong trường hợp :-)

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

5

Tôi đã sử dụng điều này sau khi gọi bất kỳ sự kiện:

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

Điều đó làm việc cho tôi, tôi không có tin nhắn cảnh báo nào kể từ khi tôi thực hiện bản vá này trên mã của mình.


4

Cũng như các vấn đề cấu hình được liệt kê trong các câu trả lời khác, lỗi này có thể được kích hoạt bởi một lỗi đơn giản trong mã của riêng bạn: quên '#' trong từ bộ chọn ID jQuery.

Tôi đã có mã trông giống như

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

(bỏ lỡ # ở phía trước "datenotset")

Cũng như (rõ ràng) không hoạt động, nó đã kích hoạt thông báo lỗi này trong Chrome.


3

Tôi gặp vấn đề này trong mã của riêng tôi. Hóa ra tôi đã lặp đi lặp lại tất cả các thuộc tính trên một đối tượng sự kiện như là một phần của công cụ kiểm tra / gỡ lỗi mà tôi đang sử dụng. Trong trường hợp cụ thể này, tôi đã sử dụng $ .extend của jQuery để sao chép đối tượng để kiểm tra sau này, nhưng tôi tin rằng bất kỳ kỹ thuật lặp tiêu chuẩn nào trong các bộ công cụ khác nhau cũng sẽ kích hoạt cảnh báo.

Tôi đề cập đến nó ở đây bởi vì suy nghĩ ban đầu của tôi chỉ đơn giản là tìm kiếm cơ sở mã cho các trường hợp của layerX hoặc layerY không giúp ích gì - tài sản đang được tham chiếu một cách khái quát, không phải theo tên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.