1

我的问题在某种程度上与这里的问题有关。我正在尝试做一个显示消息的插件,然后将其淡出。

这是插件:

(function($) {
$.fn.showWarning = function(msg) {
    return this.each(function() {
        $(this).text(msg).show().hide(); // <-preloads message
        $(this).fadeIn('fast', function() {
            $(this).stop().text(msg);
            setTimeout(function() {
                $(this).fadeOut(300);
            }, 2500);
        });
    });
};
})(jQuery);

整个代码在这里:http: //jsfiddle.net/e5kns/6/

问题是消息不会消失,所以我想它与setTimeout有关系。也许 $(this) 没有引用它应该在哪里?

Firebug给出:

a.ownerDocument 未定义

未捕获的类型错误:无法读取未定义的属性“defaultView”

4

2 回答 2

3

你可以

$(this).stop().text(msg).delay(2500).fadeOut(300)


事实上,this除了window. 因为浏览器正在调用this设置为的超时回调windowthis仅基于函数的调用方式。

setTimeout($.proxy(function() {
    $(this).fadeOut(300);
}, this), 2500);

会解决这个问题,因为它会生成另一个函数,该函数会丢弃this并使用原始函数提供的this和明确applie的 s。

于 2012-07-26T18:34:21.273 回答
1

尝试这个,

(function($) {
    $.fn.showWarning = function(msg) {
        return this.each(function() {
            $(this).text(msg).show().hide(); // <-preloads message
            $(this).fadeIn('fast', function() {
                $this = $(this);
                $(this).stop().text(msg);
                setTimeout(function() {
                    $this.fadeOut(300);
                }, 2500);
            });
        });
    };
})(jQuery);

ps:正如@Esailija 建议的那样,delay 和fadeout 更好

于 2012-07-26T18:39:55.420 回答