2012-07-31 36 views
1

我想附加來自字符串的事件。我遇到的問題是函數名不是作爲字符串傳入的,而是在函數被調用時編譯,導致未定義的變量錯誤(temp)。在函數聲明而不是運行時分析所有變量

function someFun(arg) { 
    alert(arg) ; 
} 

    temp[0] = "someFunc(test)" ;//this would be a sample of the incoming HTML 
    var x = 0 ; 
    while(temp[x] != '') { 
    temp[x] = temp[x].replace(')','').split('(') ;//remove paranthesis and separate func name from args 
    temp[x][1] = temp[x][1].split(',') ;//turn string of args into array 
    func = function() { window[temp[x][0]].apply(el,[]) ; } 
    el.addEventListener('click',func,false) ; 
    x++ ; 
    } 

如果我不使用溫度[X] [0](這將是「someFunc」),但在用於方法。適用一個字符串,而傳遞(在這種情況下。適用(「someFunc」 ... ))直接我沒有問題,該函數將按預期與onClick調用。否則,當我點擊元素埃爾我得到一個錯誤,溫度沒有定義。

+1

我想我們需要更多的信息來說明你正在做什麼,如果我們知道更多的話,實現你的目標可能會有一點點不同。 – ctcherry 2012-07-31 05:50:43

+0

我試圖發送一個像HTML一樣寫的字符串,並且讓我的JavaScript解析器創建所有元素並添加像.innerHTML那樣的屬性+事件。在這種情況下,我試圖將onClick事件附加到元素el。 – 2012-07-31 05:56:33

+0

請使用相關的代碼和輸入/輸出示例更新您的問題,並解釋爲什麼你在做什麼你在做什麼 – mplungjan 2012-07-31 05:57:04

回答

2

我很確定,如果您在分配函數之前將temp[x][0]指定給變量,它應該可以工作。像這樣的東西

if (attributes._onClick) { 

    temp = attributes._onClick; 
    var x = 0; 

    while(temp[x] != '') { 

    var funcSig = temp[x].replace(')','').split('('); //remove paranthesis and separate func name from args 

    var funcName = funcSig[0]; 
    var funcArgs = funcSig[1].split(','); //turn string of args into array 

    func = function() { window[funcName].apply(el,[]); } 

    el.addEventListener('click',function(){ 
     window[funcName].apply(el,funcArgs); } 
    ,false); 

    x++; 
    } 
} 
+0

工作!有點瘋狂。非常感謝,我一直試圖弄清楚爲什麼它不會永久編譯。任何想法爲什麼字符串必須首先分配給一個單獨的變量? – 2012-07-31 06:10:44

+0

@MagicLasso你能重新檢查我的答案嗎?我修改了你的初始代碼,以清楚發生了什麼。 – 2012-07-31 06:13:25

+0

@MagicLasso與關閉和使用變量的範圍有關 - 更清晰地寫,如我所示 – 2012-07-31 06:18:05

相關問題