0

簡単な通知システムを書いていますが、JS / jQuery(フロントエンドは私にとっては新しい)を学んでいるだけで、問題があります。私は次のコードを書きました:

 (function ($) {

    var notification = function(title, msg, duration) {
        this.element = $('<div class="notification"><h3>' + title + '</h3><div class="notification_body">' + msg + '<br/><i>(для скрытия уведомления кликните здесь два раза)</i></div></div>');
        this.element.dblclick(notification.hide);
        $('#notifications_bar').prepend(this.element.hide().fadeIn(1000));
    }

    notification.hide = function() {
        var $this = this;
        this.element.fadeOut(1000, function () {
            $this.element.remove();
        })
    }

    $.extend({
        notify: function(title, msg, duration) {
            return new notification(title, msg, duration);
        }
    });
})
    (jQuery);

しかし、メソッドにエラーがありますnotification.hidethis.elementisundefined。エラーが発生した場所を説明していただけますか?ありがとうございました。

4

1 に答える 1

4

オブジェクトに直接アタッチされた関数を渡すと、関数はアタッチされたオブジェクトを忘れます(したがって、値がthis変更されます)。これは、関数が呼び出されるまでこの値が解決されないためです。

代わりに、関数に使用したのと同じアプローチを使用してくださいfadeOut(への参照を保存しthis、無名関数内で使用します。

var $this = this;
this.element.dblclick(function () {
    $this.hide();
});

または、後で接続する場所に関係なく、関数に値を強制するjQuery.proxy()またはFunction.prototype.bind()(ES5準拠のブラウザーのみ)を使用できます。this

this.element.dblclick(jQuery.proxy(notification.hide, this));
于 2013-03-09T10:27:34.907 に答える