2013-02-14 40 views
73

Tôi đang cố gắng tìm hiểu sự khác biệt giữa

$(document).on('click', '#id', function(){}); 

là những gì
$('#id').on('click', function(){}); 

tôi đã không thể tìm thấy bất kỳ thông tin về nếu có bất kỳ sự khác biệt giữa hai, và nếu như vậy những gì khác biệt mà bạn có thể .

Ai đó có thể giải thích nếu có bất kỳ sự khác biệt nào không?

+2

Bạn đã đọc tài liệu hay thực hiện tìm kiếm trên trang web này. Nên có một vài triệu câu trả lời để lựa chọn? – adeneo

+0

Đọc về ủy quyền sự kiện trong tài liệu API của '.on()', trong [phần này] (http://api.jquery.com/on/#direct-and-delegated-events) –

+6

Bạn sẽ nhận được "điểm đói" hà mã trả lời này, mặc dù thực tế là nó rõ ràng tài liệu. Mã đầu tiên cho biết "khi tài liệu được nhấp vào, nếu đó là nội dung có ID #id thì hãy kích hoạt mã này". Điều thứ hai nói "khi bất kỳ thứ gì hiện đang tồn tại với ID #id được nhấp, hãy kích hoạt mã này". Điều đầu tiên là gán sự kiện cho các phần tử không tồn tại vào thời điểm đó, nhưng sẽ làm trong tương lai. Thứ hai sẽ không kích hoạt bất kỳ phần tử nào được thêm vào sau. – Archer

Trả lời

55

Ví dụ đầu tiên minh họa ủy quyền sự kiện. Trình xử lý sự kiện được gắn kết với một phần tử cao hơn cây DOM (trong trường hợp này là document) và sẽ được thực hiện khi một sự kiện đến phần tử đó có nguồn gốc trên một phần tử khớp với bộ chọn.

Điều này là có thể vì hầu hết các sự kiện DOM bong bóng lên cây từ điểm xuất phát. Nếu bạn nhấp vào phần tử #id, sự kiện nhấp chuột được tạo sẽ bong bóng qua tất cả các phần tử tổ tiên (lưu ý phụ: thực sự có một pha trước đây, được gọi là 'giai đoạn bắt', khi sự kiện xảy ra dưới gốc cây đến mục tiêu). Bạn có thể nắm bắt sự kiện trên bất kỳ tổ tiên nào.

Ví dụ thứ hai liên kết trình xử lý sự kiện trực tiếp với phần tử. Sự kiện sẽ vẫn bong bóng (trừ khi bạn ngăn chặn điều đó trong trình xử lý) nhưng vì trình xử lý bị ràng buộc với đích, bạn sẽ không thấy tác động của quá trình này.

Bằng cách ủy nhiệm một trình xử lý sự kiện, bạn có thể đảm bảo nó được thực thi cho các phần tử không tồn tại trong DOM tại thời điểm ràng buộc. Nếu phần tử #id của bạn được tạo sau ví dụ thứ hai, trình xử lý của bạn sẽ không bao giờ thực thi. Bằng cách ràng buộc với một phần tử mà bạn biết chắc chắn là trong DOM tại thời điểm thực hiện, bạn đảm bảo rằng trình xử lý của bạn sẽ thực sự được gắn vào một thứ gì đó và có thể được thực thi khi thích hợp sau này.

+1

Tôi muốn biết người nào đại diện cho sự kiện nhanh hơn. Tôi muốn cải thiện chất lượng của mã jquery của tôi. Vì sự kiện ủy nhiệm từ DOM mất ít thời gian hơn so với sự kiện ủy nhiệm từ #Element. Hãy chia sẻ suy nghĩ của bạn –

+1

@James Allardice - sử dụng phương thức sau, '$ (tài liệu) .on ('click', $ ('# id'), function() ...' làm cách nào tôi có thể sử dụng '$ (this) 'tham chiếu' $ ('# id') '?' $ (this) 'hiện đang tham chiếu đến' tài liệu' - mà tôi hiểu. – cheshireoctopus

11

Hãy xem xét đoạn mã sau

<ul id="myTask"> 
    <li>Coding</li> 
    <li>Answering</li> 
    <li>Getting Paid</li> 
</ul> 

Bây giờ, ở đây đi sự khác biệt

// Remove the myTask item when clicked. 
$('#myTask').children().click(function() { 
    $(this).remove() 
}); 

Bây giờ, nếu chúng ta thêm một myTask một lần nữa?

$('#myTask').append('<li>Answer this question on SO</li>'); 

Nhấp vào mục myTask này sẽ không xóa mục này khỏi danh sách vì nó không có trình xử lý sự kiện nào bị ràng buộc. Nếu thay vào đó, chúng tôi đã sử dụng .on, mục mới sẽ hoạt động mà không cần thêm bất kỳ nỗ lực nào từ phía chúng tôi. Đây là cách phiên bản .Trên sẽ nhìn:

$('#myTask').on('click', 'li', function (event) { 
    $(event.target).remove() 
}); 

Tóm tắt:

Sự khác biệt giữa .on().click() sẽ là .click() có thể không hoạt động khi các yếu tố DOM gắn liền với sự kiện .click() được thêm tự động tại một điểm sau đó trong khi .on() có thể được sử dụng trong các tình huống trong đó các phần tử DOM được kết hợp với cuộc gọi .on() có thể được tạo động vào một thời điểm sau đó.

+0

Bhushan, có lý do nào để sử dụng cái cũ hơn là cái sau? –

+0

@SzilardMagyar I đoán tôi đã trả lời trong phần Tóm tắt câu trả lời của tôi .. –

+0

Thông tin tốt! –

Các vấn đề liên quan