2

我想为我自己的对象进行设置,女巫可以在追加时识别相同的对象并将它们掉落。

function ImageSet(){
    this.set = [];
}

ImageSet.prototype.length = function(){return this.set.length}
ImageSet.prototype.process = function(imgObj){
    var is_exist = false;
    $.each(this.set, function(i){
        if (this.set[i].imgHash == imgObj.imgHash){is_exist = true};
    });

    if (!is_exist){
        this.set[this.set.length + 1] = imgObj;
        return true;
    }
    return undefined;
}

var imagesChoosen = new ImageSet();

因此,当用户单击元素时,我会创建新对象并尝试将其附加到我的 ImageSet 中。在第一次单击对象成功附加到设置,但在第二次单击控制台写入错误

TypeError: this.set is undefined if (this.set[i].imgHash == imgObj.imgHash){is_exist = true};  

调用 ImageSet 的代码是:

$('#content_table a').click(function(event){
    event.preventDefault();
    el = new Image($(this).attr('href'));
    if (imagesChoosen.process(el)){
        $(this).parent().css("border", "3px dotted orange");    
    } else {
        $(this).parent().css("border", "None");
    }
    console.log(imagesChoosen.length());
    return false;
});

我无法理解。我的 ImageSet 在第一次调用后被破坏了吗?

4

3 回答 3

3

在您传递给的匿名函数内部each

$.each(this.set, function(i){
    if (this.set[i].imgHash == imgObj.imgHash){is_exist = true};
});

... 的值this是当前正在作用的数组的成员,而不是imagesChoosen

要访问它,您需要this从外部函数复制到另一个仍在范围内的变量。

var is_exist = false;
var currentImageSet = this;
$.each(this.set, function(i){
    if (currentImageSet.set[i].imgHash == imgObj.imgHash){is_exist = true};
});
于 2012-11-25T14:25:05.200 回答
1

this表示 jquery 中的当前迭代,每个迭代都使用此类关键字产生问题;您将其视为普通数组,因此我更喜欢使用 for 循环!

ImageSet.prototype.process = function(imgObj){
    var is_exist = false;
    for(var i=0; i<this.set.length; i++)
    {
        if (this.set[i].imgHash == imgObj.imgHash){is_exist = true};
    }

    if (!is_exist){
        this.set[this.set.length] = imgObj;
        return true;
    }
    return undefined;
}
于 2012-11-25T14:37:40.527 回答
1
this.set[this.set.length + 1] = imgObj;

认为应该是:

this.set[this.set.length] = imgObj;

我不熟悉 JQuery 每个函数,但以前的帖子会表明这个上下文的变化,所以我会改变每个函数:

$.each(this.set, function(i){
    if (this.set[i].imgHash == imgObj.imgHash){is_exist = true};
});

至:

for(var i=0;i<this.set.length;i++){
    if (this.set[i].imgHash == imgObj.imgHash){is_exist = true};
};
于 2012-11-25T14:28:42.147 回答