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
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/
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:
I use this method:
window.location.href = window.location.protocol + '//' +
window.location.host + window.location.pathname +
"?download=" + encodeURIComponent(urlToDownload)
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);
}
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();
}
})
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.
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;
});