2012-10-30 42 views
0
  gameDesign = {   

          makeSeats: function(num) { //num = number of seats 


            var seats = []; 
            var seat; 

            var seatWidth = 20; 
            var seatHeight = 20; 
            var total = 100; 

            for(var i=1; i<= num; i++) { 

             seat = $('<div id="seat_'+i+'" class="seats"><div id="index_'+i+'" style="height:100%; width:100%;"><div style="height:100%; width:100%;">Sit Here</div></div></div>'); 

             seat.children(":first").children(":first").click(function(event, i){ 
                               var tim = i; 
                               gameDesign.sitOnIndexNo(tim); }); 

          }, 

          sitOnIndexNo: function(seatIndex) { 

            tableFunc.makePlayerSit(RummyGlobal.myInfo.get_jid(), seatIndex); 
          } 

        } 

問題:在點擊「坐在這裏」指標值正在爲未定義過去了..我知道這是一件關係到關閉..但是,我需要進一步的解釋和解決方案。 。值不正確地傳遞給函數的onClick

Thanx提前

回答

1
function(event, i){ ... 

預計i,因爲它的第二個參數及其體內任何i是無關的身體以外的任何i

jQuery只傳遞一個參數給它調用的事件處理函數 - 事件。另外,它通過目標元素this。這意味着第二個參數總是undefined

如果你這樣做:

for(var i=0; i<num; i++){ 
    var seat = $("..."); 
    seat.find("...").click(function(e){ 
    gameDesign.sitOnIndexNo(i) 
    ) 
} 

您訪問變量i後的價值發生了變化。您可以創建自調用函數來獲取i的值:

for(var i=0; i<num; i++){ 
    var seat = $("..."); 
    var handler = (function(i){ 
    return function(event){ 
     gameDesign.sitOnIndexNo(i) 
    ) 
    })(i); 
    seat.find("...").click(handler); 
} 

...或使用seat.data,通過@ClarkPan的建議。

+0

是的,我已經有了一些地方..但thanx解釋 – TwiToiT

1

首先,你聲明的「點擊」事件處理程序接受的「i」作爲第二個參數的參數。但是,jquery參數只會傳遞一個事件對象作爲eventHandler的第一個參數。這意味着,當您將'tim'指定爲'i'時,它會提出未定義的。其次,如果你要再次運行你的代碼,你會得到'tim'等於'num'+ 1,因爲被引用的'i'屬於'makeSeats'函數作用域,並不作爲函數的一部分存儲。

你需要的是這樣的:在「數據」屬性這就是過去的事件處理程序

for(var i = 0; i <= num; i++){ 
    $('.foo').click({i:i}, function(e){ 
     gameDesign.sitOnIndexNo(e.data.i); 
    }); 
} 

更多信息,可以發現here

1

你提到「點擊」,所以我假設你計劃生成所有這些div說「坐在這裏」。當用戶點擊「坐在這裏」時,調用函數sitOnIndexNo。基於這個假設,這是我的建議:

gameDesign = {   
    makeSeats: function(num) { //num = number of seats 
     for(var i=1; i<= num; i++) { 
      $("#id_of_element_where_you_want_to_put_the_div"). 
      append('<div id="'+i+'" class="seats" style="height:100%; width:100%;">Sit Here</div></div></div>'); 
     } 
    }, 
    sitOnIndexNo: function(seatIndex) { 
     tableFunc.makePlayerSit(RummyGlobal.myInfo.get_jid(), seatIndex); 
    } 
} 

// Event handler: 
$(".seats").live("click", (function(e) { 
    var tim = $(this).attr("id"); 
    gameDesign.sitOnIndexNo(tim); 
}); 

所以基本上,makeSeats函數生成「坐在這裏」的div和他們的點擊事件被新事件處理程序進行處理。