2012-06-26 73 views
27

Như tiêu đề gợi ý tôi muốn biết sự khác biệt giữa các changeclick trường hợp hộp kiểm (trong jQuery)jQuery khác biệt giữa sự thay đổi và nhấp vào sự kiện của hộp kiểm

Tôi đã đọc xuống câu trả lời cho What the difference between .click and .change on a checkbox này

Nhưng, nó không làm việc cho tôi. change bắn ngay cả khi tôi va vào không gian mà không bị mất tập trung.

Dưới đây là fiddle demo

Cả hai dường như hoạt động như nhau. Am i thiếu cái gì ở đây ?

+0

có vẻ như bạn đã tự trả lời câu hỏi của mình. –

+2

'nhấp chuột 'có nghĩa là nhấp vào hộp kiểm như bất kỳ phần tử nào khác,' thay đổi' có nghĩa là giá trị của hộp kiểm đã được thay đổi. – Esailija

+0

Nhưng giá trị sẽ được thay đổi ở mọi nhấp chuột. Vì vậy, whats sự khác biệt? – Jashwant

Trả lời

50

Theo W3C, sự kiện onclick được kích hoạt bởi bàn phím cho mục đích trợ năng:

SCR35: Making actions keyboard accessible by using the onclick event of anchors and buttons

Để cung cấp trải nghiệm người dùng tốt hơn cho những người không có việc sử dụng một con chuột, các trình duyệt đã được phát triển để cháy, sự kiện onclick ngay cả khi nhấp chuột xảy ra với một bàn phím.

Vì lý do này, sự kiện click của jQuery sẽ kích hoạt ngay cả khi hộp kiểm là nhấp vào bằng cách sử dụng phím cách của bàn phím. change, hiển nhiên, sẽ kích hoạt mỗi khi trạng thái của hộp kiểm thay đổi.

Hộp kiểm chỉ xảy ra là trường hợp đặc biệt nơi changeclick là hoán đổi cho nhau, bởi vì bạn không thể cháy, sự kiện change mà không có cũng kích hoạt click.

Tất nhiên, ngoại lệ cho quy tắc này là nếu bạn đã sử dụng javascript để tự thay đổi hộp kiểm, chẳng hạn như:

/* this would check the checkbox without firing either 'change' or 'click' */ 
$('#someCheckbox').prop('checked',true); 

/* this would fire 'change', but not 'click'. Note, however, that this 
    does not change the checkbox, as 'change()' is only the function that 
    is fired when the checkbox changes, it is not the function that 
    does the changing */ 
$('#someCheckbox').trigger('change'); 

/* this would fire 'click', which by default automatically triggers 'change' */ 
$('#someCheckbox').trigger('click'); 

Dưới đây là một cuộc biểu tình của những hành động khác nhau: http://jsfiddle.net/jackwanders/MPTxk/1/

Hy vọng điều này giúp.

+6

'Hộp kiểm chỉ xảy ra là trường hợp đặc biệt mà thay đổi và nhấp chuột có thể hoán đổi cho nhau, bởi vì bạn không thể kích hoạt sự kiện thay đổi mà không cũng kích hoạt click' Tôi chỉ cần một từ đơn giản và thẳng như thế này. Tôi sẽ đợi một lúc. Nếu không ai phản đối lời nói của bạn, bạn sẽ có tiền thưởng. – Jashwant

+0

@pozs, mang lại sự khác biệt tuyệt vời. Nhưng bạn xứng đáng có một tiền thưởng để tổng hợp tất cả mọi thứ và một liên kết w3c cho bàn phím 'onclick'. – Jashwant

+1

Có một sự khác biệt mà mọi người có lẽ nên lưu ý. Nếu bạn đang sử dụng IE10/11, sự kiện 'thay đổi' sẽ không kích hoạt do lỗi nếu hộp kiểm ở trạng thái không xác định (ngay cả khi bạn nhấp vào nó). Xem lỗi https://www.bountysource.com/issues/5225302-ie-doesn-t-fire-change-event-on-indeterminate-input-elements sự kiện 'nhấp chuột' sẽ kích hoạt đáng tin cậy mặc dù – automaton

3

Tôi cho rằng thay đổi sẽ kích hoạt khi hộp kiểm thay đổi (ngay cả khi bạn không nhấp vào hộp kiểm). Ví dụ: nếu bạn thay đổi trạng thái của hộp kiểm qua một số chức năng khác.

0

bạn có thể chọn hoặc bỏ chọn hộp kiểm mà không nhấp vào, bằng cách sử dụng bàn phím (tab và thanh dấu cách) điều này chuyển sang câu lệnh thay đổi nhưng không phải để nhấp. IMHO

+1

' sự kiện thay đổi 'bắn ngay cả với chuột – Jashwant

+0

tôi có nghĩa là. tôi có nghĩa là thay đổi cháy EVEN mà không cần click chuột. – F0G

+0

'click' kích hoạt sự kiện mà không cần nhấp chuột :) – Jashwant

0

Xin vui lòng cho tôi biết nếu điều này không giúp tôi sẽ xóa bài của tôi:

Change: http://api.jquery.com/change/ - Tôi nghĩ thay đổi sự kiện được kích hoạt khi state của nguyên tố này nếu thay đổi ví dụ: không nhấp nhưng thay đổi. Hộp kiểm đã kiểm tra và bỏ chọn trạng thái.

Click: nhấp vào sự kiện là khi bạn nhấp vào phần tử bất kể trạng thái của hộp kiểm là gì.

như trong mã giả

if checkbox state is checked 

    alert(Hulk is awesome); 

if checkbox is click every time 

    alert(Ironman is alright); 
+0

Nhưng trong' hộp kiểm', trạng thái sẽ được thay đổi ở mọi 'lần nhấp '. Bạn có thể chỉ ra một bối cảnh mà họ làm việc khác nhau – Jashwant

+0

Yep chắc chắn; 'thay đổi' là khi trạng thái thay đổi, đó là sự kiện nhấp chuột đơn giản' click'. tức là thay đổi diễn ra trên tiểu bang (đã đánh dấu/bỏ chọn) sẽ xảy ra; khi nhấp chuột được kích hoạt khi người dùng nhấp, hãy cho biết điều này có hợp lý không, –

+0

Kiểm tra [this] (http://jsfiddle.net/8RFGn/6/). 'click' cũng đang thay đổi trạng thái. – Jashwant

0

Sự khác biệt tôi có kinh nghiệm là thế này:

var $check = $(':checkbox'); 
$checkbox.checked = true; 
$checkbox.click(function() { 
    alert(this.checked); // true 
}).change(function() { 
    alert(this.checked); // false 
}); 

Vì vậy, với kích nhà nước vẫn chưa thay đổi, với sự thay đổi đó có ...

+0

Nhấp chuột đó sẽ không kích hoạt thông qua bàn phím phải là tự giải thích imo – Simon

+0

thats một điểm rất tốt. Nhưng có vẻ như thất bại [ở đây] (http://jsfiddle.net/8RFGn/6/) – Jashwant

0

Sự kiện thay đổi kích hoạt khi trạng thái hộp kiểm đã được thay đổi thông qua bất kỳ sự cố nào xảy ra hoặc qua không gian nhấn khi hộp kiểm được tập trung hoặc kích hoạt sự kiện thay đổi hoặc nhấp vào trường hợp khi sự kiện nhấp chỉ được kích hoạt khi chúng tôi nhấp vào hộp kiểm nhấp chuột nhưng tại thời điểm đó trước khi nhấp vào nếu sự kiện thay đổi đã được chỉ định thì nó cũng chạy và sau đó thực thi sự kiện nhấp chuột.

đây bạn có thể nhìn thấy kịch bản rõ ràng đã được thực hiện trên thùng: http://codebins.com/codes/home/4ldqpbu

5

Sự khác biệt chính: khi bạn bấm/nhấn không gian trên một hộp kiểm tập trung đầu tiên sự kiện click bị sa thải, không có thay đổi. Tại thời điểm này, bạn vẫn có thể ngăn chặn hành động mặc định (với event.preventDefault()) để chuyển trạng thái checked của hộp kiểm đó và kích hoạt sự kiện change (chưa có hành động mặc định).

Trong một số trình duyệt, sự kiện thay đổi sẽ chỉ kích hoạt sau blur đầu tiên sau click.

+0

Tuyệt vời. Cập nhật [fiddle] của tôi (http://jsfiddle.net/8RFGn/7/) cho 'preventDefault()'. Khi nhấp vào sự kiện, nó dừng nhấp chuột nhưng không phải trên sự kiện kiểm tra, nó không ngừng kiểm tra :) Đó là một trong những sự khác biệt lớn – Jashwant

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