我想为我自己的对象设置set,可以识别附加的相同对象并使它们掉落。
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。 在第一次单击对象成功附加到set,但在第二次单击控制台上写入错误
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是否会破坏?
答案 0 :(得分: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};
});
答案 1 :(得分:1)
this.set[this.set.length + 1] = imgObj;
认为应该是:
this.set[this.set.length] = imgObj;
我不熟悉JQuery的每个功能,但之前的帖子会指示更改此上下文,所以我会更改for each:
$.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};
};
答案 2 :(得分: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;
}