参数是否始终传递给.click()方法参数的Event对象?

时间:2016-04-22 09:18:16

标签: javascript jquery events javascript-events event-handling

我只是想了解.click()方法中的参数是如何工作的。根据我的理解,.click()方法将函数作为参数。

根据jQuery API,.click()可以采用两个参数:

([eventData], event handler)

然后事件处理函数可以使用此参数:

(Event eventObject) 

这是否意味着.click()方法的函数参数总是期望"事件对象"被传递给它?

就像下面的例子一样,我创建了一个随机对象,然后将其作为参数传递。 .click()方法的函数参数似乎忽略它是一个随机对象并继续将它用作"事件对象"。

var anObject = {
  "property1" : "someproperty"
};

$(document).click(function(anObject) {
  var x = anObject.pageX;
  var y = anObject.pageY;

  logClicks(x, y);
});

var logClicks = function(x, y) {
  console.log("x: " + x + " y: " + y)
}

问题是,引擎盖下发生了什么?为什么会这样?

修改

我对[eventData]参数以及事件处理程序如何使用它并不那么困惑。更多关于它的函数参数排序如何将传递给它的任何参数转换为保存Event对象的变量

3 个答案:

答案 0 :(得分:2)

  

这是否意味着.click()方法的函数参数总是期望" Event对象"要传递给它?

是的,传递给事件处理函数的参数总是是一个jQuery事件对象。

您的混淆似乎在([eventData], event handler)方法的click()签名周围。在这种情况下,第一个参数用于向提供给事件处理程序的data对象的event参数添加值。对于您的问题中的代码,您可以使用:



var anObject = {
  "property1" : "someproperty"
};

$(document).click(anObject, function(e) {
  var x = e.pageX;
  var y = e.pageY;
  var data = e.data.property1;
  logClicks(data, x, y);
});

var logClicks = function(data, x, y) {
  console.log(data, x, y)
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您将匿名函数作为参数传递给.click()函数。

因此,该函数具有不同的范围,anObject不是您已全局声明的内容,而是实际上由jQuery API传递的内容。

var anObject = {
  "property1" : "someproperty"
};

$(document).click(function aNewFunctionWithHisOwnScope(anObject) {
  // here anObject references an Event
  x = anObject.pageX;
  y = anObject.pageY;

  logClicks(x, y);
});

// here anObject references again your defined anObject

最后,是的:总是成为一个事件

编辑,因为我可能还不清楚:

你的anObject var可以从匿名函数中获得,因为它就像一个全局变量。但由于它们具有同名,因此在函数内部使用最后一个引用,因此使用的值(在函数内部)是作为参数传递的值,而在函数外部是'global' anObject保持其价值。

答案 2 :(得分:0)

click([eventData], event handler)中的第一个参数需要eventData,它将进一步传递给事件处理程序,之后您可以使用event.data访问该数据:

$(document).click(anObject, function(e) {
  x = e.pageX;
  y = e.pageY;

  // access the object passed as e.data
  console.log(e.data.property1);

  logClicks(x, y);
});