Dynamic Jquery动态地将函数指针插入事件监听器
使用Jquery,我想动态生成一个监听器以及每个监听器要执行的操作Dynamic Jquery动态地将函数指针插入事件监听器,dynamic,listener,jquery,function-pointers,Dynamic,Listener,Jquery,Function Pointers,使用Jquery,我想动态生成一个监听器以及每个监听器要执行的操作 $('#foo').on('click', function() { var i = Math.floor( Math.random() * 3 ); eval(func[i]);//pointer to function }); 问题是func[i]下面指向动态选择的函数的指针永远不会被它所表示的内容(在这种情况下,存储在func数组中的任何函数)替换。很明显,之所以会发生这种情况,是因为JS不会进入函数
问题是$('#foo').on('click', function() { var i = Math.floor( Math.random() * 3 ); eval(func[i]);//pointer to function });
下面指向动态选择的函数的指针永远不会被它所表示的内容(在这种情况下,存储在func[i]
数组中的任何函数)替换。很明显,之所以会发生这种情况,是因为JS不会进入func
内部,直到侦听的函数(){…}
单击发生 我不知道如何解决这个问题,任何想法都将不胜感激。下面是一些示例代码,如果您喜欢,这里有一个示例代码。非常感谢
// an array of functions to call and a random number to choose which one to call var func = ["Alf();","Sarah();","Jon();"]; var i = Math.floor( Math.random() * 3 ); // the dynamically generated listener $('#foo').on('click', function() { func[i];//pointer to function }); // a function to be called function Alf () { alert("Hi! I'm Alf"); }
您需要将数组更改为函数引用而不是字符串:并且,将您的执行更改为:var func = [Alf, Sarah, Jon];
而且,您需要确保变量// the dynamically generated listener $('#foo').on('click', function() { func[i]();//pointer to function });
在事件实际发生之前保持其值,并且i
是一个危险的变量名称i
我建议:变化:(function() { // an array of functions to call and a random number to choose which one to call var funcArray = [Alf, Sarah, Jon]; var randomFunc = funcArray[Math.floor( Math.random() * func.length )]; // the dynamically generated listener $('#foo').on('click', function() { randomFunc(); //pointer to function }); // a function to be called function Alf () { alert("Hi! I'm Alf"); } })();
把整个事情放在生活中,这样你的变量就可以得到保护,而不是全局的 获取实际的随机函数,而不仅仅是索引 使用 而不是func.length
进行维护3
为随机函数变量使用更好的名称 将函数更改为函数引用而不是字符串 将参数添加到 的末尾以实际执行函数randomFunc()
如果您想将其变成一个允许您在多个位置使用逻辑的函数,您可以这样做:function bindRandomClickFunc(selector, fnArray) { var fn = fnArray[Math.floor( Math.random() * fnArray.length )]; $(selector).on('click', fn); }
部分问题在于,当您调用时,您只是在调用一个字符串。而不是制作<代码> FUNC一个字符串数组,考虑把它作为一个函数引用数组,然后用“代码>())< /COD> < /P>调用函数。 jsiddle:使用这个func[i]
谢谢。这是有道理的。但是,我希望能够对不同数量的侦听器(平均约10个)使用此方法。因此,很难使用或任何其他变量作为指针。当JS第一次绑定监听器时,有没有一种方法可以设置它?哇,非常好的编辑。如果没有其他东西的话,这对改进我的代码非常有帮助。@cranberry-我在我的答案的末尾添加了一个可重用的函数,你可以在多个地方使用。哇,这真是太棒了。非常感谢你!祝你度过一个愉快的夜晚(或一天,取决于你在哪里)。谢谢。正确地存储函数引用让我半途而废。正如我对@jfriend00所说的,我希望能够对不同数量的侦听器(平均约10个)使用此方法。因此,在单击发生后重新使用i
变量引用变量是一个问题。我需要在创建事件侦听器时存储函数调用。i
$('#foo').on('click', function() { var i = Math.floor( Math.random() * 3 ); eval(func[i]);//pointer to function });