javascript - Jquery 将函数传递给函数

标签 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 位于其中,但不确定如何让它工作。请帮助互联网。

最佳答案

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

1) 如果您想在成功处理程序中执行回调函数 func,则需要在其后面添加括号 (),如 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() 相反。您不需要在传递的内容之后添加括号,因为您想要传递对函数的引用,而不是现在执行该函数的结果。

那么,总结一下这两个问题:

声明:

func

只是对函数的引用。它实际上并不执行该函数。当您想要传递对稍后调用它的函数的引用时,它非常有用。

声明:

func()

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

<小时/>

3) 您可能还想了解成功处理程序中的 return true 语句不执行任何操作。由于 ajax 函数是异步的,因此您的 LoadPage() 函数只是启动 ajax 函数,然后立即返回。一段时间后,ajax 引擎的内部调用您的成功处理程序。该 return 语句返回到该 ajax 引擎的内部。它不会从您的 LoadPage() 函数返回,因为该函数早已完成并且没有返回任何内容。

4) 可能的第四个问题。每次调用 LoadPage() 时,您都会向此选择器匹配的任何对象添加一个新的点击处理程序:"#calander td.clickable"。如果其中一些对象以前存在,您最终将得到多个单击处理程序。在这种情况下,您要么想要使用委托(delegate)事件处理,这样您就可以提前安装一次点击处理程序,要么您需要在安装新点击处理程序之前删除现有的点击处理程序,或者您只需要隔离新添加的点击处理程序对象并仅在它们上调用它。如果所有“#calander td.clickable”都被以前的代码替换,那么这将不是问题。

关于javascript - Jquery 将函数传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20725171/

相关文章:

javascript - 右键单击执行 javascript 的 html 链接

javascript - Highcharts xAxis 标签不自动旋转

javascript - 实现动态选择器并显示相应的图像

javascript - 将新内容加载到 HTML 页面

javascript - Highcharts 在图例项目之间放置额外的空间

javascript - SlideToggle Div 动画

javascript - 根据排序或不更改光标样式

Jquery Mouseover - e 未定义

从多个对象的javascript继承

javascript - Ember - 如何将 this.get ('model' ) 转换为 js 对象