jQuery's .bind () และ. on ()


207

ผมพบว่าทั้งสองบทความที่ดีพูดคุยเกี่ยวกับฟังก์ชั่นใหม่.on(): jquery4u.com , elijahmanor.com

มีวิธีที่ใด ๆ.bind()ยังคงดีกว่าที่จะใช้งานกว่า.on()?

ตัวอย่างเช่นฉันมีรหัสตัวอย่างที่มีลักษณะเช่นนี้:

$("#container").click( function( e ) {} )

คุณสามารถทราบได้ว่าฉันเพิ่งมีรายการหนึ่งรายการที่เลือกโดยและในกรณีของฉัน<div>ชื่อที่#containerมีอยู่แล้วเมื่อโหลดหน้าของฉัน ไม่ได้เพิ่มแบบไดนามิก เป็นสิ่งสำคัญที่ต้องกล่าวถึงว่าฉันใช้ jQuery เวอร์ชันล่าสุด: 1.7.2

สำหรับตัวอย่างนั้นควร.on()ใช้แทน.bind()แม้ว่าฉันจะไม่ใช้คุณสมบัติอื่น ๆ ที่มีให้โดย.on()ฟังก์ชั่น?


5
บทความที่สองนั้นเป็นขยะ มันบอกว่ามันมีผลอย่างไร.bind()กับการรวมองค์ประกอบหลาย ๆ อย่างเข้าด้วยกัน แต่ไม่สามารถพูดถึงได้ว่า.on()เมื่อใดที่ใช้ในโหมดการรวมจะทำสิ่งเดียวกัน
Alnitak

คำตอบ:


316

ภายใน.bindแผนที่โดยตรงกับ.onใน jQuery รุ่นปัจจุบัน (สิ่งเดียวกันจะเป็น.liveเช่นนั้น) ดังนั้นจึงมีประสิทธิภาพการทำงานเพียงเล็กน้อย แต่ไม่สำคัญหากคุณใช้งาน.bindแทน

อย่างไรก็ตาม.bindอาจถูกลบออกจากรุ่นอนาคตได้ตลอดเวลา ไม่มีเหตุผลที่จะใช้ต่อไป.bindและเหตุผลที่ต้องการ.onแทน


5
น่าจะเป็น - มีเหตุผลเล็กน้อยที่จะลบพวกเขาเพราะพวกเขาเพียงแค่จับคู่กับฟังก์ชั่นที่มีอยู่ ในทางกลับกันการอัปเกรดด้วยหมายเลขเวอร์ชันหลักหมายความว่าคุณสามารถทำอะไรก็ได้กับ API เนื่องจากความเข้ากันได้แบบย้อนหลังนั้นไม่ได้รับประกันความจำเป็นในตอนนั้น เพียงแค่พูดว่า
Blazemonger

6
@Esailija ฟังก์ชั่นเหล่านั้นมีทางลัดที่เป็นประโยชน์สำหรับจัดการกับคำขอประเภทอะซิงโครนัสเฉพาะประเภท .bindและ.onเหมือนกันสำหรับเหตุการณ์ที่ไม่ได้รับมอบหมาย .bindไม่ได้ให้ทางลัดใด ๆ เหมือนอย่างที่$.getJSONทำ
jackwanders

7
@jbabey ในขณะที่ความจริงทางเทคนิคว่าพวกเขาไม่จำเป็นต้องลบฟังก์ชั่นใด ๆ พวกเขายังคงเลิกใช้และแนะนำให้คุณไม่ใช้พวกเขา ในอนาคตพวกเขาสามารถตัดสินใจที่จะลบพวกเขาทั้งหมด (ชนิดของวิธีที่พวกเขาเอาการสนับสนุน IE บางอย่างเป็นรุ่น 2.x) ไม่ควรใช้ฟังก์ชั่นที่เลิกใช้
ฮันนา

8
การพิมพ์ "jQuery.fn.bind.toString ()" เอาท์พุท "ฟังก์ชั่น (a, b, c) {กลับ this.on (a, null, b, c)}"
Jowen

5
การผูกและการเลิกผูกจะเลิกใช้ตั้งแต่ jQuery 3
Joe Mabel

58

ตัวอย่างเหล่านี้ทั้งหมดทำงานในสิ่งเดียวกัน:

element.on('click', function () { ... });
element.bind('click', function () { ... });
element.click(function () { ... });

อย่างไรก็ตามมันแตกต่างจากสิ่งเหล่านี้อย่างมากซึ่งทั้งหมดทำสิ่งเดียวกัน:

element.on('click', 'selector', function () { ... });
element.delegate('click', 'selector', function () { ... });
$('selector').live('click', function () { ... });

ตัวจัดการเหตุการณ์ชุดที่สองใช้การมอบหมายเหตุการณ์และจะทำงานกับองค์ประกอบที่เพิ่มเข้ามาแบบไดนามิก ตัวจัดการเหตุการณ์ที่ใช้การมอบหมายนั้นมีประสิทธิภาพมากกว่า ชุดแรกจะไม่ทำงานสำหรับองค์ประกอบที่เพิ่มเข้ามาแบบไดนามิกและแย่กว่ามากสำหรับประสิทธิภาพ

on()ฟังก์ชั่นของ jQuery ไม่ได้แนะนำฟังก์ชั่นใหม่ใด ๆ ที่ไม่ได้มีอยู่มันเป็นเพียงความพยายามในการสร้างมาตรฐานการจัดการเหตุการณ์ใน jQuery (คุณไม่ต้องตัดสินใจระหว่างการถ่ายทอดสดการเชื่อมโยงหรือการมอบหมาย)


1
ฉันคิดว่าคุณหมายถึง$('selector').live('click', function () { ... });เพื่อให้คุณเก็บผลลัพธ์ได้เกือบเท่ากัน
andlrc

11

วิธีการโดยตรงและ.delegateเป็น API ที่เหนือกว่า.onและไม่มีเจตนาที่จะเลิกใช้

วิธีการที่ตรงกว่าจะดีกว่าเพราะรหัสของคุณจะพิมพ์อย่างเข้มงวดน้อยลง คุณจะได้รับข้อผิดพลาดทันทีเมื่อคุณพิมพ์ชื่อเหตุการณ์แทนที่จะเป็นข้อบกพร่องแบบเงียบ ในความคิดของฉันมันง่ายกว่าที่จะเขียนและอ่านclickมากกว่าon("click"

.delegateจะดีกว่า.onเพราะการสั่งซื้ออาร์กิวเมนต์ที่:

$(elem).delegate( ".selector", {
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
});

คุณรู้ทันทีว่ามันได้รับมอบหมายเพราะเอาละมันบอกว่าเป็นตัวแทน คุณจะเห็นตัวเลือกทันที

ด้วย.onความที่ไม่ชัดเจนในทันทีหากมีการมอบสิทธิ์และคุณต้องดูที่จุดสิ้นสุดของตัวเลือก:

$(elem).on({
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
}, "selector" );

ตอนนี้การตั้งชื่อเป็นสาหัสจริงๆและเป็นที่มูลค่าเลวร้ายยิ่งกว่า.bind .onแต่.delegateไม่สามารถทำกิจกรรมที่ไม่ได้รับมอบหมายและมีเหตุการณ์ที่ไม่มีวิธีการโดยตรงดังนั้นในกรณีที่หายากเช่นนี้มันสามารถใช้งานได้ แต่เพราะคุณต้องการแยกความสะอาดระหว่างเหตุการณ์ที่มอบหมายและไม่ได้รับมอบหมาย


8
ในฐานะของ jQuery 3.0, .delegate ()ได้ถูกเลิกใช้แล้ว
สลัว


6

จากเอกสาร jQuery:

ตั้งแต่ jQuery 1.7 เมธอด. on () เป็นวิธีที่ต้องการสำหรับการแนบตัวจัดการเหตุการณ์กับเอกสาร สำหรับเวอร์ชันก่อนหน้านี้. ผูกวิธี () จะใช้สำหรับการแนบการจัดการเหตุการณ์โดยตรงกับองค์ประกอบ ตัวจัดการจะแนบไปกับองค์ประกอบที่เลือกในปัจจุบันในวัตถุ jQuery ดังนั้นองค์ประกอบเหล่านั้นจะต้องมีอยู่ ณ จุดที่เรียกว่า. ผูก () เกิดขึ้น สำหรับการเชื่อมเหตุการณ์ที่ยืดหยุ่นมากขึ้นให้ดูการอภิปรายของการมอบหมายเหตุการณ์ใน. on () หรือ .delegate ()

http://api.jquery.com/bind/


1
โปรดทราบว่าคำแนะนำของเอกสารนั้นมาจากทีมเดียวกับที่ทำให้คุณผูกพันคลิกสดถ่ายทอดสด ... และความสับสนที่เกิดขึ้นทั้งหมด หลังจากอ่านเว็บไซต์หลายแห่งเกี่ยวกับปัญหานี้แล้วความคิดเห็นของฉันคือเว็บไซต์ที่ดีที่สุดและถูกต้องที่สุดคือไซต์ที่อธิบายว่า "เปิด" เป็น "การเคลือบน้ำตาล" น้ำตาลดึงดูดแมลงและผู้แทนเป็นวิธีที่จะไป
DaveWalley

4

ตั้งแต่ Jquery 3.0 ขึ้นไป. ผูกได้เลิกใช้แล้วและพวกเขาต้องการใช้. on แทน ตามที่ @Blazemonger ตอบก่อนหน้านี้ว่ามันอาจถูกลบและมันจะถูกลบอย่างแน่นอน สำหรับเวอร์ชันเก่าผูกยังจะโทร. ภายในและไม่มีความแตกต่างระหว่างพวกเขา โปรดดูรายละเอียดเพิ่มเติมจาก api

เอกสารประกอบ jQuery API สำหรับ. ผูก ()

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