LoginSignup
44
37

More than 5 years have passed since last update.

ポップアップブロックを回避する技(モダンブラウザ非推奨)

Last updated at Posted at 2014-11-15

画面遷移はあまりしたくない。なので、Ajaxの通信後、ログインはポップアップを利用して。。とか、やりたい場合が出てくる。

最近のブラウザはポップアップブロックが多い。

特に、スマホではデフォルトの設定でポップアップブロックがONになっていることがほとんど。さらに、PCブラウザはエラーをブロックを出してくれる事があるが、スマホではポップアップが反応せず、エラーも出ず、何も起こらない。最悪な状態だ。

ポップアップブロックを回避するパターンを探し求めた。

ポップアップブロックのパターン例

popup_block

$(function() {
  window.open('xx');  // ブロック
  $('#hoge').on('click', function() {
    window.open('xx');  // ブロックされない
    $.ajax({
      url: 'xx',
      success: function(data) {
        window.open('xx');  // ブロック
      }
    });
  });
});

お分かりだろうか?

なんと、JS からウィンドウを開く際、 ユーザーからの操作に関係がない場合はブロックし、 ユーザーからの操作に関係がある場合はブロックされません。

ブロックされないパターン

  • onclickなどのユーザーが意図した行動

ブロックされるパターン

  • onload イベント
  • Ajax

Ajaxでの回避策

しかし、私がやりたいのはAjax後のポップアップだ。

popup_block_block

$(function() {
  window.open('xx');  // ブロック
  $('#hoge').on('click', function() {
    window.open('xx');  // ブロックされない
    $.ajax({
      url: 'xx',
      async: false, // 非同期ではなく同期通信にする
      success: function(data) {
        window.open('xx');  // ブロックされない
      }
    });
  });
});

お分かりだろうか?

Ajax の A に当たる Asynchronous を false にしてしまおう。これにより、同期通信となり、ユーザーが意図した行動として認識されます。

え?それ、Ajaxじゃなくね?

Sjax (Synchronous JavaScript + XML)です。

_人人人人_
> Sjax <
 ̄Y^Y^Y^Y ̄

モダンブラウザじゃ使えない?

貴重なコメントを頂きました。

hikaru_oao

メインスレッドでの同期XHRは非推奨になりました。
モダンブラウザで試すと警告が出ます。
互換性のために暫くは有効ですが、新規で使っていくべきでないと思います。

その為、1クリックでの回避策は今のところありません。

Ajaxイベント発火後に、オーバーレイなどでボタンを出してそこから、もう1クリックさせる感じですかね。。スマートじゃない。

参考サイト様

Ajaxでポップアップブロックを回避する方法

44
37
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
37