2011-09-01 96 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; 
        } 
       } 
      ); 
     });