มีความแตกต่างระหว่างรหัสต่อไปนี้หรือไม่?
$('#whatever').on('click', function() {
/* your code here */
});
และ
$('#whatever').click(function() {
/* your code here */
});
มีความแตกต่างระหว่างรหัสต่อไปนี้หรือไม่?
$('#whatever').on('click', function() {
/* your code here */
});
และ
$('#whatever').click(function() {
/* your code here */
});
คำตอบ:
ฉันคิดว่าความแตกต่างอยู่ในรูปแบบการใช้งาน
ฉันต้องการ.on
มากกว่า.click
เพราะอดีตสามารถใช้หน่วยความจำน้อยลงและทำงานสำหรับองค์ประกอบที่เพิ่มขึ้นแบบไดนามิก
พิจารณา html ต่อไปนี้:
<html>
<button id="add">Add new</button>
<div id="container">
<button class="alert">alert!</button>
</div>
</html>
เราจะเพิ่มปุ่มใหม่ผ่านทางไหน
$("button#add").click(function() {
var html = "<button class='alert'>Alert!</button>";
$("button.alert:last").parent().append(html);
});
และต้องการ "แจ้งเตือน!" เพื่อแสดงการแจ้งเตือน เราสามารถใช้ "คลิก" หรือ "เปิด" สำหรับสิ่งนั้น
click
$("button.alert").click(function() {
alert(1);
});
ด้วยข้างต้นตัวจัดการแยกต่างหากจะถูกสร้างขึ้นสำหรับทุกองค์ประกอบเดียวที่ตรงกับตัวเลือก นั่นหมายความว่า
.on
$("div#container").on('click', 'button.alert', function() {
alert(1);
});
กับข้างต้นเดียวจัดการสำหรับองค์ประกอบทั้งหมดที่ตรงกับตัวเลือกของคุณรวมถึงคนที่สร้างขึ้นแบบไดนามิก
.on
ดังที่เอเดรียนได้แสดงความคิดเห็นไว้ด้านล่างเหตุผลอีกประการที่ใช้.on
คือเหตุการณ์ที่กำหนดเนมสเป
หากคุณเพิ่มตัวจัดการกับ.on("click", handler)
คุณโดยปกติแล้วจะลบด้วย.off("click", handler)
ซึ่งจะลบตัวจัดการที่มาก เห็นได้ชัดว่ามันใช้งานได้เฉพาะในกรณีที่คุณมีการอ้างอิงถึงฟังก์ชั่นดังนั้นถ้าคุณไม่ได้? คุณใช้เนมสเปซ:
$("#element").on("click.someNamespace", function() { console.log("anonymous!"); });
ด้วยการไม่ผูกพันผ่าน
$("#element").off("click.someNamespace");
on('click' ...)
ดูที่stackoverflow.com/a/3973060/759452เช่น on('click.darkenallothersections' ...)
และในขณะเดียวกันก็มีon('click.displaynextstep' ...)
แล้วฉันสามารถผูกเพียงคนเดียวที่ฉันเลือกใช้.unbind('click.displaynextstep')
on()
เป็นแนวโน้มใน jQuery ฉันต้องอัปเดต$(window).load(function() {});
เป็น$(window).on("load", function (e) {})
เมื่อฉันอัปเกรดเป็น jQuery 3
มีความแตกต่างระหว่างรหัสต่อไปนี้หรือไม่?
ไม่ไม่มีความแตกต่างในการทำงานระหว่างตัวอย่างโค้ดทั้งสองในคำถามของคุณ .click(fn)
เป็นวิธีการ "ทางลัด" .on("click", fn)
สำหรับ จากเอกสารสำหรับ.on()
:
มีวิธีการจดชวเลขสำหรับบางเหตุการณ์เช่น
.click()
ที่สามารถใช้เพื่อแนบหรือทริกเกอร์ตัวจัดการเหตุการณ์ สำหรับรายการที่สมบูรณ์ของวิธีการจดชวเลขให้ดูที่หมวดหมู่เหตุการณ์
โปรดทราบว่ามัน.on()
แตกต่างจาก.click()
ที่มีความสามารถในการสร้างตัวจัดการเหตุการณ์ที่ได้รับมอบหมายโดยผ่านselector
พารามิเตอร์ในขณะที่.click()
ไม่ได้ เมื่อ.on()
ถูกเรียกโดยไม่มีพารามิเตอร์มันจะทำงานเหมือนกับselector
ถ้าคุณต้องการที่คณะผู้แทนเหตุการณ์การใช้งาน.click()
.on()
selector
พารามิเตอร์ ถ้าคุณโทร.on()
ได้โดยไม่ต้องพารามิเตอร์ไม่มีการปรับปรุงประสิทธิภาพมากกว่าการใช้selector
.click()
.on()
เป็นวิธีที่แนะนำในการทำกิจกรรมทั้งหมดที่มีผลผูกพัน ณ jQuery 1.7 มันม้วนฟังก์ชั่นทั้งหมดของทั้งสอง.bind()
และ.live()
เป็นฟังก์ชั่นเดียวที่เปลี่ยนพฤติกรรมในขณะที่คุณผ่านพารามิเตอร์ที่แตกต่าง
เมื่อคุณเขียนตัวอย่างแล้วไม่มีความแตกต่างระหว่างสองตัวอย่าง ทั้งสองผูกจัดการกับกรณีของclick
มอบความยืดหยุ่นเพิ่มเติมในการอนุญาตให้คุณมอบหมายกิจกรรมที่เด็ก ๆ ใช้ไปยังฟังก์ชั่นจัดการเดี่ยวหากคุณเลือก#whatever
on()
#whatever
// Bind to all links inside #whatever, even new ones created later.
$('#whatever').on('click', 'a', function() { ... });
.live()
หรือ นอกจากนี้ดูเหมือนว่าจะขัดแย้งกับคำตอบอื่น ๆ ที่บอกว่ามันมีฟังก์ชั่นการใช้งานเพียงอย่างเดียวเท่านั้น.click()
ดังนั้นจึงไม่มีผลกับกิจกรรมในอนาคต
.on()
สามารถทำสิ่งที่.click()
ไม่และทำในสิ่งที่.bind()
และ.live()
ทำ - มันขึ้นอยู่กับสิ่งที่พารามิเตอร์ที่คุณเรียกมันด้วย (คำตอบอื่น ๆ ที่กล่าวถึงนี้ด้วย) โปรดทราบว่า "การเชื่อมโยงไปยังลิงก์ทั้งหมดภายใน #whething" ไม่ใช่สิ่งที่.live()
ทำ แต่เป็นสิ่งที่.delegate()
ทำ .live()
ผูกกับภายในทั้งหมดdocument
แทนที่จะให้คุณระบุคอนเทนเนอร์ หมายเหตุยัง.live()
ถูกคัดค้านจาก jQuery 1.7 เป็นต้นไป
ตามที่กล่าวถึงโดยคำตอบอื่น ๆ :
$("#whatever").click(function(){ });
// is just a shortcut for
$("#whatever").on("click", function(){ })
สังเกตว่าที่.on()
สนับสนุนการรวมพารามิเตอร์อื่น ๆ ที่.click()
ไม่อนุญาตให้จัดการการมอบหมายเหตุการณ์ (superceding .delegate()
และ.live()
)
(และเห็นได้ชัดว่ามีวิธีลัดอื่น ๆ ที่คล้ายกันสำหรับ "keyup", "focus" ฯลฯ )
เหตุผลที่ฉันโพสต์คำตอบเพิ่มเติมคือการพูดถึงสิ่งที่เกิดขึ้นหากคุณโทร.click()
โดยไม่มีพารามิเตอร์:
$("#whatever").click();
// is a shortcut for
$("#whatever").trigger("click");
สังเกตว่าถ้าคุณใช้.trigger()
โดยตรงคุณยังสามารถส่งผ่านพารามิเตอร์พิเศษหรือวัตถุเหตุการณ์ jQuery .click()
ซึ่งคุณจะไม่สามารถทำอะไรกับ
ฉันยังอยากจะพูดถึงว่าหากดูรหัสที่มา jQuery (ใน jQuery-1.7.1.js) คุณจะเห็นว่าภายใน.click()
(หรือ.keyup()
อื่น ๆ ) ฟังก์ชั่นที่จริงจะเรียกหรือ.on()
.trigger()
เห็นได้ชัดว่านี่หมายความว่าคุณสามารถมั่นใจได้ว่าพวกเขามีผลเหมือนกัน แต่ก็หมายความว่าการใช้.click()
มีค่าใช้จ่ายเพิ่มเติมเล็กน้อย - ไม่ต้องกังวลหรือคิดในสถานการณ์ส่วนใหญ่ แต่ในทางทฤษฎีมันอาจมีความสำคัญในสถานการณ์พิเศษ
แก้ไข: สุดท้ายโปรดทราบว่า.on()
ช่วยให้คุณสามารถผูกหลายเหตุการณ์ในฟังก์ชั่นเดียวกันในหนึ่งบรรทัดเช่น:
$("#whatever").on("click keypress focus", function(){});
.click()
.)
ไม่ไม่มี
จุดสำคัญon()
คือโอเวอร์โหลดอื่น ๆ และความสามารถในการจัดการเหตุการณ์ที่ไม่มีวิธีลัด
เอกสารเหล่านี้ดูเหมือนจะเหมือนกัน ... เอกสารจากฟังก์ชันclick () :
วิธีนี้เป็นทางลัดสำหรับ. ผูก ('คลิก' ตัวจัดการ)
เอกสารจากฟังก์ชั่นเปิด () :
ตั้งแต่ jQuery 1.7 เมธอด. on () จัดเตรียมการทำงานทั้งหมดที่จำเป็นสำหรับการแนบตัวจัดการเหตุการณ์ สำหรับความช่วยเหลือในการแปลงจากวิธีเหตุการณ์ jQuery ที่เก่ากว่าดู. ผูก (), .delegate () และ. live () หากต้องการลบกิจกรรมที่ผูกไว้กับ. on () ดู. off ()
.click
vs.on
.click
เหตุการณ์จะใช้งานได้ก็ต่อเมื่ออิลิเมนต์เริ่มแสดงผลและเชื่อมต่อกับองค์ประกอบที่โหลดเมื่อ DOM พร้อมเท่านั้น
.on
เหตุการณ์จะถูกแนบกับองค์ประกอบ DOM แบบไดนามิกซึ่งเป็นประโยชน์เมื่อคุณต้องการแนบเหตุการณ์กับองค์ประกอบ DOM ที่แสดงผลตามคำขอ ajax หรืออย่างอื่น (หลังจากที่ DOM พร้อม)
ที่นี่คุณจะได้รับรายการวิธีการใช้งานคลิกที่แตกต่างกัน คุณสามารถเลือกได้ตามความเหมาะสมหรือหากการคลิกของคุณไม่ทำงานให้ลองใช้วิธีอื่นแทน
$('.clickHere').click(function(){
// this is flat click. this event will be attatched
//to element if element is available in
//dom at the time when JS loaded.
// do your stuff
});
$('.clickHere').on('click', function(){
// same as first one
// do your stuff
})
$(document).on('click', '.clickHere', function(){
// this is diffrent type
// of click. The click will be registered on document when JS
// loaded and will delegate to the '.clickHere ' element. This is
// called event delegation
// do your stuff
});
$('body').on('click', '.clickHere', function(){
// This is same as 3rd
// point. Here we used body instead of document/
// do your stuff
});
$('.clickHere').off().on('click', function(){ //
// deregister event listener if any and register the event again. This
// prevents the duplicate event resistration on same element.
// do your stuff
})
ตอนนี้พวกเขาเลิกใช้การคลิก () ดังนั้นควรไปด้วย ('คลิก')
เท่าที่ได้รับรู้จากอินเทอร์เน็ตและเพื่อนบางคน. on () จะถูกใช้เมื่อคุณเพิ่มองค์ประกอบแบบไดนามิก แต่เมื่อฉันใช้ในหน้าเข้าสู่ระบบที่เรียบง่ายที่เหตุการณ์การคลิกควรส่ง AJAX ไปที่ node.js และเมื่อกลับมาผนวกองค์ประกอบใหม่มันเริ่มที่จะเรียกการโทรแบบ Multi-AJAX เมื่อฉันเปลี่ยนเป็นคลิก () ทุกอย่างไปถูกต้อง จริงๆแล้วฉันไม่เคยเจอกับปัญหานี้มาก่อน
องค์ประกอบใหม่
เป็นภาคผนวกของคำตอบที่ครอบคลุมด้านบนเพื่อเน้นจุดสำคัญหากคุณต้องการให้คลิกเพื่อแนบกับองค์ประกอบใหม่:
$('.UPDATE').click(function(){ }); **V/S**
$(document).on('click','.UPDATE',function(){ });
$(document).on('click','.UPDATE',function(){ });
$(document).on('click','.UPDATE',function(){ });
จะทำงานได้อย่างมีประสิทธิภาพเหมือนกับข้อมูลที่ดึงข้อมูลเดียวกันโดยใช้ jquery ปุ่มไม่ทำงานเมื่อมีการอัปเดตหรือลบ: