2011-07-14 31 views
105

Tôi có trình xử lý được đính kèm với sự kiện và tôi muốn trình xử lý đó thực thi chỉ khi nó được kích hoạt bởi một con người chứ không phải bằng phương thức trigger(). Làm thế nào để tôi biết sự khác biệt?Kiểm tra xem sự kiện có được kích hoạt bởi một con người

Ví dụ,

$('.checkbox').change(function(e){ 
    if (e.isHuman()) 
    { 
    alert ('human'); 
    } 
}); 

$('.checkbox').trigger('change'); //doesn't alert 
+6

Tôi mất một lúc để tìm hiểu cách thực hiện câu hỏi này. – minexew

+0

@minexew Phần khó nhất của việc sử dụng lập trình là đặt tên biến và cách thực hiện các vấn đề với google!: P –

Trả lời

163

Bạn có thể kiểm tra e.originalEvent: nếu nó xác định nhấp chuột là con người:

Nhìn vào fiddle http://jsfiddle.net/Uf8Wv/

$('.checkbox').change(function(e){ 
    if (e.originalEvent !== undefined) 
    { 
    alert ('human'); 
    } 
}); 

ví dụ của tôi trong fiddle:

<input type='checkbox' id='try' >try 
<button id='click'>Click</button> 

$("#try").click(function(event) { 
    if (event.originalEvent === undefined) { 
     alert('not human') 
    } else { 
     alert(' human'); 
    } 


}); 

$('#click').click(function(event) { 
    $("#try").click(); 
}); 
+1

@Nicola Tài liệu này có ở bất cứ đâu không? –

+0

@Khi tôi không biết, nhưng tôi nghĩ đó là tiêu chuẩn. xem tại đây: http: //api.jquery.com/category/events/event-object/ –

+0

@Nicola Tôi hiểu, đó là một điều jQuery. jQuery lưu trữ đối tượng sự kiện ban đầu bên trong thuộc tính này. Btw, ý bạn là gì bạn không biết? Bạn chỉ cần cung cấp liên kết đến tài liệu ':)' –

5

Tôi nghĩ rằng cách duy nhất để làm điều này sẽ được thông qua trong một tham số bổ sung về các cuộc gọi trigger theo documentation.

$('.checkbox').change(function(e, isTriggered){ 
    if (!isTriggered) 
    { 
    alert ('human'); 
    } 
}); 

$('.checkbox').trigger('change', [true]); //doesn't alert 

Ví dụ: http://jsfiddle.net/wG2KY/

+1

bạn có thể kiểm tra thuộc tính originalEvent của đối tượng sự kiện: nếu sự kiện không đến từ nhấp chuột, nó không được xác định –

+0

[Truyền dữ liệu cùng với trình kích hoạt] (http://api.jquery.com/trigger/) chắc chắn là con đường để đi cho các sự kiện được ủy quyền. [Ít nhất sự kiện nhấp chuột dường như không có tham số] (http://jsfiddle.net/notacouch/Uf8Wv/69/). Nhưng [nếu bạn thực hiện một sự kiện tùy chỉnh thì các tham số truyền đi sẽ không có vấn đề gì] (http://jsfiddle.net/notacouch/Uf8Wv/68/). – notacouch

+1

Vì lý do nào đó event.originalEvent không hoạt động cho tôi (chỉ cần giữ lại 1) khi sử dụng trình xử lý 'click' của Zepto. Vì vậy, tôi đã thử giải pháp trên. Làm việc như người ở. – Larrydx

1

Tôi sẽ suy nghĩ về một khả năng mà bạn kiểm tra vị trí con chuột, như:

  • Bấm
  • Nhận vị trí chuột
  • chồng lên coords của nút
  • ...
+0

Tôi không thể làm việc với tình huống sau: Đôi khi có thể chọn các phần tử của trang bằng cách sử dụng phím Tab. Ví dụ, nếu tôi đã chọn theo cách này một hộp kiểm, tôi có thể kiểm tra/bỏ chọn bằng cách sử dụng phím khoảng trắng. Hoặc thậm chí mở một drodpdown bằng cách sử dụng phím mũi tên xuống. –

13

More thẳng về phía trước hơn ở trên sẽ là:

$('.checkbox').change(function(e){ 
    if (e.isTrigger) 
    { 
    alert ('not a human'); 
    } 
}); 

$('.checkbox').trigger('change'); //doesn't alert 
+0

Đây là câu trả lời hay nhất. Để giải thích, xem: http://stackoverflow.com/questions/10704168/in-javascript-what-is-event-istrigger – jaredjacobs

+1

Trong khi điều này là hấp dẫn và có lẽ là ấm cúng trong thực tế, lưu ý rằng các nhà phát triển jQuery không muốn tốt nghiệp ' isTrigger' đến API công khai [vào thời điểm này] (https://github.com/jquery/api.jquery.com/issues/319). – Jon

1

Bạn có thể sử dụng onmousedown để phát hiện cú nhấp chuột và kích hoạt() cuộc gọi.

+0

Tôi không thể làm việc với tình huống sau: Đôi khi có thể chọn các yếu tố của trang bằng cách sử dụng phím Tab. Ví dụ, nếu tôi đã chọn theo cách này một hộp kiểm, tôi có thể kiểm tra/bỏ chọn bằng cách sử dụng phím khoảng trắng. Hoặc thậm chí mở một drodpdown bằng cách sử dụng phím mũi tên xuống. –

1

Câu trả lời được chấp nhận không phù hợp với tôi. Đã 6 năm rồi và jQuery đã thay đổi rất nhiều kể từ đó.

Ví dụ: event.originalEvent trả về luôn true với jQuery 1.9.x. Ý tôi là đối tượng luôn tồn tại nhưng nội dung thì khác.

Những người sử dụng phiên bản jQuery mới hơn có thể dùng thử phiên bản này. Hoạt động trên Chrome, Edge, IE, Opera, FF

if ((event.originalEvent.isTrusted === true && event.originalEvent.isPrimary === undefined) || event.originalEvent.isPrimary === true) { 
    //Hey hooman it is you 
} 
-1

Trong trường hợp bạn có quyền kiểm soát của tất cả các mã của bạn, không có người ngoài hành tinh gọi $(input).focus() hơn setFocus().

Sử dụng biến toàn cầu là một cách chính xác cho tôi.

var globalIsHuman = true; 

$('input').on('focus', function(){ 
    if(globalIsHuman){ 
     console.log('hello human, come and give me a hug'); 
    }else{ 
     console.log('alien, get away, i hate you..'); 
    } 
    globalIsHuman = true; 
}); 

// alien set focus 
function setFocus(){ 
    globalIsHuman = false; 
    $('input').focus(); 
} 
// human use mouse, finger, foot... whatever to touch the input 

Nếu một số người nước ngoài vẫn muốn gọi $(input).focus() từ hành tinh khác. Chúc may mắn hoặc kiểm tra các câu trả lời khác

+0

Điều này chỉ ngăn cản mọi người gọi 'setFocus()' - nó không ngăn cản mọi người kích hoạt sự kiện trọng tâm. Không viết 'setFocus()' ở tất cả cũng sẽ ngăn chặn mọi người gọi nó, vì vậy tôi không thấy lợi ích. Trong thực tế, mọi người vẫn có thể gọi '$ ('input'). Focus()' và có nó vượt qua. – Rob

+0

wow, lần đầu tiên tôi có ai đó bình luận ngay sau khi tôi trả lời câu hỏi, tôi sẽ cập nhật câu trả lời – vanduc1102

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