How do I prevent Google Chrome from blocking my popup?

前端 未结 7 1088
小鲜肉
小鲜肉 2020-11-30 01:21

On my website there is a button that just used to call a function that calls window.open, however, recently an adjustment was needed to do a server-side check b

相关标签:
7条回答
  • 2020-11-30 01:32

    You can open a window that is not blocked just under the onclick event, if you open it on ajax call it is considered popup. However I used this method with success for some time to open a popup and not be blocked.

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

    0 讨论(0)
  • 2020-11-30 01:35

    Yes, popups should be a direct result of a user action. Doing them in ajax callback will not do the trick. Also, using async:false is bad - in FF it is known to block the whole browser. Think of some other way to do the check:

    • it could be the first thing you do in the popup
    • you can open the popup on click and manipulate it later when the callback fires
    • you can require the user to click again some button to trigger the popup (probably the worst solution)
    • you can do it on page load
    0 讨论(0)
  • 2020-11-30 01:35

    I use this method:

    1. Redirect to the same page with download url added as parameter:
    window.location.href = window.location.protocol + '//' +
                        window.location.host + window.location.pathname +
                        "?download=" + encodeURIComponent(urlToDownload)
    
    1. Detect this parameter on page initialization and redirect to download:
    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);
    }
    
    0 讨论(0)
  • 2020-11-30 01:36

    The previous solution did not work for me, but I based on it and used named window.

    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();
            }
    })
    
    0 讨论(0)
  • 2020-11-30 01:41

    In my case the window.open was launched inside a promise in angular, which turned the popup blocker on, my solution was:

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

    browserService:

    this.openNewTab = function(){
      var newTabWindow = $window.open();
      return newTabWindow;
    }
    
    this.updateTabLocation = function(tabLocation, tab) {
      if(!tabLocation){
        tab.close();
      }
      tab.location.href = tabLocation;
    }
    

    this is how you can open a new tab using the promise response and not invoking the popup blocker.

    0 讨论(0)
  • 2020-11-30 01:54

    Following up on Emil's excellent answer, "you can open the popup on click and manipulate it later when the callback fires". I used this implementation.

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

    New code here

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

    end new code

        $.ajax({
            url: baseurl + '/index.php',
            data: { 'gameid': 618 },
            type: 'POST',
            success: function(data) {
                window.open('some url'); // will call reassignment function above 
            }
        });
    
        return false;
    });
    
    0 讨论(0)
提交回复
热议问题