2014-03-02 151 views
0

我準備了的jsfiddle解釋我的問題,這裏是:http://jsfiddle.net/3tAZ7/1/在定義函數循環

所以,基本上我試圖附加一個處理程序,以每mathjax渲染的對象,這樣當我點擊一個其中,函數「jax_remove」被調用。

問題是,無論我點擊哪個mathjax元素,它都會刪除最後一個mathjax元素!

這是我使用的功能:

setTimeout(function() { //timeout is necessary for mathjax loading 
    jaxes = MathJax.Hub.getAllJax("math"); 
    for(var i = 0; i < jaxes.length; i++) { 
     var jax=jaxes[i]; 
     alert(jax.inputID); 
     $("#"+jax.inputID+"-Frame").click(function() {      
      jax_remove(jax); 
     }); 
    }; 
},1250); 

,如果你檢查DOM,你可以看到每一個渲染mathjax包含在範圍中包含「MathJax元件型N幀的ID 「,其中n = 1,2,3,...所以這些是我附加處理程序的元素,它似乎起作用,證明是兩個最初發出的警報。

所以問題似乎是鏈接到「jax_remove」函數。

你能幫我嗎?

+1

[創建在環封閉件:一個常見的錯誤(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures#Creating_closures_in_loops.3A_A_common_mistake) &http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example –

回答

3

變化:

$("#"+jax.inputID+"-Frame").click(function() {      
     jax_remove(jax); 
    }); 

到:

$("#"+jax.inputID+"-Frame").click((function(j) {      
     return function(){ 
      jax_remove(j); 
     }; 
    })(jax)); 

對於解釋一下@Arun P佐尼的鏈接。

+0

它的工作!謝謝 – simonacca