WebKit มีปัญหากับ event.layerX และ event.layerY


507

ฉันเพิ่งสังเกตเห็นว่าฉันได้รับคำเตือนจำนวนมากที่เลิกใช้แล้วใน 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
เพิ่งสังเกตเห็นวันนี้เช่นกัน
Dusda

5
jQuery 1.7 ยังคงโยนคำเตือนดูเหมือนว่ายังไม่ได้รับการแก้ไข .......
Krish

3
@ Stuart.Sklinar ฉันไม่ทราบว่าคุณใช้รหัสใน PHP หรือไม่ แต่ถ้าคุณทำฉันค่อนข้างแน่ใจว่าคุณใช้@เพื่อระงับข้อผิดพลาด
PeeHaa

1
โครเมี่ยมเฉพาะกลุ่มข้อผิดพลาดที่คล้ายกันหากไม่มีข้อผิดพลาดระหว่างกาลในระหว่าง ดังนั้นปัญหาก็คือมันทำให้ยุ่งยากในการใช้คอนโซลสำหรับการดีบัก มันระคายเคือง แต่เป็นยังฉันไม่คิดว่าฟังก์ชั่นใด ๆ jQuery เสียจริง
Carpii

2
เป็นเรื่องน่าสังเกตสำหรับคนรุ่นหลังว่า WebKit ( ข้อผิดพลาด 86264 ) ได้ถอยออกจากการตัดสินใจที่จะเลิกใช้งานlayerXและlayerYอย่างน้อยก็จนกว่าพวกเขาจะพิจารณาอย่างรอบคอบมากขึ้น นอกจากนี้ยังเป็นที่น่าสังเกตว่าเมื่อเร็ว ๆ นี้ IE ได้เพิ่ม layerXและlayerYหลังจากนั้นไม่ได้จนกว่าจะถึงรุ่นที่ 9 ฉันเดาว่าคุณสมบัติเหล่านี้จะไม่หายไป - อย่างน้อยก็จนกว่าจะมีการเปลี่ยน W3C ที่เหมาะสมซึ่งจะไม่เร็ว ๆ นี้ คำเตือนหายไปใน WebKit เวอร์ชันล่าสุด
กำแพงนาธาน

คำตอบ:


463

เกิดอะไรขึ้น!?

"jQuery อาจคัดลอกคุณสมบัติเหล่านั้นลงในวัตถุ jQuery" คุณพูดถูกต้องแล้วดูเหมือนว่าคุณจะรู้แล้ว! :)

หวังว่า jQuery จะอัปเดตรหัสของพวกเขาเพื่อหยุดแตะ แต่ในขณะเดียวกัน WebKit ควรรู้จักดีกว่าบันทึกคำเตือนการเลิกใช้งานในเหตุการณ์ (อย่างน้อยในความคิดของฉัน) ตัวจัดการ mousemove หนึ่งตัวและคอนโซลของคุณจะระเบิด :)

นี่คือตั๋ว jQuery ล่าสุด: http://bugs.jquery.com/ticket/10531

UPDATE: สิ่งนี้ได้รับการแก้ไขแล้วถ้าคุณอัพเกรดเป็น jQuery 1.7

โปรดทราบว่าถ้าอัพเกรด jQuery ไม่สามารถแก้ไขปัญหาสำหรับคุณมันอาจจะมีอะไรบางอย่างที่มีส่วนขยายสินค้า / ปลั๊กอินเจคของเขาที่ระบุไว้ในคำตอบ


8
@Neal ใน jQuery 1.7 มันจะถูกลบออกตามตั๋ว
เซ็นเซอร์

7
ฉันยังเห็นพวกเขาใน jQ 1.7
Victor S

22
และฉันยังเห็นพวกเขาใน jQ 1.7.1 ดูเหมือนจะไม่ได้รับการแก้ไข
Paparappa

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

UPDATE

ดูการทดสอบประสิทธิภาพล่าสุดเพื่อค้นหาว่าวิธีที่เร็วที่สุดคือการลบอุปกรณ์ประกอบฉากเหตุการณ์


ลิงค์ที่ดี! ฉันแก้ไขการทดสอบแบบสมบูรณ์ การใช้ regex ดูเหมือนจะทำให้การทดสอบช้าลงบ้างไหม? ยกเว้นว่าฉันทำอะไรขาดหายไปการใช้ === หรือ! == ในการทดสอบทั้งหมดดูเหมือนว่าจะทำในขณะที่ + ลบตัวเลือกที่ดีที่สุด jsperf.com/removing-event-props/3
อดัม

นอกจากค่าใช้จ่ายในการดาวน์โหลดและเรียกใช้รหัสเพิ่มเติมหรือไม่ Nope
David Murdoch

จุดประสงค์ในการเปรียบเทียบโซลูชันที่แตกต่างกันเมื่อทำงานเพียงครั้งเดียวคืออะไร ความเรียบง่ายและรหัสน้อยกว่าประสิทธิภาพคือสิ่งที่ควรประเมินค่าในกรณีนี้ หากเราต้องการทั้งคู่ทำไมไม่เพียงแค่แทนที่อาเรย์ด้วยค่าที่ไม่มีเลเยอร์ X / layerY? ตรวจสอบม้านั่ง perf (ซึ่งไม่สำคัญ)
mekwall

28

ทางออกที่สั้นที่สุดสำหรับสิ่งนี้คือสายการบินเดียว:

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

1
@Louis ฉันไม่คุ้นเคยกับ prototype.js ดังนั้นฉันไม่สามารถช่วยเหลือได้มากนัก แต่ฉันคิดว่าการแก้ไขควรคล้ายกับสิ่งนี้มาก โพสต์คำถามและหวังว่าใครบางคนจะรู้ :)
mekwall

21

ข้อความเหล่านี้จำนวนมหาศาล(ฉันเพิ่งได้รับ 80000 ข้อความขณะใช้ gmail)เป็นข้อผิดพลาดใน Chrome

คุณควรดาวปัญหาในโครเมี่ยม


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

ฉันพบปัญหานี้ในรหัสของฉันเอง ปรากฎว่าฉันทำซ้ำคุณสมบัติทั้งหมดในวัตถุเหตุการณ์เป็นส่วนหนึ่งของเครื่องมือการตรวจแก้จุดบกพร่อง / การตรวจสอบที่ฉันใช้ ในตัวอย่างนี้ฉันใช้ jQuery ของ $ .extend เพื่อคัดลอกวัตถุเพื่อการตรวจสอบในภายหลัง แต่ฉันเชื่อว่าเทคนิคการทำซ้ำมาตรฐานใด ๆ ในชุดเครื่องมือต่างๆจะมีการเตือนด้วยเช่นกัน

ฉันพูดถึงที่นี่เพราะความคิดเริ่มต้นของฉันเพียงแค่ค้นหาฐานรหัสสำหรับอินสแตนซ์ของ layerX หรือ layerY ไม่ได้ช่วย - ทรัพย์สินถูกอ้างอิงโดยทั่วไปไม่ใช่ชื่อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.