2011-07-08 37 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リクエストが完了し、リクエストからの応答でイベントを受け取るまでにウィンドウをトリガするチャンスを失った。ポップアップブロックを開くと、元のクリックイベント、それはその時までに長続きしていない。

3

Ajaxコールを同期させることで私のケースを解決しました。例えば。 (jQuery付き):

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