jQueryでは、プログラマティッククリックとユーザークリックをどのように区別できますか?


91

クリックハンドラーを定義したとします。

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

});

関数ハンドラー内で、イベントがプログラムによって発生したのか、それともユーザーによって発生したのかをどのように確認できますか?


プログラムはどのようにしてプログラムでイベントを発生させますか?
クレイトン

5
なぜケースを区別する必要があるのですか?
Damien_The_Unbeliever 2011

@クレイトン:$x.click()または$x.trigger('click')
muが短すぎる

画像を自動的にスクロールする画像スライダーがある状況で、画像に関連付けられた正しいナビゲーションアイテムのクリックをトリガーすることでそうしました。問題は、ユーザーがナビゲーションをクリックすると、自動回転が停止することです。
カサポ

2
これは最新のFirefox、Chrome、IE9で動作します。投票数が最も多い以下の回答を受け入れませんか?@kevino
OZZIE

回答:


119

イベントオブジェクトを確認できますe。イベントは、実際のクリックによってトリガされた場合は、次のようなものがあるでしょうclientXclientYpageXpageY、などの内部をe、彼らは数字になります。これらの番号は、クリックがトリガーされたときのマウスの位置に関連していますが、キーボードからクリックが開始された場合でもおそらく存在します。イベントがトリガーされた場合、$x.click()では通常の位置の値は得られませんeoriginalEventプロパティを確認することもできます$x.click()。これは、イベントがから発生した場合には表示されません。

多分このようなもの:

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

そして、ここで遊ぶための小さなサンドボックスがあります:http : //jsfiddle.net/UtzND/


4
それはすごい...「多分jQueryでトリガーされたイベントにはマウスの位置情報がない」と私は思いました。w00t!
カサポ

2
これは、createEventをサポートするブラウザーで無効にすることができます。 jsfiddle.net/UtzND/26
Joe Enzminger

2
@JoeEnzmingerはい、でも、いわば自分のスクリプトを打ち負かして...?
OZZIE 2013年

3
サードパーティのスクリプトがクリックイベントを生成し、スクリプトがユーザー生成(実際のクリック)であると想定してそれを処理することを心配しています。
Joe Enzminger 2013年

2
@JoeEnzminger:コードがブラウザーに表示されると、すべての賭けは無効になります。十分に利口な人に打ち負かされない、あなたができることは何もありません。あなたができる最善のことは、たくさんのことを確認することです:ありoriginalEventますか?それは正しいことですか?どこかにコーディネートはありますか?座標は一貫していますか?座標は内側#fooですか?...
muが短すぎます

44

jQueryトリガーのマニュアルに記載されているように、追加のパラメーターを使用できます

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

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

3
私はこれを見る唯一の問題は、あなたが通常のクリックとを区別することができないということです$x.click().click()呼び出し側が明示的に、彼らはそれを偽造していることを伝える必要があります。これは、Kevin Owockiの状況に応じて、問題となる場合とされない場合があります。
muが短すぎる

1
@mu:「通常の」クリック(ユーザー?)と$x.click()eventHandlerであるユーザークリック(ユーザーのクリックの場合、「通常」である可能性があります)の違いがよくわかりません
Shikiryu

1
違いは、1つはユーザーからのもので、もう1つはソフトウェアからのものです。偽のクリックは、追加の引数を追加するように変更できないプラグインまたはその他のコードからのものである可能性があります。私はあなたの解決策を批判するのではなく、いくつかの可能な穴に注意します。
muが短すぎる

muは正しいので、すべての状況でこれが機能するわけではありませんが、それはまさに私が探していたものでした、ありがとう!varのような追加のパラメーターを渡すことができることを知りませんでしたが、「実際の」クリックをプログラムとして処理する複雑なUIで「実際の」クリックをテストするために必要なのはまさにそれです。両方の信じられないほど便利なソリューションをありがとう!
Phil

9

すでに回答されている別の質問があります。

click()がマウスクリックか、コードによってトリガーされたかを検出するにはどうすればよいですか?

whichイベントオブジェクトのプロパティを使用します。undefinedコードによってトリガーされるイベント用である必要があります

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

JsFiddleの例-http : //jsfiddle.net/interdream/frw8j/

それが役に立てば幸い!


2
常に機能するとは限りません。例えば、本物のイベントのためにさえselect与えるでしょうe.which==undefined
JNF 2016年

5

上記の解決策をすべて試しましたが、私の場合は何もうまくいきませんでした。以下の解決策は私のために働きました。それがあなたにも役立つことを願っています。

$(document).ready(function(){
  //calling click event programmatically
    $("#chk1").trigger("click");
});

$(document).on('click','input[type=checkbox]',function(e) {
		if(e.originalEvent.isTrusted==true){
			alert("human click");
		}
		else{
			alert("programmatically click");
		}
    
    });
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js">
</script>

<input type="checkbox" id="chk1" name="chk1" >Chk1</input>
<input type="checkbox" id="chk2" name="chk2" >Chk2</input>
<input type="checkbox" id="chk3" name="chk3" >Chk3</input>


4

DOMレベル3はevent.isTrustedを指定します。これは現在、IE9 +とFirefoxでのみサポートされています(私のテストに基づきます。徹底的に調査していませんが)一部のブラウザーではオーバーライド可能であり、実際には(残念ながら)100%信頼できる状態ではないことも確認しました。

これは、IEとFirefoxで動作する@muのフィドルの修正バージョンです。


いい視点ね。でも100%しっかりしているとは思いません。isTrustedがサポートされており、書き込み可能でないかどうかを確認するには、いくつかのテストを組み合わせる必要があります。本当の答えは、この質問の背後にある理由に依存すると私は思います。
muが短すぎる

@mu、私は同様の、しかしより一般的な質問をした後にこの質問に来ました。私の "なぜ"のケースは、ユーザーがページで直接肯定的なアクションを実行した場合にのみ、アクション(金融トランザクションですが、小さなトランザクション)のみを実行したいということです。
Joe Enzminger 2012

1

バニラjsソリューション:

document.querySelector('button').addEventListener('click', function (e){
    if(e.isTrusted){
        // real click.
    }else{
        // programmatic click
    }
});

-1

知的な議論、フィルターに私のために働いたコードに参加するつもりはない.click().trigger('click')は-

$(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
    }
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.