Kiểm tra xem sự kiện được kích hoạt bởi một con người


140

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

Ví dụ,

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

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

Câu trả lời:


212

Bạn có thể kiểm tra e.originalEvent: nếu nó được xác định thì 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 câu đố:

<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 Đây có phải là tài liệu ở bất cứ đâu?
Vidime Vidas

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

@Nicola Tôi thấy, đó 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 có nghĩa là gì bạn không biết? Bạn vừa cung cấp liên kết đến tài liệu:)
Vidime Vidas

1
Có vẻ như bạn cũng có thể sử dụngevent.isTrigger
avoliva

1
@Anurag, tôi vừa mới gặp vấn đề tương tự. Có vẻ như jQuery cư trú originalEventkhi sự kiện được kích hoạt bởi DOM.click(), nhưng bạn có thể sử dụng $($("#try")[0]).click();, điều này thật rắc rối, nhưng hoạt động.
Daniel Garrett

19

Thẳng hơn phía trên sẽ là:

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

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

Đây là câu trả lời tốt nhất. Để được giải thích, hãy xem: stackoverflow.com/questions/10704168/ trên
jaredjacobs

3
Mặc dù điều này rất hấp dẫn và có 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 isTriggerAPI công khai vào thời điểm này .
Jon

7

Tôi nghĩ rằng cách duy nhất để làm điều này là truyền vào một tham số bổ sung trong triggercuộc gọi theo tài liệu .

$('.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 tài sản
gốcEvent


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

7

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

Ví dụ event.originalEventtrả về luôn truevớ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 các phiên bản mới hơn của jQuery có thể thử cái 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
}

3

Hiện tại hầu hết các trình duyệt đều hỗ trợ event.isTrust :

if (e.isTrusted) {
  /* The event is trusted: event was generated by a user action */
} else {
  /* The event is not trusted */
}

Từ tài liệu :

Các isTrusted read-only tài sản của Eventgiao diện là một Boolean đó là sự thật khi sự kiện này được tạo ra bởi một hành động của người dùng, và sai khi sự kiện này được tạo hoặc sửa đổi bởi một kịch bản hoặc cử qua EventTarget.dispatchEvent () .


0

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


Tôi có thể không làm việc theo kịch bản sau: Đôi khi có thể chọn các thành phần của trang bằ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 phím cách. Hoặc thậm chí mở một drodpdown bằng phím mũi tên xuống.
Diego Favero

0

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

  • Nhấp chuột
  • Nhận vị trí chuột
  • Chồng chéo các nút của nút
  • ...

Tôi có thể không làm việc theo kịch bản sau: Đôi khi có thể chọn các thành phần của trang bằ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 phím cách. Hoặc thậm chí mở một drodpdown bằng phím mũi tên xuống.
Diego Favero

0

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

Sử dụng một biến toàn cục 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 người ngoài hành tinh 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âu trả lời khác


Điều này chỉ ngăn mọi người gọi setFocus()- nó không ngăn mọi người kích hoạt sự kiện tập trung. Không viết setFocus()gì cả cũng sẽ ngă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à vượt qua nó.
Cướp

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

Nếu bạn đang làm việc trong một môi trường khép kín không có kịch bản của bên thứ 3 / bên nào khác thì điều này sẽ hoạt động trong một thế giới hoàn hảo. Tuy nhiên, hầu hết các ứng dụng thực tế dành cho các trang web khách có tất cả các loại plugin và tập lệnh được thêm vào chúng mà rất có thể gọi trọng tâm đó. Một điều có thể giúp điều này là bọc mã của bạn (và bất kỳ mã nào cần gọi hàm đó) trong một hàm phạm vi như thế này: (function(){/*your code here*/})();Điều này sẽ giữ cho hàm setF Focus an toàn khỏi bị gọi và boolean không bị thay đổi bởi các tập lệnh bên ngoài.
Xandor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.