簡體   English   中英

動態生成的js按鈕,帶有閉包以分配onclick函數參數

[英]dynamically generated js buttons with closures to assign onclick function parameters

我遇到了人們之前發布的問題: JavaScript動態參數

但是我的代碼使用節點而不是innerHTML分配,因此現有的SO帖子似乎不適用於我的代碼。

我想在表格中動態生成HTML按鈕。 對於每個按鈕,我想調用一個函數,該函數的參數取決於表中按鈕的索引/位置。 首先,我嘗試僅將lambda函數與要遞增的變量一起使用。 這沒有用,所以我還嘗試了動態命名的變量,這意味着每個按鈕都應該傳遞一個不同名稱的變量來處理延遲加載的效果。 但這也不起作用。 您可以在下面的代碼中看到我嘗試過的兩個版本:

我在下面粘貼的這段代碼在for循環中。 在下文中,我每次將i加1。 offset和jj在循環內不變。

var variableDynamic = i.toString();
window['variableName' + variableDynamic] = i + offset;

upvote.onclick = function() {
    upVoteA(i + offset, jj);
    //upVoteA(window['variableName' + variableDynamic] , jj);
};
upvote.innerHTML = "Upvote"

有人告訴我要研究閉包,因此遵循以下建議: http : //www.usepatterns.com/blog/javascript-closures我將onclick函數聲明重寫為:

upvote.onclick = function() {
    var a = i + offset;
    var b = kk;
    function closeIt(){
        upVoteA(a,b);
    }
    closeIt();
};

這仍然具有與每個按鈕使用相同參數(即最后/最高值)調用upVoteA相同的效果。

我意識到我可以重構代碼以將其轉換為.innerHTML set語句,然后打印變量,並將其設置為打印語句,而不是延遲加載的變量。 但是,如果可能,我不想這樣做。 (很抱歉,從技術上來說這不是延遲加載,這個名稱似乎很恰當)

有沒有辦法使我的代碼正常工作? 為什么關閉失敗了? 我認為閉包應該保留創建它們的環境,但是我的代碼不是這種情況。 封閉部分保留了“環境”的哪一部分?

這是一個很糟糕的答案,但是可以

     var funcStr = "function dummy() { upVoteA(" + (i + offset) + "," + jj + "); }";
     eval(funcStr);
     upvote.onclick = dummy;

但是,如果您有更好的東西,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM