2011-07-14 5 views
105

イベントにハンドラが添付されており、トリガ()メソッドではなく人間によってトリガされた場合にのみ実行したいと考えています。違いをどのように伝えますか?例えばイベントが人によってトリガーされているかどうかをチェック

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

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

私はこの質問をどのようにしてGoogleに解決するかを考えていました。 – minexew

+0

@minexewプログラミングを使うのが難しいのは、名前付け変数とGoogleの問題の仕方です!:P –

答えて

163

あなたはe.originalEventを確認することができます。クリックがヒトで定義されていた場合:

まっすぐ
<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

@ニコラこれはどこに文書化されていますか? –

+0

@Sime私は知らないが、私はそれが標準だと思う。ここを見てください:http://api.jquery.com/category/events/event-object/ –

+0

@ニコラ私はそれがjQueryのものだとわかります。 jQueryは元のイベントオブジェクトをこのプロパティの中に格納します。 Btw、あなたが知らないことは何を意味するのですか?ドキュメントへのリンクを提供したばかりです。 ':)' –

5

私はこれを行うための唯一の方法は、documentationあたりとしてtrigger呼び出しで追加のパラメータを渡すことであろうと思います。

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

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

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

+1

イベントオブジェクトのプロパティoriginalEventをチェックアウトすることができます。イベントがクリックから来ていない場合、それは定義されていません –

+0

[トリガーとともにデータを渡す](http://api.jquery.com/trigger/)間違いなく委任されたイベントに行く方法です。 [少なくともclickイベントはパラメータを取っていないようです](http://jsfiddle.net/notacouch/Uf8Wv/69/)。しかし、[カスタムイベントを作成する場合は、パラメータを渡すことは問題ありません](http://jsfiddle.net/notacouch/Uf8Wv/68/)。 – notacouch

+1

何らかの理由で、Zeptoの「クリック」ハンドラを使用しているときに、event.originalEventが私のために機能していませんでした。だから私は上記の解決策を試しました。魅力のように働いた。 – Larrydx

1

私はあなたが同じように、マウスの位置を確認する可能性について思うだろう:

  • クリック
  • 取得マウスの位置
  • はのCOORDSと重なりますボタン
  • ...
+0

以下のシナリオでは動作しないことがあります:Tabキーを使ってページの要素を選択することが時々あります。たとえば、この方法でチェックボックスを選択した場合は、スペースキーを使用してチェック/チェックを外すことができます。あるいは下矢印キーを使ってdrodpdownを開くことさえできます。 –

13

より:フィドルフィドルでhttp://jsfiddle.net/Uf8Wv/

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

私の例で

ルック

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

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

これは最高の答えです。説明のためには、以下を参照してください:http://stackoverflow.com/questions/10704168/in-javascript-what-is-event-istrigger – jaredjacobs

+1

これは魅力的ですが、実際は居心地が悪いですが、jQueryの開発者は、 isTrigger'を公開API(この時点では)に公開しています(https://github.com/jquery/api.jquery.com/issues/319)。 – Jon

1

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

+0

以下のシナリオでは動作しない場合があります。Tabキーを使用してページの要素を選択することが時々可能です。たとえば、この方法でチェックボックスを選択した場合は、スペースキーを使用してチェック/チェックを外すことができます。あるいは下矢印キーを使ってdrodpdownを開くことさえできます。 –

1

私にとってはうまくいかないそれは6年後、jQueryはそれ以来ずっと変わってきました。

たとえば、event.originalEventは、常にtrueをjQuery 1.9.xで返します。オブジェクトは常に存在しますが、コンテンツは異なります。

jQueryの新しいバージョンを使用している人はこれを試すことができます。すべてのあなたのコードのコントロールを持っている包みなさい、ない外国人がsetFocus()より$(input).focus()を呼び出していないクロム、エッジ、IE、オペラ、FF

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

で動作します。

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

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()に電話したい場合は、 幸運を祈るか、他の回答を確認してください

+0

これは人々が 'setFocus()'を呼び出さないようにするだけです - 人々がフォーカスイベントを引き起こさないようにしません。 'setFocus()'をまったく書いていないと、人々はそれを呼び出すこともできないので、私は利益を見ません。実際、人々は '$( 'input').focus()'を呼び出して渡すことができます。 – Rob

+0

うわー、私は質問に答えた直後に誰かがコメントを持っている、私は答えを更新する – vanduc1102

関連する問題