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

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 回答
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 回答
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 回答