1

その核となる私の問題は次のとおりです。

$('input').click (e) ->
  # do some things conditionally, depending on the event origin
  false

$('a').click ->
  $('input').click()

問題は、誰がイベントを開始したかをどうやって見分けることができるかということです。

どちらの場合も注意してください(入力をクリックするかリンクをクリックするかe.targetは同じです)。

更新:上記のコードをここに投稿しました:http://jsfiddle.net/w7faW/1/

ありがとう。

4

4 に答える 4

2

イベントハンドラーに追加のパラメーターを渡すことができます[1]:

$('input').click (e, triggered) ->
  if triggered then x
  false

$('a').click ->
  $('input').trigger('click', true)

これにより、追加の引数を使用して、クリックの発生元(ユーザーが開始またはプログラム)を識別したりe.target、アンカークリックからを中継したり、イベントハンドラーにデータを送信したりできます。

[1] http://api.jquery.com/trigger/

于 2012-05-15T22:52:58.460 に答える
1
$('input').click (e) ->
      if $(@).data 'triggeredBy'?
          #do something         
      false

$('a').click (e) ->
    $('input').data 'triggeredBy', e.target
    $('input').click()

以前のターゲットを実際のイベントオブジェクトに保存する方法があるかもしれませんが、理解しやすくするために、とにかくjQueryデータ属性に保存します。基本的に、トリガーする前にトリガーをトリガー対象に接続します。そうすれば、事後にそれを取り戻すことができます。

トリガーについてさらに具体的にする必要がある場合(同じイベントをトリガーする複数のオブジェクトがある場合)、次のようにすることができます。

ラウンドトリップのカスタムイベントで更新

input = $('input')
thingyOne = $('#thingyOne')
thingyTwo = $('#thingyTwo')

input.on 'inputClick', (e, triggerer) ->
      that = $(@)
      if triggerer.is thingyOne
          #do something         
      else triggerer.is thingyTwo
          #do something else
      else triggerer.is that
          #do something if triggerer and triggeree are the same
      false

attachAndTrigger = (triggerer,triggeree) ->
    triggerer.on 'click', ->
        triggeree.trigger 'inputClick', triggerer  

attachAndTrigger thingyOne, input
attachAndTrigger thingyTwo, input
attachAndTrigger input, input
于 2012-05-15T21:38:17.120 に答える
1

trigger次の関数を使用してプログラムでイベントをトリガーするときに、パラメーターを渡すことができます。

$('input').click (e, target = e.target) ->
  console.log 'target:', target
  false

$('a').click (e) ->
  $('input').trigger 'click', this

targetデフォルトでに設定されているオプションの引数をe.target渡しています。リンクをクリックすると、リンク自体がそのパラメーターとして渡されます。次に、そのパラメーターを使用して、トリガー要素がどれであるかを確認できます。このjsfiddleでさまざまな出力を確認できます。


ただし、この単純な例を考えると、このソリューションはおそらく少し混乱していると言わなければなりません。両方の要素( jsfiddle)のクリックハンドラーと同じ関数を使用することをお勧めします。

$('input, a').click (e) ->
  console.log 'target:', e.target
  false

または、要素ごとに異なることを行い、次に両方に共通することを行う必要がある場合は、その一般的な動作に別の関数を使用できます。

$('input').click (e) ->
  # Do something special for the input.
  commonClickHandler this, e

$('a').click (e) ->
  # Do something special for the link.
  commonClickHandler this, e

somethingCommon = (element, event) ->
  # Do something common for both elements.
于 2012-05-15T23:28:28.523 に答える
0

申し訳ありませんが、コーヒースクリプトはわかりませんが、トリガーされた要素がわかります。要素について詳しく知りたい場合は、クラスやIDなどの属性を確認できます。

$('a').click(function(e) {
    var target = e.target,
        $target = $(target);

    console.log( 'This element is: ' + target.nodeName );    
    console.log( 'This class is: ' + $target.attr('class') );
    console.log( 'This ID is: ' + $target.attr('id') );
});
于 2012-05-15T22:03:18.783 に答える