在参数中传递函数,以便在加载时运行

时间:2012-12-14 08:55:50

标签: javascript jquery

这是在加载时运行的全局函数:

$.fn.loadfns = function(specificfns) {
    $('#wrapper').hide();
    $('#load').fadeIn(400);
    $(window).load( function() {
        $('#load').fadeOut(400, function() {
            $('#wrapper').fadeIn(600, function() {
                specificfns;
            })
        })
    });
};

问题是,有些页面需要在加载后运行其他函数(比如将事件插入glDatePicker),所以我试图将它们作为loadfns的参数传递,比如

$.fn.loadfns("alert('I won't be run');");

但没有任何反应,它没有被执行。如果我做

... rest of function ...
$('#wrapper').fadeIn(600, function() {
    alert(specificfns);
})

警告“警告('我不会跑');” (没有括号)应该作为一种功能。

1 个答案:

答案 0 :(得分:3)

要传递函数,可以传递函数,而不是字符串。

如果你想只允许一个额外的功能(当然可以调用其他功能):

$.fn.loadfns = function(extraFunction) {
$('#wrapper').hide();
$('#load').fadeIn(400);
$(window).load( function() {
  $('#load').fadeOut(400, function() {
    $('#wrapper').fadeIn(600, function() {
        if (extraFunction) {
            extraFunction();
        }
    })
  })
});
};

像这样使用:

$("....").loadfns(function() {
     alert("Do something");
});

如果要允许多个额外功能,请传入一个数组:

$.fn.loadfns = function(extraFunctions) {
$('#wrapper').hide();
$('#load').fadeIn(400);
$(window).load( function() {
  $('#load').fadeOut(400, function() {
    $('#wrapper').fadeIn(600, function() {
        var index;

        if (extraFunctions) {
            for (index = 0; index < extraFunctions.length; ++index) {
                extraFunctions[index]();
            }
        }
    })
  })
});
};

(当然,如果您使用的是启用ES5的环境或使用垫片,则可以使用forEach代替for循环。)

像这样使用:

$("....").loadfns([doSomething, doSomethingElse]);

function doSomething() { /* ... */ }
function doSomethingElse() { /* ... */ }
// They don't have to be named, it's just clearer this way than with inline ones

如果要处理来自函数的异常,可以考虑在函数调用周围放置try/catch块。