2011-07-08 101 views
12

我最終需要做的是運行一個$.ajax()調用,然後在運行之後,打開一個新窗口。window.open彈出窗口在點擊事件期間被阻止

使用單擊保存其當前窗體的「預覽」按鈕,然後打開一個新窗口,顯示剛剛保存的數據的項目預覽。

但現在,彈出式窗口攔截器阻止了window.open函數。

這裏是我的代碼的基本部分:

HTML:

<a href="/surveys/185/preview" class="preview" target="_blank">Preview</a> 

的JavaScript:

$('.preview').live('click', function(event){ 
    save_survey($(this).attr('href')); 
    event.preventDefault(); 
}); 

function save_survey(url) { 
    $.ajax({ 
    type: "POST", 
    url: form_url, 
    dataType: 'json', 
    data: form_data, 
    success: function(data) { 
     window.open(url, '_blank'); 
    } 
    }); 
} 

回答

53

我就遇到了這個問題,最近,發現了這個變通:

1)在致電$.ajax和sav之前致電window.open Ë窗口參考:

var newWindow = window.open(...); 

2)回調設置保存窗口參考location屬性:

newWindow.location = url; 

或許它會幫助你。

+0

不錯!這似乎是完美的。 – Shpigford

+2

這非常聰明。我認爲沒有希望。 – JayD3e

+0

其實這似乎不再起作用。有人可以證實這是不可能的嗎? – JayD3e

2

根據這this post,它看起來像你將不得不打開你的窗口直接響應點擊(以避免被彈出窗口攔截器命中),而不是等到AJAX調用完成才能打開新窗口。

6

彈出式窗口攔截器通常阻止每個彈出窗口顯示,而不是由直接用戶操作觸發,如單擊按鈕或鏈接。

如果您在點擊事件中使用ajax請求,那麼該請求會被點擊事件觸發爲異步,這就是爲什麼在ajax請求完成其工作並且您獲得了來自請求的響應失去了觸發window.open的機會,但沒有阻止彈出窗口的阻止,原來的點擊事件在那段時間已經很長時間了。

3

我通過使Ajax調用同步來解決我的情況。例如。 (帶jQuery):

$("form").submit(function(e){ 
    e.preventDefault(); 
    $.ajax({ 
     async: false, 
     url: ..., 
     data: ..., 
     success: function(results){ 
      if(results.valid){ 
       window.open(...); 
      } 
     } 
    }); 
    return false; 
    }); 
相關問題