2011-11-26 80 views
3

全部,jquery - 綁定點擊事件到一個變量

我真的堅持/困惑在這一點上。

我有一個數組,其中有6個項目。數組中的每個項目都使用jquery'.html'方法動態填充元素。但是,我似乎無法將一個事件附加/綁定到這個動態創建的變量。

只要瀏覽器進入問題行(請參閱標記爲「PROBLEM AREA」的區域),就會得到一個'未定義'的錯誤,這真是令人困惑,因爲同一個變量上的所有代碼都可以正常工作。

var eCreditSystem = document.getElementById("creditSystem"); 
var i = 0; 
var eCreditT = new Array(6);     // 6 members created which will be recycled 

function createCreditTransaction()     // func called when a transaction occurs, at the mo, attached to onclick() 
{ 
    if (i < 6) 
    { 
     eCreditT[i] = undefined;     // to delete the existing data in the index of array 
     addElements (i); 
    } else 
    if (i > 5 || eCreditT[i] != undefined) 
    { 
     ... 
    } 
} 

function addElements (arrayIndex)     // func called from within the 'createCreditTransaction()' func 
{ 
    eCreditT[i] = $(document.createElement('div')).addClass("cCreditTransaction").appendTo(eCreditSystem); 
    $(eCreditT[i]).attr ('id', ('trans' + i)); 
    $(eCreditT[i]).html ('<div class="cCreditContainer"><span class="cCreditsNo">-50</span>&nbsp;<img class="cCurrency" src="" alt="" /></div><span class="cCloseMsg">Click box to close.</span><div class="dots"></div><div class="dots"></div><div class="dots"></div>'); 
    creditTransactionSlideOut (eCreditT[i], 666);     // calling slideOut animation 
    console.log(eCreditT[i]);  // this confirms that the variable is not undefined 

/* ***** THE PROBLEM AREA ***** */ 
    $(eCreditT[i]).on ('click', function()     // if user clicks on the transaction box 
    { 
     creditTransactionSlideBackIn (eCreditT[i], 150);     // slide back in animation 
    }); 
    return i++; 
} 
+0

我想知道,這可能與js文件在HTML文檔中加載的位置有關嗎? 我把js文件放在HTML標籤的底部。 – Kayote

+0

第二個理論是,當它將事件綁定到變量時,瀏覽器已經讀取並實現了'return i ++',這意味着在那一刻,'eCreditT [i ]'對'i'有不同的價值? – Kayote

+0

它的工作!但是我不知道它爲什麼起作用。 當我評論'返回i ++'並運行代碼時,它工作。現在我的問題是如何在函數結尾處實現「返回i ++」? – Kayote

回答

1

嘗試添加點擊事件out addElements()函數並嘗試一次。

2

試試這個:

$(eCreditT[i]).bind('click', function() { 
    creditTransactionSlideBackIn(eCreditT[i], 150); 
}); 

編輯:使用++i代替i++這樣的:

return ++i; 
/* 
or 
i += 1; 
return i; 
*/ 

retrurn ++i執行增量第一,然後遞增後返回i。 雖然return i++返回i然後icrement它。

+0

已經試過了,不起作用。 eCreditT [i]被認爲是未定義的。 – Kayote

+0

感謝及其據稱已解決,但出現了一個新問題。請看看原帖的最新評論。 – Kayote

+0

確定@Kayote,我編輯了我的答案 –

0

嘗試這種情況:

 
$(eCreditT[i]).live('click', function() { 
    creditTransactionSlideBackIn(eCreditT[i], 150); 
}); 
+0

不起作用。現在Javascript控制檯正在報告: 未捕獲的異常:語法錯誤,無法識別的表達式:) – Kayote

1

無意義創建使用JavaScript的元素,然後使用jQuery函數將它轉變成一個jQuery對象。你可以讓jQuery直接爲你創建元素。

eCreditT[i] = $('<div>').addClass("cCreditTransaction").appendTo(eCreditSystem); 

此外,由於eCretitT [i]已經是jQuery元素,因此不需要再次調用jQuery函數。

eCreditT[i].on('click', function() { 
    creditTransactionSlideBackIn(eCreditT[i], 150); 
}); 

如果你已經嘗試過onbindliveclick方法,那麼也許被調用的函數是你的問題。嘗試在函數內部放置一個console.log()alert()以確保點擊事件實際發生。如果發生,那麼功能creditTransactionSlideBackIn()是你的問題。

編輯

問題是,當事件發生時,i是不是原來的變量了。

function addElements (arrayIndex) 
{ 
    eCreditT[i] = $('<div>').addClass("cCreditTransaction").appendTo(eCreditSystem); 
    eCreditT[i].attr ('id', ('trans' + i)); 

    eCreditT[i].data ('id', i); // Store the id value to a data attribute 

然後當你打電話,你可以參照數據的功能屬性,而不是i變量:

/* ***** THE PROBLEM AREA ***** */ 
    eCreditT[i].on ('click', function()     // if user clicks on the transaction box 
    { 
     creditTransactionSlideBackIn ($(this).data('id'), 150);     // slide back in animation 
    }); 
    return i++; 
} 
+0

哦哇,謝謝你的頂尖提示。實現。關於實際問題,我已經解決了......部分。看起來'迴歸i ++'是錯誤的。請參閱我的原始帖子的最後評論。 – Kayote

+0

使用建議的解決方案進行編輯,在適當的時刻存儲和檢索正確的id值。 –

+0

謝謝@Jose Faeti。我正在研究jquery的數據方法。 – Kayote

1

嘗試綁定父格,然後用if($e.target).is('some')){},它將作爲。生活,是這樣的:

$(eCreditSystem).bind('click', function (e){ 
    if($(e.target).is('.cCreditTransaction')) { 
     creditTransactionSlideBackIn ($(e.target), 150);    
    } 
}); 
當然,你需要在一分鐘內的

檢查,如果點擊的DOM EL是.cCreditTransaction孩子,像這樣大if

if($(e.target).parents().is('.cCreditTransaction')){} 
+0

我有點困惑,請你再澄清爲什麼/如何綁定父div會幫助。我正在閱讀'.live'和'.is'在此期間:) – Kayote

+0

編輯^^;) 你應該把這行外面addElements func,解釋是這樣的:當你添加元素到容器並點擊它時,事件將發生,只需要一個條件,點擊的對象必須是類'cCreditTransaction'。綁定函數,它不關心容器內部的內容,每次在容器內部點擊某個元素時,函數檢查所需的元素;) – vonsko