我在Magento中创建了一个控制器,用于检查列表中是否有产品。如果列表中的产品将返回true
,否则返回false
。preventDefault取决于Ajax响应的链接
这里是触发ajax调用的前端,我记住我无法将其改为表单。它必须是一个链接。
<a href="[my_controller]" title="Compare Products" target="_blank" class="compare-product-link">Compare Products</a>
这是ajax调用。
jQuery(".compare-product-link").on("click", function(e) {
jQuery.ajax({
async : false,
dataType : "json",
url : "/compareextra/compare/allowed",
success : function(data) {
//console.log(data);
if(data.isAllowed != true) {
e.preventDefault();
}
}
});
});
我的问题是,async
已被弃用,不利于用户体验,他说,有很多答案在那里里面加3秒的延迟,我也不想这样,因为多数民众赞成对用户体验不利。
我也试过使用承诺电话,但它只能与async : false
一起使用。
jQuery(".compare-product-link").on("click", function(e) {
var response = false;
jQuery.ajax({
dataType : "json",
url : "/compareextra/compare/allowed",
success : function(data) {
console.log(data);
if(data.isAllowed) {
response = true;
}
}
}).done(function(){
console.log(response);
if(response != true) {
e.preventDefault();
}
});
});
编辑
还有一个问题我也有是,如果我的链接存储到一个变量,然后打开一个新的窗口,所以window.location = href;
大多数浏览器会阻止其用户将必须手动接受弹出窗口目标网站,这再次不利于用户体验。
一个常规的点击可能不是你的问题的根源,但我认为你是混合新旧形式的AJAX在.success()和.done()回调。在这个链接中有一个关于ajax/promises/deferreds的体面解释:http://tutorials.jenkov.com/jquery/deferred-objects.html。 –