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に追加されます。最初のクリックでオブジェクトが正常に設定に追加されますが、2番目のクリックでコンソール書き込みエラーが発生します

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.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 に答える
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 に答える