web-dev-qa-db-ja.com

クリックイベント中にwindow.openポップアップがブロックされる

私が最終的に行う必要があるのは、$.ajax()呼び出しを実行し、それが実行されたら、新しいウィンドウを開くことです。

現在のフォームを保存する「プレビュー」ボタンをクリックすると、保存されたばかりのデータを含むアイテムのプレビューを表示する新しいウィンドウが開きます。

しかし、現状のまま、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');
    }
  });
}
26
Shpigford

私は最近この問題に遭遇し、この回避策を見つけました:

1)window.openを呼び出す直前に$.ajaxを呼び出し、ウィンドウ参照を保存します。

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

2)保存されたウィンドウ参照のコールバックセットlocationプロパティ:

newWindow.location = url;

多分それもあなたを助けるでしょう。

66
Igor Dymov

ポップアップブロッカーは通常、ボタンやリンクのクリックなどの直接的なユーザーアクションによってトリガーされないすべてのポップアップをブロックします。

クリックイベントでajaxリクエストを使用する場合、リクエストはクリックイベントから非同期で発生します。そのため、ajaxリクエストが機能し、リクエストからの応答でイベントを取得するまでに、ポップアップブロッカーを邪魔せずにwindow.openをトリガーします。元のクリックイベントは、それまでに長い間死んでいます。

12
albertein

これは この投稿 によると、AJAX新しいウィンドウを開くための呼び出しが完了します。

3
jfriend00

私はAjax呼び出しを同期的にすることで私の問題を解決しました。例えば。 (jQueryを使用):

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