提问人:cx3700 提问时间:4/4/2023 最后编辑:cx3700 更新时间:4/4/2023 访问量:46
为什么这个jQuery循环不是每次都触发?
Why isn't this jQuery loop not firing every time?
问:
我有一个页面(Woocommerce 中的产品类别),上面有 12 种产品。每个产品都有一个数量字段,当您单击页面底部的按钮时,它会循环浏览产品并将数量大于零的任何产品添加到购物车中:
$('.add-products').on('click', function() {
$('.product-qty').each(function() {
if ($(this).val() > 0) {
var pid = $(this).closest('.product-select').attr('product-id');
var qty = $(this).val();
add_to_cart(pid, qty);
}
});
});
添加到购物车功能如下所示:
function add_to_cart(product_id, qty) {
$.ajax({
type: "POST",
url: '/wp-admin/admin-ajax.php',
data: {action : 'add_to_cart', 'product_id': product_id, 'qty': qty},
success : function(response) {
console.log(product_id + ": " + qty);
}, error : function(response) {
// throw error
}
});
}
问题是,如果我在一堆产品上设置数量,比如说其中四种,它会随机将一些添加到购物车中,而不是其他产品。我尝试使 add_to_cart() 异步,我尝试使用 setTimeouts() 让它有时间运行,但无论我做什么,它都不会将所有数量为 > 0 的产品添加到购物车中。在 add-to_cart() 函数内部,它会回显成功回调中的所有产品,但它们最终不会进入实际购物车。
有没有更好的方法可以做到这一点?
我尝试使add_to_cart()异步,我尝试使用setTimeouts()让它有时间运行。我浏览了此处和谷歌的搜索结果,但没有找到答案。
答:
0赞
mplungjan
4/4/2023
#1
不建议循环使用 ajax。
假设您可以更改服务器端处理,您可以改为这样做:
$('.add-products').on('click', function() {
const products = [];
$('.product-qty').each(function() {
if ($(this).val() > 0) {
var pid = $(this).closest('.product-select').attr('product-id');
var qty = $(this).val();
products.push({pid, qty});
}
});
if (products.length > 0) addToCart(products)
});
并将 addToCarts 更改为将对象作为 JSON 字符串发送到服务器
评论
0赞
Phil
4/4/2023
这难道不完全取决于服务器端代码期望的格式吗?我觉得这不是一个完整的答案
0赞
mplungjan
4/4/2023
@Phil 这是他的服务器。如果不是,那么我的答案当然会错过服务器部分。但是看到OP在我写这篇文章时写的评论,他们可以更改服务器以接受他们需要的任何东西
评论