我正在使用AJAX页面方法,但我似乎无法传递所需的参数:
function getFavStatus() {
//favs is a list of DOM <imgs> that I want to modify their img.src attribute
for (i = 0; i < favs.length; i++) {
PageMethods.isFavorite(favs[i].alt,setFavImg(favs[i]));
}
}
function setFavImg(fav, response) {
fav.src = response;
}
我无法弄清楚的问题是如何使用PageMethods的“响应”,并将DOM对象传递给回调函数。
我也尝试过这样的事情:
function getFavStatus() {
for (i = 0; i < favs.length; i++) {
PageMethods.isFavorite(favs[i].alt, function (response) {
favs[i].src = response;});
);
}
}
在这种情况下,响应正常,但i
始终为> favs.length
,因为它已遍历循环...
修改:我的PageMethods.isFavorite签名是:
[System.Web.Services.WebMethod]
public static string isFavorite ( string p_id )
有人能指出我正确的方向吗?
谢谢!
答案 0 :(得分:1)
试试这个:
PageMethods.isFavorite(favs[i].alt,
function (response, ctx) {
/* success callback */
ctx.src = response;
},
function(response) { /* failed callback */ },
favs[i] /* context */);
将上下文传递给回调,因此您可以将对图像的引用传递给回调,并将其设置在回调中。
最初的问题是页面方法是异步的,因此在循环完成之前不会触发回调。因此,最后一项受影响。
HTH。
答案 1 :(得分:1)
这是另一个可以省去很多麻烦的想法,虽然它不是很优雅。
让页面方法返回两个字符串(即包含两个字符串项的数组) - 第一个字符串将是图像元素的ID,第二个字符串将是所需的源。
然后回调函数将变为:
function (response) {
document.getElementById(response[0]).src = response[1];
}
答案 2 :(得分:1)
Brian的答案可能是最干净的方法,但是另一种方法(如果不支持ctx
参数)解决了i
总是在循环结束时的问题是使用闭包来保留i
:
function createCallback(i) {
return function (response) {
favs[i].src = response;
}
}
function getFavStatus() {
for (i = 0; i < favs.length; i++) {
PageMethods.isFavorite(favs[i].alt, createCallback(i));
}
}