2011-07-13 22 views
80

Nói rằng tôi có một handler nhấp chuột định nghĩa:Trong jQuery, làm cách nào tôi có thể biết được giữa nhấp chuột có lập trình và người dùng?

$("#foo").click(function(e){ 

}); 

Làm thế nào tôi có thể, trong thời hạn xử lý chức năng, cho dù sự kiện này đã bị sa thải lập trình, hoặc bởi người sử dụng?

+0

Làm thế nào để chương trình đi về bắn một sự kiện lập trình? – Clayton

+5

Tại sao bạn cần phải phân biệt các trường hợp? –

+0

@Clayton: '$ x.click()' hoặc '$ x.trigger ('click')'. –

Trả lời

40

Bạn có thể sử dụng một tham số phụ như đã nêu trong jQuery trigger manual:

$("#foo").click(function(e, from){ 
    if (from == null) 
     from = 'User'; 
    // rest of your code 
}); 

$('#foo').trigger('click', ['Trigger']); 
+3

Vấn đề duy nhất tôi thấy với điều này là bạn không thể phân biệt giữa một nhấp chuột bình thường và '$ x.click()', người gọi '.click()' phải cho bạn biết rõ ràng rằng họ đang giả mạo nó. Điều này có thể hoặc có thể không phải là một vấn đề tùy thuộc vào những gì Kevin Owocki là đến. –

+1

@mu: Tôi không hoàn toàn hiểu sự khác biệt của bạn giữa nhấp chuột "bình thường" (người dùng?) Và '$ x.click()' là eventHandler (đối với lần nhấp của người dùng, có thể là "bình thường") – Shikiryu

+1

sự khác biệt là người ta đến từ người dùng nhưng người kia đến từ phần mềm. Nhấp chuột giả mạo có thể đến từ một plugin hoặc một số mã khác không thể sửa đổi để thêm đối số thừa. Tôi không phê bình giải pháp của bạn, chỉ cần lưu ý một số lỗ có thể xảy ra. –

103

Bạn có thể có một cái nhìn tại các đối tượng sự kiện e. Nếu sự kiện được kích hoạt bằng một nhấp chuột thực, bạn sẽ có những thứ như clientX, clientY, pageX, pageY, v.v. bên trong e và chúng sẽ là số; những con số này có liên quan đến vị trí chuột khi nhấp chuột được kích hoạt nhưng chúng có thể sẽ xuất hiện ngay cả khi nhấp chuột được bắt đầu thông qua bàn phím. Nếu sự kiện được kích hoạt bởi $x.click() thì bạn sẽ không có các giá trị vị trí thông thường trong e. Bạn cũng có thể xem originalEvent property, không nên ở đó nếu sự kiện đến từ $x.click().

Có lẽ một cái gì đó như thế này:

$("#foo").click(function(e){ 
    if(e.hasOwnProperty('originalEvent')) 
     // Probably a real click. 
    else 
     // Probably a fake click. 
}); 

Và đây là một sandbox chút để chơi với: http://jsfiddle.net/UtzND/

+2

Thật tuyệt vời ... Tôi chỉ nghĩ đến bản thân mình "có thể các sự kiện kích hoạt jQuery không có thông tin về vị trí chuột"! w00t! – Kasapo

+2

Điều này có thể bị đánh bại trong các trình duyệt hỗ trợ createEvent. http://jsfiddle.net/UtzND/26 –

+1

@JoeEnzminger có nhưng tại sao bạn lại đánh bại kịch bản của chính mình để nói ...? – OZZIE

4

DOM Level 3 quy định cụ thể event.isTrusted. Điều này hiện chỉ được hỗ trợ trong IE9 + và Firefox (dựa trên các bài kiểm tra của tôi. Tôi cũng đọc (mặc dù không được nghiên cứu kỹ lưỡng) rằng nó có thể bị ghi đè trong một số trình duyệt và có lẽ chưa sẵn sàng 100% để thực sự đáng tin cậy.

This là một phiên bản sửa đổi của fiddle @ mu của hoạt động trên IE và Firefox.

+0

Điểm tốt. Tôi không nghĩ rằng bất cứ điều gì là có được 100% rắn mặc dù. Bạn sẽ phải kết hợp trong một số thử nghiệm để xem liệu 'isTrusted' có được hỗ trợ và không ghi được hay không. Tôi nghĩ câu trả lời thực sự phụ thuộc vào * lý do * đằng sau câu hỏi này và chúng tôi không bao giờ tìm ra lý do. –

+0

@mu, tôi đã đến câu hỏi này sau khi hỏi một câu hỏi tương tự nhưng tổng quát hơn. Trường hợp "tại sao" của tôi là tôi muốn đảm bảo rằng tôi chỉ đang thực hiện một hành động (một giao dịch tài chính, mặc dù một giao dịch nhỏ) mà người dùng đã thực hiện hành động khẳng định trực tiếp trên trang. –

9

có một câu hỏi khác đã trả lời rồi.

How to detect if a click() is a mouse click or triggered by some code?

Sử dụng which tài sản của đối tượng sự kiện. Nó phải là undefined cho các sự kiện mã kích hoạt

$("#someElem").click(function(e) { 
    if (e.which) { 
     // Actually clicked 
    } else { 
     // Triggered by code 
    } 
}); 

JsFiddle dụ - http://jsfiddle.net/interdream/frw8j/

Hy vọng nó sẽ giúp!

+2

Không phải lúc nào cũng hoạt động. Ví dụ. 'select' sẽ đưa ra một' e.which == undefined' ngay cả đối với một sự kiện chính hãng. – JNF

-1

Không sẽ tham gia vào các cuộc thảo luận hữu trí tuệ, các mã mà làm việc cho tôi để lọc .click().trigger('click') là-

$(document).on('click touchstart', '#my_target', function(e) { 
    if (e.pageX && e.pageY) { // To check if it is not triggered by .click() or .trigger('click') 
     //Then code goes here 
    } 
}); 
Các vấn đề liên quan