ChatGPT解决这个技术问题 Extra ChatGPT

JavaScript open in a new window, not tab

I have a select box that calls window.open(url) when an item is selected. Firefox will open the page in a new tab by default. However, I would like the page to open in a new window, not a new tab.

How can I accomplish this?


a
amn

Specify window "features" to the open call:

window.open(url, windowName, "height=200,width=200");

When you specify a width/height, it will open it in a new window instead of a tab.

See https://developer.mozilla.org/en-US/docs/Web/API/Window.open#Position_and_size_features for all the possible features.


Good tip. I think Opera will still open this in a tab though :).
Working in IE6, FF 3.6, Chrome 9.0
Doesn't work any more in FF 11.0, see my question! @James
Doesn't work in today's browsers. By default they all open a new windows in a new tab of current window. It also depends on browser options. You cannot control it using JavaScript.
This is NOT the fact you put "height=200,width=200" which perform opening in a new window. This is simply the fact to put extra parameter (location, status etc.... it doesn't matter)
s
sth

You don't need to use height, just make sure you use _blank, Without it, it opens in a new tab.

For a empty window:

window.open('', '_blank', 'toolbar=0,location=0,menubar=0');

For a specific URL:

window.open('http://www.google.com', '_blank', 'toolbar=0,location=0,menubar=0');

But what if i want to give it a name as well?
At least in Chrome, location=0 is necessary when the JS is invoked from a button or anchor element.
worked perfectly. had to include location=0 as well in firefox.
@nwbrad are you sure about the '_blank' part because as far as I know '_blank' is the default value when we don't specify any other value. In your case, opening a new window instead of a new tab has to do something with providing the 3rd parameter to window.open function. In your case it is 'toolbar=0,location=0,menubar=0'. You can verify it by omitting this third parameter and leaving '_blank' there as the 2nd parameter.
Works perfectly in in modern browsers like Firefox 76 and Internet Explorer 11. The tip is adding location=0 in the parameters. I would also suggest naming the window instead of using using the _blank target, so that the same window is used again if the user clicks several times the element that opens the popup, and chaining with focus() so that already an opened popup gets the focus : window.open('http://stackoverflow.com', 'Stack_Overflow','location=0').focus();
V
VXp

I may be wrong, but from what I understand, this is controlled by the user's browser preferences, and I do not believe that this can be overridden.


You are right, the user can set the "about:config" preference "browser.tabs.opentabfor.windowopen" to true, but that is a global setting and I do not want to change the global behavior of our users browsers ;)
I told you I have code that works. I typed this into firebug console: window.open("", "poop", "height=200,width=200,modal=yes,alwaysRaised=yes"); and guess what??? it works!!!!!!
Yes it works, but this seems to be a bit of a hack. Firefox is written in such a way that opening a new window vs tab is a browser preference, not a javascript preference. Therefore it is feasible that your suggestion wont work the same in a later version of firefox. I'd rather not rely on a hack.
And to be clear, I don't mean it's a javascript hack. Adding window height and width are clearly features of the js window.open method (w3schools.com/HTMLDOM/met_win_open.asp) I mean hack in the sense of manipulating the intended behavior of firefox.
I wouldn't really call it a hack, per se. You're just compromising on what behavior you'd actually like to have, and implementing that, instead.
a
arulmr

Try:

window.open("", [window name], "height=XXX,width=XXX,modal=yes,alwaysRaised=yes");

I have some code that does what your say, but there is a lot of parameters in it. I think these are the bare minimum, let me know if it doesn't work, I'll post the rest.


This works in FF 31 and Chrome 36 using only the "modal=yes" option. All options specified work as well. I also have "Open new windows in new tabs instead" checked in my FF preferences. Without open options, windows open in new tab.
After some more testing, it seems almost any parameters―as long as there is at least one―will open a new window instead of a tab. For example just "top=0" even works in FF 31 and Chrome 36. This is on OpenBSD using the cwm window manager. So results may vary.
May i know, what is [window name]?
P
Peter

OK, after making a lot of test, here my concluson:

When you perform:

     window.open('www.yourdomain.tld','_blank');
     window.open('www.yourdomain.tld','myWindow');

or whatever you put in the destination field, this will change nothing: the new page will be opened in a new tab (so depend on user preference)

If you want the page to be opened in a new "real" window, you must put extra parameter. Like:

window.open('www.yourdomain.tld', 'mywindow','location=1,status=1,scrollbars=1, resizable=1, directories=1, toolbar=1, titlebar=1');

After testing, it seems the extra parameter you use, dont' really matter: this is not the fact you put "this parameter" or "this other one" which create the new "real window" but the fact there is new parameter(s).

But something is confused and may explain a lot of wrong answers:

This:

 win1 = window.open('myurl1', 'ID_WIN');
 win2 = window.open('myurl2', 'ID_WIN', 'location=1,status=1,scrollbars=1');

And this:

 win2 = window.open('myurl2', 'ID_WIN', 'location=1,status=1,scrollbars=1');
 win1 = window.open('myurl1', 'ID_WIN');

will NOT give the same result.

In the first case, as you first open a page without extra parameter, it will open in a new tab. And in this case, the second call will be also opened in this tab because of the name you give.

In second case, as your first call is made with extra parameter, the page will be opened in a new "real window". And in that case, even if the second call is made without the extra parameter, it will also be opened in this new "real window"... but same tab!

This mean the first call is important as it decided where to put the page.


This answer should have lots of ++++
g
glomad

You might try following function:

<script type="text/javascript">
function open(url)
{
  var popup = window.open(url, "_blank", "width=200, height=200") ;
  popup.location = URL;
}
</script>

The HTML code for execution:

<a href="#" onclick="open('http://www.google.com')">google search</a>

What is the purpose of the popup.location = URL;? The window.open() call should open it to the proper URL, and in your code example, URL is not defined so it is going to fall back to the experimental (and not widely support) URL object. While using it for that is debatable, I'm curious what the motivations are for its use here?
Solid answer and taught me how to make the location non-editable. thanks
C
CookieOfFortune

You shouldn't need to. Allow the user to have whatever preferences they want.

Firefox does that by default because opening a page in a new window is annoying and a page should never be allowed to do so if that is not what is desired by the user. (Firefox does allow you to open tabs in a new window if you set it that way).


you are so wrong. and by the way, saying "you shouldnt need to" is not appropriate, especially if it is something the boss wants
Lets try and keep the comments practical and helpful. We can disagree without being insulting.
@theman_on_vista: Convincing your boss is your responsibility. Your company has bestowed on you the responsibility to resolve design issues. This includes pointing out wrong design ideas.
So true. The screen belongs to the user, and no one else.
It is in the realm of the designer to choose popup or tab. While I am a user that always prefers tabs, I recognize that sometimes, the design really calls for a popup or really calls for a tab. It should be in the realm of the programmer to make it possible. Putting philosophical differences aside, this sort of comment is entirely inappropriate for a programming reference site. And in this case, it is not a "should I?" question. It is "how do I?"
M
MuniR

The key is the parameters :

If you provide Parameters [ Height="" , Width="" ] , then it will open in new windows.

If you DON'T provide Parameters , then it will open in new tab.

Tested in Chrome and Firefox


newwin = window.open('test.aspx', '', ''); tested in Chrome: 26
T
Tom Lianza

Interestingly, I found that if you pass in an empty string (as opposed to a null string, or a list of properties) for the third attribute of window.open, it would open in a new tab for Chrome, Firefox, and IE. If absent, the behavior was different.

So, this is my new call:

 window.open(url, windowName, '');

Isn't the original poster trying to open popups in a new window though? Also, in IE 11, the code snippet you gave will open a new window or tab based on the user's browser preference.
Z
Zeeshan Akhter

try that method.....

function popitup(url) {
       //alert(url);
       newwindow=window.open("http://www.zeeshanakhter.com","_blank","toolbar=yes,scrollbars=yes, resizable=yes, top=500, left=500, width=400, height=400");
       newwindow.moveTo(350,150);
   if (window.focus) 
          {
             newwindow.focus()
          }
   return false;
  }

C
Community

I just tried this with IE (11) and Chrome (54.0.2794.1 canary SyzyASan):

window.open(url, "_blank", "x=y")

... and it opened in a new window.

Which means that Clint pachl had it right when he said that providing any one parameter will cause the new window to open.

-- and apparently it doesn't have to be a legitimate parameter!

(YMMV - as I said, I only tested it in two places...and the next upgrade might invalidate the results, any way)

ETA: I just noticed, though - in IE, the window has no decorations.


D
DAustin

For me the solution was to have

"location=0"

in the 3rd parameter. Tested on latest FF/Chrome and an old version of IE11

Full method call I use is below (As I like to use a variable width):

window.open(url, "window" + id, 'toolbar=0,location=0,scrollbars=1,statusbar=1,menubar=0,resizable=1,width=' + width + ',height=800,left=100,top=50');

C
Community

Answered here. But posting it again for reference.

window.open() will not open in new tab if it is not happening on actual click event. In the example given the url is being opened on actual click event. This will work provided user has appropriate settings in the browser.

<a class="link">Link</a>
<script  type="text/javascript">
     $("a.link").on("click",function(){
         window.open('www.yourdomain.com','_blank');
     });
</script>

Similarly, if you are trying to do an ajax call within the click function and want to open a window on success, ensure you are doing the ajax call with async : false option set.


s
shihab mm

I think its not html target properties problem but you unchecked "open nw windows in a new tab instead" option in "tab" tab under firefox "options" menu. check it and try again.

https://i.stack.imgur.com/Kxx2D.png


C
Community

I had this same question but found a relatively simple solution to it.

In JavaScript I was checking for window.opener !=null; to determine if the window was a pop up. If you're using some similar detection code to determine if the window you're site is being rendered in is a pop up you can easily "turn it off" when you want to open a "new" window using the new windows JavaScript.

Just put this at the top of your page you want to always be a "new" window.

<script type="text/javascript">
    window.opener=null;
</script>

I use this on the log in page of my site so users don't get pop up behavior if they use a pop up window to navigate to my site.

You could even create a simple redirect page that does this and then moves to the URL you gave it. Something like,

JavaScript on parent page:

window.open("MyRedirect.html?URL="+URL, "_blank");

And then by using a little javascript from here you can get the URL and redirect to it.

JavaScript on Redirect Page:

 <script type="text/javascript">
        window.opener=null;

    function getSearchParameters() {
          var prmstr = window.location.search.substr(1);
          return prmstr != null && prmstr != "" ? transformToAssocArray(prmstr) : {};
    }

    function transformToAssocArray( prmstr ) {
        var params = {};
        var prmarr = prmstr.split("&");
        for ( var i = 0; i < prmarr.length; i++) {
            var tmparr = prmarr[i].split("=");
            params[tmparr[0]] = tmparr[1];
        }
        return params;
    }

    var params = getSearchParameters();
    window.location = params.URL;
    </script>