イベントが人間によってトリガーされているかどうかを確認する


140

イベントにハンドラーがアタッチされていて、それがトリガーによってトリガーされた場合にのみ実行したいのですが、trigger()メソッドでは実行しません。どうやって違いを見分けるのですか?

例えば、

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

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

回答:


212

あなたはチェックすることができますe.originalEvent:それが定義されている場合、クリックは人間です:

フィドルを見てくださいhttp://jsfiddle.net/Uf8Wv/

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

フィドルの私の例:

<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これはどこかに文書化されていますか?
サイムVIDAS

@Simeわかりませんが、標準だと思います。ここを見てください:api.jquery.com/category/events/event-object
Nicola Peluchetti

@Nicolaなるほど、jQueryのことです。jQueryは、このプロパティ内に元のイベントオブジェクトを格納します。ところで、あなたが知らないってどういう意味ですか?あなただけのドキュメントへのリンク提供:)
サイムVIDAS

1
あなたも使用できるように見えますevent.isTrigger
avoliva

1
@Anurag、私はたった今同じ問題に遭遇していました。originalEventイベントがによってトリガーされたときにjQueryにデータが読み込まれるように見えDOM.click()ますが$($("#try")[0]).click();、を使用できます。
Daniel Garrett

19

上記よりも簡単です:

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

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

これが最良の答えです。説明については、以下を参照してください。stackoverflow.com/questions/10704168/...は
jaredjacobs

3
これは魅力的であり、実際には居心地がよいでしょうが、jQuery開発者は、現時点でisTriggerはパブリックAPI に卒業したくないことに注意してください。
Jon

7

これを行う唯一の方法triggerは、ドキュメントのとおり、呼び出しで追加のパラメーターを渡すことだと思います

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

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

例:http : //jsfiddle.net/wG2KY/


1
イベントオブジェクトのプロパティoriginalEventをチェックアウトできます。イベントがクリックから発生していない場合、イベントは定義されていません
Nicola Peluchetti


1
何らかの理由で、Zeptoの「クリック」ハンドラーを使用すると、event.originalEventが機能しませんでした(1を再試行し続けただけです)。だから私は上記の解決策を試しました。魅力のように働いた。
Larrydx 2016

7

受け入れられた答えは私にとってはうまくいきませんでした。それから6年が経過し、それ以来jQueryは大きく変化しました。

たとえば、jQuery 1.9.xではevent.originalEvent常に戻ります。trueオブジェクトは常に存在しますが、内容は異なります。

jQueryの新しいバージョンを使用している人は、これを試すことができます。Chrome、Edge、IE、Opera、FFで動作します

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

3

現在、ほとんどのブラウザーはevent.isTrustedをサポートしています

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

ドキュメントから:

インターフェイスのisTrusted読み取り専用プロパティは、イベントがユーザーアクションによって生成された場合 はtrue 、スクリプトによってイベントが作成または変更された場合、またはEventTarget.dispatchEvent()を介してディスパッチされた場合は falseです。EventBoolean


0

onmousedownを使用して、マウスクリックとtrigger()呼び出しを検出できます。


次のシナリオでは機能しない可能性があります。Tabキーを使用してページの要素を選択できる場合があります。たとえば、この方法でチェックボックスを選択した場合、スペースキーを使用してチェック/チェック解除できます。または、下矢印キーを使用してドロップダウンを開くこともできます。
Diego Favero

0

次のように、マウスの位置を確認する可能性について考えます。

  • クリック
  • マウスの位置を取得
  • ボタンのコードを重ねる
  • ...

次のシナリオでは機能しない可能性があります。Tabキーを使用してページの要素を選択できる場合があります。たとえば、この方法でチェックボックスを選択した場合、スペースキーを使用してチェック/チェック解除できます。または、下矢印キーを使用してドロップダウンを開くこともできます。
Diego Favero

0

すべてのコードを制御できる場合は、$(input).focus()以外のエイリアンコールはありませんsetFocus()

グローバル変数を使用するのが正しい方法です。

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

一部のエイリアンがまだ$(input).focus()別の惑星から電話をかけたい場合。幸運を祈るか、他の答えを確認してください


これは、人々が電話をかけることを防ぐだけですsetFocus()-それは人々がフォーカスイベントをトリガーすることを防ぎません。setFocus()何も書かないことはまた、人々がそれを呼ぶことを妨げるでしょう、それで私は利益を見ません。実際、人々はまだ電話$('input').focus()してそれを通過させることができました。
ロブ

うわー、質問に答えた直後に初めて誰かがコメントしたとき、私は答えを更新します
vanduc1102

他のサードパーティのスクリプトを使用せずに閉じた環境で作業している場合、これは完璧な世界で機能します。ただし、最も実用的なアプリケーションは、あらゆる種類のプラグインとスクリプトが追加されているクライアントサイト用であり、その焦点を非常によく呼びます。これを助けるかもしれない1つのことは、コード(およびその関数を呼び出す必要があるすべてのコード)を次のようなスコープ付き関数でラップすることです:(function(){/*your code here*/})();これにより、setFocus関数が呼び出されないようにし、ブール値が外部スクリプトによって変更されないようにします。
Xandor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.