我正在尝试构建迭代列表中每个项目的内容,获取产品sku,在jsonp请求中包含该sku,希望返回一个对象。我有它做所有这些事情,但偶尔失败。
所以循环遍历列表元素的脚本示例,抓取类以获取正确的id#,然后发送请求:
$j(document).ready(function(){
$j('ul.products-grid li a.product-image img').each(function(index){
var prodId = $j(this).attr('class').match(/[\d]+$/),
s7jsonReqUrl = '/is/image/z/' + prodId + '/?req=imageset,json';
$j.ajax({
url: s7jsonReqUrl,
dataType: 'jsonp',
jsonp: 'true',
jsonpCallback: 's7jsonResponse',
success: function(response)
{
x = response["IMAGE_SET"];
console.log(x);
},
error: function(data, status)
{
console.log ( 'error : ' + data + ' : ' + status );
}
});
});
})
如果我将这些网址中的每一个都手动粘贴到浏览器中(来自s7jsonReqUrl var),它们将返回预期的json对象,即使是那些因上述测试失败的对象。任何想法在这里发生了什么?
答案 0 :(得分:1)
由于jQuery反复定义和重新定义s7jsonResponse,很可能会达到竞争状态。
我会以非jquery方式执行此操作,因为回调参数不是动态的..
window.s7jsonResponse = function(data) {
console.log(data);
};
var sendForJSON = function (prodId) {
var s = document.createElement("script");
s.src = '/is/image/z/' + prodId + '/?req=imageset,json';
document.body.appendChild(s);
};
现在只需使用sendForJSON
来获取数据。
.each(function(){
var prodId = $j(this).attr('class').match(/[\d]+$/);
sendForJSON(prodId);
})
应该还可以添加逻辑来在收到响应后删除脚本标记。