好的,我需要一些帮助,
我在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
,但不确定如何使其工作。请帮助互联网。
答案 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;
}
});
}
并以第二种方式使用它。