2013-02-10 42 views
2

HTML:this.variable = NaN的內部jQuery的點擊()

<div id="mydiv">lol</div> 

的javascript:

var oWM = new WM(); 
oWM.Add("mydiv"); 
oWM.Initialize(); 

function WM() { 
    this.ZIndex = 1000; 
    this.Windows = []; 
    this.Add = function(id) { 
     this.Windows.push(id); 
    } 
    this.Initialize = function() { 
     for (var i = 0; i < this.Windows.length; i++) { 
      $("#" + this.Windows[i]).click(function() { 
       alert("#"+this.id + ":" + this.ZIndex++); 
       $("#" + this.id).css("z-index", this.ZIndex++); 
      }); 
     } 
    } 
} 

當在DIV用戶點擊我得到一個 「南」 爲this.ZIndex ,所以我的change-zindex-on-click功能不起作用。爲什麼它不被認可,我如何使它工作?

我認爲它與jquery的$()函數有關,因爲this.Windows [i]也是在該塊內部未定義的。

http://jsfiddle.net/79sM8/

的「笑」的div點擊看看會發生什麼提前

回答

4

因爲你的點擊事件裏面,this是你所點擊的元素,而不是WM對象

感謝。

最簡單的解決將是bind點擊功能的時間提前this值:

$("#" + this.Windows[i]).click(function() { 
    alert("#"+this.id + ":" + this.ZIndex++); 
    $("#" + this.id).css("z-index", this.ZIndex++); 
}.bind(this); 

編輯 - 原來你想讀的id屬性可被點擊的元素,所以在這種情況下上面可能不起作用,因爲你仍然需要this.id來引用dom元素的id。

肯定學習如何使用function.bind,但對於這個問題,下面的解決方案是你想要的


當然這不會在IE8中工作(無墊片),所以如果這是一個的問題,你可以保存你的WM對象的this值的時間提前,並使用單擊處理程序:

this.Initialize = function() { 
    var self = this; 
    for (var i = 0; i < this.Windows.length; i++) { 
     $("#" + this.Windows[i]).click(function() { 
      alert("#"+ this.id + ":" + self.ZIndex++); 
      $("#" + this.id).css("z-index", self.ZIndex++); 
     }); 
    } 
} 
+1

self.id就會因錯誤的,因爲它沒有指向的元素。他原來的this.id會起作用,因爲它是他訪問的DOM元素的ID。 – 2013-02-10 16:55:26

+0

@steve_c - 確實 - 謝謝。 – 2013-02-10 16:57:17

+1

你也不需要使用'$(「#」+ this.id)'重新查詢,只需要'$(this)'就可以了。 – 2013-02-10 17:56:17

1

一個jQuery事件處理程序中的this背景設置爲DOM元素觸發事件。因此,您的點擊處理程序中的this將引用您的Window元素之一。

要解決這個問題,你應該保持一個局部變量指的是原來的this範圍和使用的處理程序中:

this.Initialize = function() { 
    var self = this; 
    for (var i = 0; i < this.Windows.length; i++) { 
     $("#" + this.Windows[i]).click(function() { 
      alert("#"+this.id + ":" + self.ZIndex++); 
      $(this).css("z-index", self.ZIndex++); 
     }); 
    } 
} 

或者,你可以強制設置使用在事件處理程序的正確this上下文儘管該方法在ECMA-262中是新的並且在所有瀏覽器中都不存在。鏈接的MDN頁面提供了更多詳細信息。

+2

self.id會出錯,因爲它不指向元素。他原來的this.id會起作用,因爲它是他訪問的DOM元素的ID。 – 2013-02-10 16:56:01

+0

@steve_c趕上!我還注意到,不需要使用'「#」+ this.id'對DOM元素進行另一個查詢,只需要$(this)就足夠了。 – 2013-02-10 17:55:29

3

點擊處理程序中的變量'this'的作用域是被點擊的元素,而不是WM對象。你應該在點擊處理程序之外緩存WM對象。這樣你就可以在點擊處理程序的範圍內使用它。

var oWM = new WM(); 
oWM.Add("mydiv"); 
oWM.Initialize(); 

function WM() { 
    this.ZIndex = 1000; 
    this.Windows = []; 
    this.Add = function(id) { 
     this.Windows.push(id); 
    } 
    this.Initialize = function() { 
     var that = this; 
     for (var i = 0; i < this.Windows.length; i++) { 
      $("#" + this.Windows[i]).click(function() { 
       alert("#"+this.id + ":" + that.ZIndex++); 
       $("#" + this.id).css("z-index", that.ZIndex++); 
      }); 
     } 
    } 
}