Dynamic 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不会进入函数

使用Jquery,我想动态生成一个监听器以及每个监听器要执行的操作

$('#foo').on('click', function()
 {
   var i = Math.floor( Math.random() * 3 );
    eval(func[i]);//pointer to function
});
问题是
func[i]
下面指向动态选择的函数的指针永远不会被它所表示的内容(在这种情况下,存储在
func
数组中的任何函数)替换。很明显,之所以会发生这种情况,是因为JS不会进入
函数(){…}
内部,直到侦听的
单击发生

我不知道如何解决这个问题,任何想法都将不胜感激。下面是一些示例代码,如果您喜欢,这里有一个示例代码。非常感谢

// 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[i]
    时,您只是在调用一个字符串。而不是制作<代码> FUNC一个字符串数组,考虑把它作为一个函数引用数组,然后用“代码>())< /COD> < /P>调用函数。 jsiddle:

    使用这个


    谢谢。这是有道理的。但是,我希望能够对不同数量的侦听器(平均约10个)使用此方法。因此,很难使用
    i
    或任何其他变量作为指针。当JS第一次绑定监听器时,有没有一种方法可以设置它?哇,非常好的编辑。如果没有其他东西的话,这对改进我的代码非常有帮助。@cranberry-我在我的答案的末尾添加了一个可重用的函数,你可以在多个地方使用。哇,这真是太棒了。非常感谢你!祝你度过一个愉快的夜晚(或一天,取决于你在哪里)。谢谢。正确地存储函数引用让我半途而废。正如我对@jfriend00所说的,我希望能够对不同数量的侦听器(平均约10个)使用此方法。因此,在单击发生后重新使用
    i
    变量引用变量是一个问题。我需要在创建事件侦听器时存储函数调用。

    $('#foo').on('click', function()
     {
       var i = Math.floor( Math.random() * 3 );
        eval(func[i]);//pointer to function
    });