2

我正在尝试以不同的方式创建一个可以采用可选效果回调函数的小型滚动方法。想象一下,我可以运行 scrollToEl(el, flash) ,它首先向下滚动到元素并使其闪烁。我通常会怎么做?

这就是我所做的......但它并没有真正起作用。

scrollToEl : function(el, callback) {
    // flash the selected product
    var self = this;
    $('html, body').animate({
        scrollTop: el.offset().top - 50
    }, 1000, 'swing', callback); // how to pass el here as well paired with callback?
}

flash : function(el) {
    // flash the selected product
    el.animate({
        opacity : 0.4
    }, 100, 'swing', function() {
        el.animate({
            opacity : 1
        }, 1000, 'swing');
     });
},

我想像这样使用它:

var el = $('#element');
scrollToEl(el, flash); // how to pass in to the callback function flash?
4

2 回答 2

3

您可以使用闭包:

scrollToEl : function(el, callback) {
    // flash the selected product
    var self = this;

    // Get completion callback if any
    var completion;
    if (callback) {
        completion = function() {
            callback(el); // See below if you prefer `el` to be `this` in the callback
        };
    }
    else {
        completion = $.noop;
    }
    $('html, body').animate({
        scrollTop: el.offset().top - 50
    }, 1000, 'swing', completion);
}

关于闭包的更多信息:闭包并不复杂

如果您希望回调将元素作为 接收this,您可以使用jQuery.proxy而不是您自己的包装函数:

scrollToEl : function(el, callback) {
    // flash the selected product
    var self = this;

    $('html, body').animate({
        scrollTop: el.offset().top - 50
    }, 1000, 'swing', callback ? $.proxy(callback, el) : $.noop);
}

它涉及到同样的事情,因为proxy创建了一个函数。但它并没有在调用的上下文中引入闭包scrollToEl

于 2012-05-04T08:46:30.203 回答
2

It would be more normal for a callback to have the affected element as this rather than as a parameter:

flash : function() {
    // flash the selected product
    $(this).animate({
        opacity : 0.4
    }, 100, 'swing', function() {
        $(this).animate({
            opacity : 1
        }, 1000, 'swing');
     });
}

and then use a closure that uses .call or .apply to bind el to this when it's invoked:

$('html, body').animate({
    scrollTop: el.offset().top - 50
}, 1000, 'swing', callback ? function() {
    callback.call(el);
} : undefined);
于 2012-05-04T08:54:01.683 回答