JS - 使用事件处理程序将参数传递给函数

时间:2015-09-09 11:57:29

标签: javascript function

我想将参数传递给已经处理事件对象的函数:

function bla(e){
   //function code
   e.preventDefault();
   e.stopPropagation();
   return false;
}

但我需要从另一个传递参数的地方调用此函数:

bla(arg);

我不知道怎么......我试过了:

bla(e, arg); //failed

function bla(){
     (function (e){
         e.preventDefault();
         e.stopPropagation();
     }());
}//e is undefined

function bla(){
    var e = window.event;
    //code....
    //e is undefined;
}

和其他人没有任何作用,我可以做些什么?

2 个答案:

答案 0 :(得分:0)

一种选择是修改您的事件处理程序。您可以在处理程序中使用匿名函数来停止传播等,然后调用您的方法。这样,bla方法不关心处理事件,可以在代码中的其他位置调用。但是如果你有很多使用这种方法的事件会重复代码:

someElement.on('someEvent', function(e, data){
    e.preventDefault();
    e.stopPropagation();
    bla(data);
});

另一种选择是创建另一个处理事件的方法,然后用数据调用你的结束事件处理程序。

function genericEventHandler(fn, context){
    return function(e) {
        e.preventDefault();
        e.stopPropagation();
        /*
           This will allow it to call fn with any number of arguments
        */
        var args = [].splice.call(arguments, 1);
        fn.apply(context, args);
    }
}

someElement.on('someEvent', genericEventHandler(bla));
someElementTwo.on('someOtherEvent', genericEventHandler(bla));

通过这种方式,您可以为方法之间的通用行为创建多个方法,还可以更轻松地更改此通用行为,因为您只需要在一个位置更改它。

我认为当您尝试手动调用bla时,现有尝试失败的原因是因为e对象不存在(如果您尚未传入)或者不存在有正确的结构。

编辑:有一个最终选项,但如果可能的话,我真的会建议不要使用上述选项。正如其他人所说,你真的应该避免链接你的应用程序和事件逻辑。拆分这些将阻止你需要提供null/undefined作为bla的第一个参数,如果你或团队中的其他人忘记它将导致奇怪的错误。如果需要,它还可以使您的事件处理程序更容易测试,并在应用程序的其他位置使用。

function bla(e, data){
    if (e !== undefined) {
        e.preventDefault();
        e.stopPropagation();
    }
    //do something with data
}

bla(undefined, 'some random data');

答案 1 :(得分:0)

好的,谢天谢地,我有答案:

function bla(e, data){
     //code...
     if(e !== NULL){
        e.preventDefault();
        e.stopPropagation();
     }
}

这是完美的。

bla(null,data)