# Popups and window methods A popup window is one of the oldest methods to show additional document to user. Basically, you just run: ```js window.open('http://javascript.info/') ``` ... And it will open a new window with given URL. Most modern browsers are configured to open new tabs instead of separate windows. [cut] ## Popup blocking Popups exist from really ancient times. The initial idea was to show another content without closing the main window. As of now, there are other ways to do that: JavaScript is able to send requests for server, so popups are rarely used. But sometimes they are still handy. In the past evil sites abused popups a lot. A bad page could open tons of popup windows with ads. So now most browsers try to block popups and protect the user. **Most browsers block popups if they are called outside of user-triggered event handlers like `onclick`.** If you think about it, that's a bit tricky. If the code is directly in an `onclick` handler, then that's easy. But what is the popup opens in `setTimeout`? Try this code: ```js run // open after 3 seconds setTimeout(() => window.open('http://google.com'), 3000); ``` The popup opens in Chrome, but gets blocked in Firefox. ...And this works in Firefox too: ```js run // open after 1 seconds setTimeout(() => window.open('http://google.com'), 1000); ``` The difference is that Firefox treats a timeout of 2000ms or less are acceptable, but after it -- removes the "trust", assuming that now it's "outside of the user action". So the first one is blocked, and the second one is not. ## Modern usage As of now, we have many methods to load and show data on-page with JavaScript. But there are still situations when a popup works best. For instance, many shops use online chats for consulting people. A visitor clicks on the button, it runs `window.open` and opens the popup with the chat. Why a popup is good here, why not in-page? 1. A popup is a separate window with its own independent JavaScript environment. So a chat service doesn't need to integrate with scripts of the main shop site. 2. A popup is very simple to attach to a site, little to no overhead. It's only a small button, without additional scripts. 3. A popup may persist even if the user left the page. For example, a consult advices the user to visit the page of a new "Super-Cooler" goodie. The user goes there in the main window without leaving the chat. ## window.open The syntax to open a popup is: `window.open(url, name, params)`: url : An URL to load into the new window. name : A name of the new window. Each window has a `window.name`, and here we can specify which window to use for the popup. If there's already a window with such name -- the given URL opens in it, otherwise a new window is opened. params : The configuration string for the new window. It contains settings, delimited by a comma. There must be no spaces in params, for instance: `width:200,height=100`. Settings for `params`: - Position: - `left/top` (numeric) -- coordinates of the window top-left corner on the screen. There is a limitation: a new window cannot be positioned offscreen. - `width/height` (numeric) -- width and height of a new window. There is a limit on minimal width/height, so it's impossible to create an invisible window. - Window features: - `menubar` (yes/no) -- shows or hides the browser menu on the new window. - `toolbar` (yes/no) -- shows or hides the browser navigation bar (back, forward, reload etc) on the new window. - `location` (yes/no) -- shows or hides the URL field in the new window. FF and IE don't allow to hide it by default. - `status` (yes/no) -- shows or hides the status bar. Again, most browsers force it to show. - `resizable` (yes/no) -- allows to disable the resize for the new window. Not recommended. - `scrollbars` (yes/no) -- allows to disable the scrollbars for the new window. Not recommended. There is also a number of less supported browser-specific features, which are usually not used. Check window.open in MDN for examples. ## Example: a minimalistic window Let's open a window with minimal set of features just to see which of them browser allows to disable: ```js run let params = `scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no, width=0,height=0,left=-1000,top=-1000`; open('/', 'test', params); ``` Here most "window features" are disabled and window is positioned offscreen. Run it and see what really happens. Most browsers "fix" odd things like zero `width/height` and offscreen `left/top`. For instance, Chrome open such a window with full width/height, so that it occupies the full screen. Let's add normal positioning options and reasonable `width`, `height`, `left`, `top` coordinates: ```js run let params = `scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no, width=600,height=300,left=100,top=100`; open('/', 'test', params); ``` Most browsers show the example above as required. Rules for omitted settings: - If there is no 3rd argument in the `open` call, or it is empty, then the default window parameters are used. - If there is a string of params, but some yes/no features are omitted, then the omitted features are disabled, if the browser allows that. So if you specify params, make sure you explicitly set all required features to yes. - If there is no `left/top` in params, then the browser tries to open a new window near the last opened window. - If there is no `width/height`, then the new window will be the same size as the last opened. ## Accessing a popup The `open` call returns a reference to the new window. It can be used to manipulate it's properties, change location and even more. In the example below, the contents of the new window is modified after loading. ```js run let newWindow = open('/', 'example', 'width=300,height=300') newWindow.focus(); newWindow.onload = function() { let html = `