3

this在以下范围内遇到问题:

var test = {

    $divs: $('div'),

    init: function() {
        this.$divs.each(function(){
            $(this).on('click', test.whatsmyid);
            $(window).on("resize", test.whatsmyid);
        });
    },

    whatsmyid: function() {
        console.log($(this).attr("id"));
    }

};

test.init();

http://jsfiddle.net/4NZgd/1/

click 事件正确处理范围,this但窗口调整大小没有。我知道原因是this没有传递给窗口调整大小事件,但我不想将元素传递给whatsmyid使用变量,那么我该如何解决这个问题?

4

3 回答 3

3

那是因为this当被调用时resize是窗口。Windows 对象没有id's. 这就是它返回的原因undefined

如果要更改this函数内部,可以使用.bind

$(window).on("resize", test.whatsmyid.bind(this));

小提琴:http: //jsfiddle.net/4NZgd/2/

于 2013-10-05T17:37:17.897 回答
1

我知道已经接受了一个答案,但是并不是每个浏览器都支持 .bind ,这意味着 IE 9 以下的任何内容。

所以这是一个替代答案

http://jsfiddle.net/4NZgd/9/

var test = {

$divs: $('div'),

init: function() {
    this.$divs.each(function(){
        var $this = $(this);
        $(this).on('click', test.whatsmyid);
        $(window).on("resize", function () {
            test.whatsmyid.call($this);
        });
    });
},

whatsmyid: function() {
    console.log($(this).attr("id"));
}

};

测试.init();

于 2013-10-05T18:34:58.043 回答
0

我喜欢将 eventData 传递给绑定函数。基本上,eventData 是 javascript PlainObject,您可以传递事件的信息。jQuery 绑定()

var varModule = {
    $divs: $("div"),
    init: function() {
        var me = this;

        me.$divs.each(function() {
            $(this).bind("click", { me: $(this) }, me.findID);
            $(window).bind("resize", { me: me }, me.findID);
        });
    },
    findID: function(event) {
        var me = event.data.me;    //You will get PlainObject in event.data
        console.log(me.attr("id"));    //div object will give you id but window object wont give you id attribute
    }
};

(function() {
    varModule.init();
})();
于 2013-10-05T19:52:36.527 回答