嘿,我使用easelJS构建了一个画布。 在我的画布中,我有点使用以下语法为它们定义点击处理程序:
p.on("click", handleMouseClickEvent);
现在我想将参数传递给处理程序 handleMouseClickEvent ,我知道我在没有传递的情况下免费获取事件对象,但是当我尝试传递一个参数时,我想写一下: / p>
p.on("click", handleMouseClickEvent(arg1));
然后事件对象未定义且根本无法访问。 如何使用上述语法传递事件对象和更多参数。
p.on("click", handleMouseClickEvent(arg1,arg2,...,argN));
答案 0 :(得分:5)
使用jQuery时,Ravi的答案可能是最好的方法。 我会尝试提供另一个视角来解决你的问题。
使用
p.on("click", handleMouseClickEvent(arg1));
您没有将该函数作为事件处理程序传递,您正在执行它并将其返回值作为事件处理程序传递。 那或许已经指出了答案,对吧? 尝试像这样定义事件处理程序:
function handleMouseClickEvent(arg1)) {
return function reallyHandleMouseClickEvent(event) {
// all variables available here: arg1, event
}
}
当然,您可以根据需要添加任意数量的argN参数。
答案 1 :(得分:3)
由于您没有自己调用处理函数(浏览器正在为您执行此操作),因此您无法为处理程序指定其他参数。你得到的只是事件对象。
但是,由于JavaScript的变量范围如何工作,您不必这样做。函数可以访问自身之外的变量,因此您只需访问变量而无需明确地传递变量:
var foo = "bar";
var handleMouseClickEvent = function(e) {
console.log(e.type); // 'click'
console.log(foo); // 'bar'
};
p.on("click", handleMouseClickEvent);
答案 2 :(得分:3)
你需要定义你的事件处理程序,试试这个:
function handleMouseClickEvent(arg1)) {
return function doSomething(event) {
//logic here
}
}
答案 3 :(得分:2)
你可以试试这个:
p.on("click", null, {arg1: "abc", arg2: "xyz"},handleMouseClickEvent);
//And in your function, you can get the event data like this
function handleMouseClickEvent()
{
alert(event.data.arg1);
alert(event.data.arg2);
}
根据官方文件,on
采用这样的论据:
.on(events [,selector] [,data],handler)
事件类型:字符串
一个或多个以空格分隔的事件类型和可选的命名空间,例如 "单击"或" keydown.myPlugin"。
选择器类型:字符串
用于过滤所选元素的后代的选择器字符串> > >触发事件。如果选择器为null或省略,则事件始终为 当它到达所选元素时触发。
数据类型:任何内容
触发事件时要在event.data中传递给处理程序的数据。
handler 类型:Function(Event eventObject [,Anything extraParameter] [,...])
事件发生时执行的功能 触发。值false也允许作为a的简写 简单地返回false的函数。
答案 4 :(得分:1)
这应该处理它。您可以添加更多参数。
(function(arg1, arg2) {
p.on("click", function(event) { handleMouseClickEvent(event, arg1, arg2) })
})(arg1, arg2);
答案 5 :(得分:1)
p.on("click", handleEventWithArg.bind(this,arg1));
function handleEventWithArg(arg1, event) {
console.log(arg1);
console.log(event);
});
.bind
方法返回一个浏览器可以使用事件对象调用的新功能。
答案 6 :(得分:1)
只是为了在混合中提出更具针对性的答案。我相信这个问题是在参考此代码集时提出的:http://codepen.io/Barak/pen/AXZxKN
从架构的角度来看,将参数注入处理程序是一种您不需要的解决方法。相反,请使用event target
访问点击/互动的内容,并确定所需的值。
对于您的示例,您正在查找用于绘制图表中的点的原始数据属性。您可以将这些属性注入显示对象,注入对原始数据对象的引用,或创建查找表以将显示对象与其相关数据点相关联。
for (...) {
var point = data[i];
var dot = new createjs.Shape();
dot.x = point.x * GRAPH_WIDTH;
// Inject property or reference
dot.point = point;
// Create lookup
lookupTable[i] = dot;
}
然后当您单击该对象时,请查找数据。
dot.on("click", function(event) {
var dot = event.target;
// Use reference
var point = dot.point;
// Or use lookup
var index = lookup.indexOf(dot);
//...do stuff with it
}
还有很多其他方法可以创建这种关系,这些只是一些建议。创建包装函数将起作用,但恕我直言,它不是一个长期或更大的应用程序的好方法。您可以完全继续使用您的方法,因为它似乎对您有用 - 但我想提供一些值得思考的食物。
干杯。