2012-11-25 92 views
2

我想爲自己的物體做一些設置,女巫可以在追加物體時識別相同的物體並將它們落下。爲什麼class的屬性缺失?

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是否被破壞?

+0

''.each'回調裏面的'this'與外面的'this'不一樣。在每個之前放置一個'var that = this',並在回調中訪問'that.set'。 – DCoder

+1

這就是我看到它時的想法;改變事件的背景,但爲什麼第一次沒有錯誤?我認爲它第一次在this.set [this.set.length ** + 1 **]處添加一個元素。下一次(發生錯誤時)在this.set [1]處添加一個元素,它會檢查這個元素。設置未設置的[0]。 – HMR

回答

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}; 
}; 
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

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; 
}