这是我使用ajax在购物车中添加产品的简单代码,但是当用户点击太快时,某些产品不会添加到购物车中。 在第一行,我在调用ajax并在购物车中添加产品后使用序列化从表单中获取数据。 现在给我解决方案,我可以把超时或延迟和类似的东西,所以执行暂停有时。
var datas = form.serialize();
if(usefancy){
$.fancybox.showActivity();
}
$.getJSON(vmSiteurl+'index.php?option=com_virtuemart&nosef=1&view=cart&task=addJS&format=json'+vmLang,encodeURIComponent(datas),
function(datas, textStatus) {
if(datas.stat ==1){
var txt = datas.msg;
} else if(datas.stat ==2){
var txt = datas.msg +"<H4>"+form.find(".pname").val()+"</H4>";
} else {
var txt = "<H4>"+vmCartError+"</H4>"+datas.msg;
}
答案 0 :(得分:0)
将其包装在一个函数中:
var datas = '';
setTimeout(function(){
datas=form.serialize();
},1000);
更好的方法
当用户完成添加产品时触发的查找和事件(可能是点击的按钮或类似的东西),然后进行序列化和ajax调用。
假设您有一个id =“sendProduct”的按钮
<button id="sendProduct">Send product</button>
你可以做点什么:
$("#sendProduct").click(function () {// Everytime user clicks "sendProduct" you will send info to the server.
var datas = form.serialize();
if (usefancy) {
$.fancybox.showActivity();
}
$.getJSON(vmSiteurl + 'index.php?option=com_virtuemart&nosef=1&view=cart&task=addJS&format=json' + vmLang, encodeURIComponent(datas),
function (datas, textStatus) {
if (datas.stat == 1) {
var txt = datas.msg;
} else if (datas.stat == 2) {
var txt = datas.msg + "<H4>" + form.find(".pname").val() + "</H4>";
} else {
var txt = "<H4>" + vmCartError + "</H4>" + datas.msg;
}
});
});
答案 1 :(得分:0)
setTimeout(function(){
var datas = form.serialize();
}, 3000);
3000相当于3秒(3000毫秒)。
答案 2 :(得分:0)
使用setTimeout
是一种非常不可靠的更新变量的方法(如果jQuery函数即使在3秒内也无法执行该怎么办?)。相反,您应该使用许多callback
函数中提供的jQuery
功能,并在callback
函数中设置变量。
编辑:对于用户点击过快的问题,您必须实施一个简单的锁定机制,以便在将项目添加到购物车时,禁用“添加到购物车”选项。这可以这样做:
var cartLock = false; //means you can add items to cart
因为,您需要能够捕获complete
,我建议采用以下方法,
$.ajax({
type: "GET",
url: url,
dataType: "json",
beforeSend: function(msg){
cartLock = true; // Just before calling
},
success: function(msg){
// your logic here
},
complete: function(){
cartLock = false; // After request completes
}
});
现在,您需要进行的最后一项检查是:$.ajax()
cartLock
时,您只能致电false
。希望这是有道理的。