通过代码将事件对象传递给函数

时间:2013-10-30 18:10:26

标签: javascript function events backbone.js

我对我的问题的回答看起来很多,但还没有找到类似的东西。本质上,我想调用一个接受事件的函数,通常会通过点击或其他事件附加到元素,而只是直接调用它。

从本质上讲,我知道我可以这样做来调用我的函数(用jQuery编写):

function updateThisValue(event) {
    ...some code...
}

jQuery('#myElement').on('click', updateThisValue);

jQuery('#myElement').trigger('click');

有没有办法直接调用函数?

function updateThisValue(event) {
    ...some code...
}

updateThisValue(***jQuery event object here***);

对于上下文,我使用Backbone更新网页上的表单,并定义了一个自定义视图,该视图被定义为在特定事件上调用其方法之一(updateThisValue)。在同一View的不同方法中,我希望能够直接调用“updateThisValue”方法。但是,“updateThisValue”在其代码中使用事件对象。因此,如果我直接调用该方法,则会因错误而失败。

有办法做到这一点吗?或者我只是必须手动(通过代码)按照我的第一个I-know-I-can-do-it-way-example示例触发事物?只是感觉像是一个黑客,就是这样。

感谢。

2 个答案:

答案 0 :(得分:1)

如果您拥有 jQuery事件对象,则只能使用jQuery事件对象调用updateThisValue

所以你可以这样做:

var updateThisValue = function(e) {
 //...
}

//The below two pieces of code are equivalent.
$('#myelement').on('click',updateThisValue);

$('#myelement').on('click',function(e) {
   updateThisValue.apply(this,[e]);
});

我在第二个代码示例中使用.apply()并且不直接执行updateThisValue(e)的唯一原因是,您希望在{{this中使用updateThisValue的引用1}} function(它将引用处理该事件的dom节点)。如果您不需要this中对updateThisValue的引用,那么您可以轻松地执行以下操作:

$('#myelement').on('click',function(e) {
   updateThisValue(e);
});

答案 1 :(得分:0)

如果您发现自己需要直接调用方法,则可能不应该以直接处理事件的方式定义该方法。我建议重构你的代码:

function updateThisValue(arg0, arg1, arg2, ...) {
    ... some code ...
}

function updateThisValueUsingEvent(event) {
    // do nothing except extract the necessary values from event
    updateThisValue(event.target, event.which);
}

jQuery('#myElement').on('click', updateThisValueUsingEvent);
// direct invocation:
updateThisValue($(selector)[0], 2);

从MVC的角度来看,updateThisValue函数是Controller的一部分。 updateThisValueUsingEvent是从View到Controller的绑定。特别是因为它听起来像直接处理你的模型(通过更新值),你应该尝试分离视图/控制器纠缠。

您还可以在事件绑定调用中将updateThisValueUsingEvent定义为内联匿名函数:

jQuery('#myElement').on('click', function(e) {
    updateThisValue(e.target, e.which);
});