2011-09-01 69 views
0

我有一个提交时有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; 
       } 
      } 
     ); 
    }); 

有没有人有建议,我可以如何解决这个问题?

谢谢!

回答

1

(你或许应该使用$("form").submit(function() {}),因为这也捕捉时,有人在一个文本框按下Enter键。)

你可以做的是

  1. 不包括形式target="_blank"
  2. 赶上提交并封锁它(最好使用event.preventDefault();
  3. 做ajax调用val
  4. 在回调中:添加target="_blank"并再次提交表单(您可以使用类似$("form[target]").length == 1的检查来查看表单是否第二次提交。

虽然这一切都可以使其工作,但您应该考虑在用户在每个字段中输入数据后验证表单,这也将改善用户体验。

+0

感谢您的意见。我没有这样做,但它给了我这个想法。我刚刚创建了一个具有target =“_ blank”和正确的动作url的新表单。那么只要提交该表格,如果主表格是正确的 – dzm

0

在点击开始时使用eventpreventDefault方法。

$('.submit').click(function(event){ 
event.preventDefault(); 
[...] 

这将从提交停止你的形式,并且比使用return false;一个更好的解决方案。

如果您需要做的AJAX后重定向叫你能做到这一点的标准方式:

window.location.replace([url to redirect to]); 
0

弹出广告拦截阻止新window如果他们在script execution context打开。如果通过用户操作打开窗口,则允许。您可以尝试在synchronous模式下使用jQueryajax这将解决您的问题的其他部分,因为函数不会等待,直到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; 
        } 
       } 
      ); 
     });