如何回调对象中的函数?
json_post('get_tracks', 'json.request.php?get=tracks', 'genreId='+id+'&perPage=70&page=1', 'rtn_tracks');
我没有回调rtn_tracks()而是想对this.rtn()进行回调
如何在回调字符串中定义它?
以下是代码:
function stream_tracks(){
this.get = function(id){
json_post('get_tracks', 'json.request.php?get=tracks', 'genreId='+id+'&perPage=70&page=1', 'rtn_tracks');
};
this.rtn = function(json_obj){
this.cnstr(json_obj);
};
this.cnstr = function(json_obj){
alert('test');
};
}
Stream_tracks = new stream_tracks();
var XMLHTTP = {};
function json_post(request_uid, uri, get_str, callback_function, callback_var){
request_uid += Math.floor(Math.random()*999999).toString();
if(window.XMLHttpRequest){
XMLHTTP[request_uid] = new XMLHttpRequest();
}
else if(window.ActiveXObject){
XMLHTTP[request_uid] = new ActiveXObject('Microsoft.XMLHTTP');
}
XMLHTTP[request_uid].open('POST', uri, true);
XMLHTTP[request_uid].setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
XMLHTTP[request_uid].onreadystatechange = function(){
if(XMLHTTP[request_uid].readyState == 4){
if(callback_function){
eval(callback_function+'('+XMLHTTP[request_uid].responseText+(callback_var ? ', callback_var':'')+')');
}
}
}
XMLHTTP[request_uid].send(get_str);
}
答案 0 :(得分:1)
不使用字符串进行回调,而是使用方法。
var my = {
start : function (s, callback) {
callback(s);
},
callback: function(s) {
}
}
你不能使用:
my.start("Hello World", my.callback)
因为这会导致处理方法而不连接到对象my,但你可以这样做。
my.start("Hello World", function(s) { my.callback(s); });
答案 1 :(得分:0)
好的,你需要做几件事,如果你读过closures,可能会更有意义。
首先,您需要引用this
变量,以便在回调中访问它而不会覆盖它。
function stream_tracks(){
var obj = this;
然后,如果您想从其他方法中引用该类/对象的属性,只需使用obj.this
。
您应该做的第二件事是将回调作为函数传递而不是字符串。它也会更有效率,因为你可以取消eval功能。
this.get = function(id){
json_post(
'get_tracks',
'json.request.php?get=tracks',
'genreId='+id+'&perPage=70&page=1',
function(){ obj.rtn(); }
);
};
在匿名函数中包装回调形成了闭包,并允许函数使用类中的变量。此外,如果您这样做,您可以在函数的同时传递任何参数,并取消父函数中的额外参数。
答案 2 :(得分:0)
您可以在Javascript中将函数作为对象传递,您不需要传递函数名称并使用eval。如果您的回调应该作为类的成员调用,您还需要传递类实例。例如。在json函数中添加一个回调上下文参数:
function json_post(request_uid, uri, get_str, callback_function, callback_var, callback_context){
/*... snip ...*/
XMLHTTP[request_uid].onreadystatechange = function(){
if(XMLHTTP[request_uid].readyState == 4)
{
if(callback_function){
/* The call() function lets you call a function in a context */
callback_function.call(
callback_context || this,
XMLHTTP[request_uid].responseText,
callback_var
);
}
}
};
XMLHTTP[request_uid].send(get_str);
}
然后你会这样称呼它:
json_post('get_tracks', 'json.request.php?get=tracks', 'genreId='+id+'&perPage=70&page=1',
this.rtn, // callback function
null, // callback var
this // callback context
);
这是一个很好的提示:使用框架!它会让你的一天变得更轻松。