Jquery将函数传递给函数

时间:2013-12-22 01:08:11

标签: javascript jquery

好的,我需要一些帮助,

我在jquery插件中有一个函数

var LoadPage = function (page, location, func){     
        $.ajax({
            url: page,
            success: function(data){        
                $(location).html(data); //Insert data into location
                func
                return true         
            },
        });
    }

我想像这样使用它

 Loadpage(
     "api/page.php", 
     "#div_id", 
      $("#calander td.clickable").click(function() {
         var day = $(this).attr("calendar-day");
         console.log("clicked TD" + day);
         LoadPage('/api/view_event.php?d='+day, settings.eventContainer);
  })
 );

 Loadpage(
     "api/page.php", 
     "#div_id", 
      function() {
         var day = $(this).attr("calendar-day");
         console.log("clicked TD" + day);
         LoadPage('/api/php/calander/view_event.php?d='+day+'&m='+SelectedMonth+'&y='+SelectedYear, settings.eventContainer);
  }
 );

然后让它在success:中运行,其中包含var func,但不确定如何使其工作。请帮助互联网。

2 个答案:

答案 0 :(得分:2)

您的代码中有三个单独的问题:

1)如果您想在成功处理程序中执行回调func,那么您需要在()之后添加parens func(),因为这是javascript表示该方法的方法你想要执行一个功能。

var LoadPage = function (page, location, func){     
    $.ajax({
        url: page,
        success: function(data){        
            $(location).html(data); //Insert data into location
            // add parens here after func
            func();
            return true         
        },
    });
}

如果您希望func参数是可选的,您可以在执行它之前测试它:

var LoadPage = function (page, location, func){     
    $.ajax({
        url: page,
        success: function(data){        
            $(location).html(data); //Insert data into location
            // add parens here after func to actually execute it
            if (func) func();
            return true         
        },
    });
}

2)然后,您需要更改调用LoadPage()的方式,将其传递给实际的函数引用,如下所示:

Loadpage(
     "api/page.php", 
     "#div_id", 
      function() {
         $("#calander td.clickable").click(function() {
             var day = $(this).attr("calendar-day");
             console.log("clicked TD" + day);
             LoadPage('/api/view_event.php?d='+day, settings.eventContainer);
         })
      })
 );

您传递的是执行.click函数的结果,该函数是jQuery对象,而不是函数。相反,您可以将其包装在匿名函数中,以便传递对该函数的引用。这与func()相反。你传递的内容之后你不想要parens,因为你想传递对函数的引用,而不是现在执行函数的结果。

所以,总结这两个问题:

声明:

func

只是对函数的引用。它实际上并不执行该功能。当你想要传递一个函数然后将其称为LATER时,它很有用。

声明:

func()

立即执行该功能。如果你传递func()作为参数,那么它将立即执行(parens总是意味着现在执行它)然后传递该函数的返回值(这不是你想要的)。


3)您可能还想了解成功处理程序中的return true语句没有任何内容。因为ajax函数是异步的,所以LoadPage()函数只启动ajax函数然后立即返回。稍后,ajax引擎的内部会调用您的success处理程序。返回语句返回到该ajax引擎的内部。它不会从LoadPage()函数返回,因为它已经很久没有返回,也没有返回任何内容。

4)可能的第四个问题。每次调用LoadPage()时,您都要为此选择器匹配的任何对象添加新的单击处理程序:"#calander td.clickable"。如果之前存在某些对象,则最终会有多个单击处理程序。在这种情况下,您可能希望使用委派事件处理,因此您可以提前安装一次单击处理程序,或者在安装新的单击处理程序之前需要删除它们,或者您只需要隔离新添加的单击处理程序对象,只在它们上面调用它。如果所有"#calander td.clickable"都被前面的代码替换,那么这不会有问题。

答案 1 :(得分:0)

试试这个:

var LoadPage = function (page, location, func){     
    $.ajax({
        url: page,
        success: function(data){        
            $(location).html(data); //Insert data into location
            func && func(); // this will execute func if it is passed as parameter
            return true;        
        }
    });
}

并以第二种方式使用它。