45

私のウェブサイトには、 を呼び出す関数を呼び出すためのボタンがありますがwindow.open、最近、ポップアップが開かれる前にサーバー側のチェックを行うために調整が必要でした。

AJAX 呼び出しを行うコードが追加されて以来、ブラウザはsuccessAJAX 呼び出しのコールバックで開かれるポップアップをブロックします。ユーザーのクリックイベントによって呼び出されない場合、ブラウザーがポップアップをブロックする可能性があることを読んだので、AJAX リクエストを に設定してみましたasync: false。これを回避する方法はありますか?

ポップアップで開かれるページにサーバー側のチェックを移動することもできますが、可能であればポップアップを開く前に実行したいと考えています。

コード:

<a id="attackButton" href="#">Attack Base!</a>

<script type="text/javascript">
$(function() {
    $('#attackButton').click(function() {
        $.ajax({
            url: baseurl + '/index.php?option=com_pbbgs&format=raw&getinfo=goingame',
            data: { 'gameid': 618 },
            dataType: 'text',
            async: false,
            type: 'POST',
            success: function(data) {
                eval(data);

                if (window.gameURL) {
                    goingameRaw();
                }
            }
        });

        return false;
    });
});

function goingameRaw()
{
    window.open(window.gameURL,'test','left=20,top=20,width=1024,height=640,toolbar=0,resizable=0,location=0');
}
</script>

レスポンス本文の例:

window.gameURL="http://mydomain.com/index.php?option=com_pbbgs&format=raw&startgame=618&width=1024&height=640";checktutorial('js','attack');
4

7 に答える 7

50

はい、ポップアップはユーザー アクションの直接の結果である必要があります。それらを ajax コールバックで実行してもうまくいきません。また、使用async:falseは悪いです。FF では、ブラウザ全体をブロックすることが知られています。チェックを行う別の方法を考えてみましょう。

  • ポップアップで最初に行うことかもしれません
  • クリックでポップアップを開き、後でコールバックが発生したときに操作できます
  • ポップアップをトリガーするために、ユーザーにいくつかのボタンをもう一度クリックするように要求できます (おそらく最悪の解決策)。
  • あなたはページの読み込み時にそれを行うことができます
于 2011-01-05T10:28:01.550 に答える
23

Emil の優れた回答に続いて、「クリックでポップアップを開き、後でコールバックが発生したときに操作できます」。この実装を使用しました。

$('#attackButton').click(function() {

新しいコードはこちら

    var win = window.open('');
    window.oldOpen = window.open;
    window.open = function(url) { // reassignment function
        win.location = url;
        window.open = oldOpen;
        win.focus();
    }

新しいコードを終了する

    $.ajax({
        url: baseurl + '/index.php',
        data: { 'gameid': 618 },
        type: 'POST',
        success: function(data) {
            window.open('some url'); // will call reassignment function above 
        }
    });

    return false;
});
于 2012-02-16T22:02:24.270 に答える
6

onclick イベントのすぐ下でブロックされていないウィンドウを開くことができます。ajax 呼び出しでウィンドウを開くと、ポップアップと見なされます。ただし、この方法を使用してしばらく成功し、ポップアップを開いてブロックされませんでした。

http://en.nisi.ro/blog/development/javascript/open-new-window-window-open-seen-chrome-popup/

于 2013-12-31T08:28:02.813 に答える
2

私の場合、 in angularwindow.open内で起動されpromise、ポップアップ ブロッカーがオンになりました。私の解決策は次のとおりです。

$scope.gotClick = function(){

  var myNewTab = browserService.openNewTab();
  someService.getUrl().then(
    function(res){
      browserService. updateTabLocation(res.url, myNewTab);
    }
  );
};

ブラウザサービス:

this.openNewTab = function(){
  var newTabWindow = $window.open();
  return newTabWindow;
}

this.updateTabLocation = function(tabLocation, tab) {
  if(!tabLocation){
    tab.close();
  }
  tab.location.href = tabLocation;
}

promiseこれは、ポップアップ ブロッカーを呼び出さずに、応答を使用して新しいタブを開く方法です。

于 2016-10-27T11:57:46.213 に答える
1

以前の解決策はうまくいきませんでしたが、それに基づいて名前付きウィンドウを使用しました。

internalCounter++;
var tabbedWin = window.open('','windowName_'+internalCounter);
$.ajax({
        url: url,
        async: false,
        indexValue:internalCounter,
        success: function(){
            var w= window.open(url, 'windowName_'+this.indexValue);                
            w.focus();
        }
})
于 2016-05-31T13:18:08.403 に答える
0

私はこの方法を使用します:

  1. パラメータとして追加されたダウンロード URL を使用して、同じページにリダイレクトします。
window.location.href = window.location.protocol + '//' +
                    window.location.host + window.location.pathname +
                    "?download=" + encodeURIComponent(urlToDownload)
  1. ページの初期化でこのパラメーターを検出し、ダウンロードにリダイレクトします。
function param(name){
    var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
    if (!results) { return 0; }
    return results[1] || 0;
}

var downloadParam = param('download');
if (downloadParam) {
    window.location = decodeURIComponent(downloadParam);
}
于 2017-07-09T13:24:10.903 に答える