如何将参数'烘焙'到click()调用jquery?

时间:2012-04-03 21:15:27

标签: jquery

我有一个收集XML的ajax调用,并根据该数据创建了一些div,我在其上附加了click()jquery侦听器。单击时,我希望这些div调用函数并将参数传递给该函数。但是,在调用单击时,参数的值已更改。以下是jsfiddle I built演示问题的示例:

    $(document).ready(function() {

    function x() {

      $.ajax({
        type: "POST",
        url: "/echo/xml/",
        dataType: "xml",
        data: {
            xml: "<the>xml</the>"
        },
        success: function(xml) { 
          console.log('success');                

          $('#test').show(); 

          var text = "CORRECT";      

          $('#test').click(function() {

            insertText(text);
            console.log(text);
          });

          text = "WRONG";

        }        
      });
    }

    x();

  });

  function insertText(t) {

      $('#test').html(t);
  }

我希望文本显示为CORRECT,而不是WRONG。

我知道这是一个令人费解的例子,但我试图在范围和发生的事情上尽可能地模拟我的实际代码。在基于点击调用click()函数时,text的值已更改。有没有办法在创建text时将click()的价值“烘焙”到for来电?我将在运行XML时通过{{1}}循环创建其中的一些循环,并且不希望将所有数据挂起到变量中以供以后使用。

3 个答案:

答案 0 :(得分:1)

最简单的方法可能是创建一个附加处理程序的函数。这样,函数内的参数不变。

      var text = "CORRECT";      

      bindClick("test", text);


      // ...

      function bindClick(id, text){

          $('#' + id).click(function() {
            insertText(text);
            console.log(text);
          });
      }

http://jsfiddle.net/snTEf/2/

答案 1 :(得分:1)

像这样 - 将它绑定到闭包形式的局部变量。

(function(text){
     $('#test').click(function() {
            insertText(text);
            console.log(text);
      });
})(text);

答案 2 :(得分:1)

在调用click赋值之后才调用text = "WRONG"函数,因此该函数当然使用text的“不正确”值。如果您想要在定义时将text的值烘焙到函数中,您可以使用立即调用的匿名函数,如下所示:

(function(bakedText) {
  $('#test').click( function() {
    insertText(bakedText);
    console.log(bakedText);
  }
})(text);

请参阅此处的演示:http://jsfiddle.net/H4DpV/

相关问题