使用返回true或在jQuery中的目标空白链接上返回false
问题描述:
我有一个提交时有target="_blank"
的表单。使用返回true或在jQuery中的目标空白链接上返回false
但是,我想在启动新窗口之前验证窗体。我可以使用window.open代替,但可以通过弹出式窗口拦截器阻止。
我遇到的问题是验证使用ajax和获取响应返回false所需的时间太长,并且它会打开新窗口。
$('.submit').click(function(){
$.post("/ajax/save/", { state: $('.state_field').val() },
function(data) {
if(data == 'false'){
alert('invalid state');
return false;
}else{
return true;
}
}
);
});
有没有人有建议,我可以如何解决这个问题?
谢谢!
答
(你或许应该使用$("form").submit(function() {})
,因为这也捕捉时,有人在一个文本框按下Enter键。)
你可以做的是
- 不包括形式
target="_blank"
- 赶上提交并*它(最好使用
event.preventDefault();
) - 做ajax调用val
- 在回调中:添加
target="_blank"
并再次提交表单(您可以使用类似$("form[target]").length == 1
的检查来查看表单是否第二次提交。
虽然这一切都可以使其工作,但您应该考虑在用户在每个字段中输入数据后验证表单,这也将改善用户体验。
答
在点击开始时使用event
的preventDefault
方法。
$('.submit').click(function(event){
event.preventDefault();
[...]
这将从提交停止你的形式,并且比使用return false;
一个更好的解决方案。
如果您需要做的AJAX后重定向叫你能做到这一点的标准方式:
window.location.replace([url to redirect to]);
答
弹出广告拦截阻止新window
如果他们在script execution context
打开。如果通过用户操作打开窗口,则允许。您可以尝试在synchronous
模式下使用jQuery
ajax
这将解决您的问题的其他部分,因为函数不会等待,直到ajax响应到来,并且您有条件地返回true/false。
$('.submit').click(function(){
$.ajax({
url: "/ajax/save/",
type: "POST",
async: false,
data: { state: $('.state_field').val() },
success: function(data) {
if(data == 'false'){
alert('invalid state');
return false;
}else{
return true;
}
}
);
});
感谢您的意见。我没有这样做,但它给了我这个想法。我刚刚创建了一个具有target =“_ blank”和正确的动作url的新表单。那么只要提交该表格,如果主表格是正确的 – dzm