2014-03-02 120 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