使用JavaScript在新标签(而不是新窗口)中打开一个URL

我试图在新标签中打开一个URL ,而不是一个popup窗口。 我已经看到了相关的问题,其答案如下所示:

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

但是他们都没有为我工作,浏览器仍然试图打开一个popup窗口。

作者没有办法可以select在新标签中打开而不是在新窗口中打开。 这是用户偏好

CSS3提出了新的目标 ,但规范被放弃了 。

相反是不正确的。 通过在window.open的第三个参数中指定窗口的尺寸,当首选项为制表符时,可以触发一个新的窗口。

这是一个窍门,

 function openInNewTab(url) { var win = window.open(url, '_blank'); win.focus(); } 

在大多数情况下,这应该直接发生在链接的onclick处理程序中,以防止popup窗口阻止程序以及默认的“新窗口”行为。 你可以这样做,或者通过添加一个事件监听器到你的DOM对象。

 <div onclick="openInNewTab('www.test.com');">Something To Click On</div> 

http://www.tutsplanet.com/open-url-new-tab-using-javascript-196/

window.open()没有在实际的点击事件中发生,它将不会在新标签中打开。 在给出的例子中,URL正在打开实际的点击事件。 这将工作,只要用户在浏览器中有适当的设置

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

同样,如果您尝试在click函数中执行Ajax调用,并希望在成功时打开窗口,请确保您正在使用async : false选项集进行Ajax调用。

window.open无法在所有浏览器的新选项卡中可靠地打开popup窗口

不同的浏览器 以不同的方式 实现 window.open 的行为 ,尤其是关于用户的浏览器偏好。 您不能期望window.open在所有Internet Explorer,Firefox和Chrome上的行为都是相同的,因为它们处理用户的浏览器首选项的方式不同。

例如,Internet Explorer(11)用户可以select在新窗口或新选项卡中打开popup窗口, 但不能强制Internet Explorer 11用户通过 window.open 以某种方式打开popup窗口 ,正如昆汀的答案中所暗示的那样 。

至于Firefox(29)用户,使用window.open(url, '_blank') 取决于他们浏览器的标签首选项,尽pipe你仍然可以通过指定宽度和高度来强制他们在新窗口中打开popup窗口。 Chrome?“部分)。

示范

转到浏览器的设置并将其configuration为在新窗口中打开popup窗口。

Internet Explorer(11)

Internet Explorer设置对话框1

Internet Explorer选项卡设置对话框

testing页面

如上所示,在设置Internet Explorer(11)以在新窗口中打开popup窗口之后,使用以下testing页来testingwindow.open

 <!DOCTYPE html> <html> <head> <title>Test</title> </head> <body> <button onclick="window.open('https://stackoverflow.com/q/4907843/456814');"> <code>window.open(url)</code> </button> <button onclick="window.open('https://stackoverflow.com/q/4907843/456814', '_blank');"> <code>window.open(url, '_blank')</code> </button> </body> </html> 

注意到popup窗口是在新窗口中打开的,而不是新的选项卡。

您也可以在Firefox(29)中将其标签首选项设置为新窗口,然后testing以上代码片段,并查看相同的结果。

什么关于Chrome? 它实现window.open不同于Internet Explorer(11)和Firefox(29)。

我不是100%确定,但它看起来像铬(版本34.0.1847.131 m )似乎没有任何设置,用户可以用来select是否要在新窗口中打开popup窗口或新的选项卡(如Firefox和Internet Explorer有)。 我查看了pipe理popup式窗口的Chrome文档 ,但没有提到任何有关此类事情的信息。

另外, 不同的浏览器似乎不同地实现了 window.open 的行为 在Chrome和Firefox中, 指定宽度和高度会强制popup窗口,即使用户已经设置Firefox(29)在新选项卡中打开新窗口(正如在新窗口中打开JavaScript的答案中提到的,而不是选项卡中所述 ) :

 <!DOCTYPE html> <html> <head> <title>Test</title> </head> <body> <button onclick="window.open('https://stackoverflow.com/q/4907843/456814', 'test', 'width=400, height=400');"> <code>window.open(url)</code> </button> </body> </html> 

但是, 如果用户将选项卡设置为其浏览器首选项,甚至不指定宽度和高度将强制为他们popup一个新的窗口,上面相同的代码片断将始终在Internet Explorer 11中打开一个新选项卡

因此,Chrome中的window.open的行为似乎是在onclick事件中使用新标签时打开popup窗口,当从浏览器控制台( 如其他人所指出的 )使用时,在新窗口中打开它们并打开它们在用宽度和高度指定的新窗口中。

概要

不同的浏览器 根据用户的浏览器偏好来 实现 window.open 的行为 您不能期望window.open在所有Internet Explorer,Firefox和Chrome上的行为都是相同的,因为它们处理用户的浏览器首选项的方式不同。

额外阅读

  • window.open文档 。

有了jQuery,我正在使用这个:

 var url = "http://google.com"; $("<a>").attr("href", url).attr("target", "_blank")[0].click(); 

它创build一个虚拟a元素,给它target="_blank"所以它打开新标签,给它正确的url href ,然后点击它。

如果你想,基于这个,你可以创build一些function:

 function openInNewTab(url) { $("<a>").attr("href", url).attr("target", "_blank")[0].click(); } 

然后你可以像这样使用它:

 openInNewTab("http://google.com"); 

对于非jQuery场景,函数如下所示:

 function openInNewTab(url) { var a = document.createElement("a"); a.target = "_blank"; a.href = url; a.click(); } // And then openInNewTab("http://google.com"); 

为了详细阐述史蒂文·斯皮尔伯格的回答,我在这样的情况下做了这个:

 $('a').click(function() { $(this).attr('target', '_blank'); }); 

这样,就在浏览器跟随链接设置目标属性之前,所以它会使链接在新的标签或窗口中打开( 取决于用户的设置 )。

如果你使用window.open(url, '_blank') ,它会在Chrome上被阻塞(popup窗口阻止程序)。

尝试这个:

 $('#myButton').click(function () { var redirectWindow = window.open('http://google.com', '_blank'); redirectWindow.location; }); 

我使用以下,它工作得很好!

 window.open(url, '_blank').focus(); 

我认为你无法控制这个。 如果用户已经设置浏览器在新窗口中打开链接,则不能强制在新选项卡中打开链接。

JavaScript在新窗口中打开,而不是选项卡

一个有趣的事实是,如果用户没有调用这个动作(点击一个button或者某个东西),或者它是asynchronous的,那么新的选项卡就不能被打开,例如,这个选项卡不会在新选项卡中打开:

 $.ajax({ url: "url", type: "POST", success: function() { window.open('url', '_blank'); } }); 

但是,这可能会打开一个新的选项卡,具体取决于浏览器设置:

 $.ajax({ url: "url", type: "POST", async: false, success: function() { window.open('url', '_blank'); } }); 

只要省略[strWindowFeatures]参数就会打开一个新标签,除非浏览器设置覆盖(浏览器设置胜过JavaScript)。

新窗户

 var myWin = window.open(strUrl, strWindowName, [strWindowFeatures]); 

新标签

 var myWin = window.open(strUrl, strWindowName); 

– 要么 –

 var myWin = window.open(strUrl); 
 (function(a){ document.body.appendChild(a); a.setAttribute('href', location.href); a.dispatchEvent((function(e){ e.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, true, false, false, false, 0, null); return e }(document.createEvent('MouseEvents'))))}(document.createElement('a'))) 

你可以使用一个form的技巧:

 $(function () { $('#btn').click(function () { openNewTab("http://stackoverflow.com") return false; }); }); function openNewTab(link) { var frm = $('<form method="get" action="' + link + '" target="_blank"></form>') $("body").append(frm); frm.submit().remove(); } 

jsFiddle演示

这与浏览器设置无关,如果您尝试从自定义函数中打开新的选项卡。

在此页面中,打开JavaScript控制台并input:

 document.getElementById("nav-questions").setAttribute("target", "_blank"); document.getElementById("nav-questions").click(); 

它会尝试打开一个popup窗口,不pipe你的设置,因为'点击'来自一个自定义的行动。

为了performance得像一个链接上的实际“鼠标点击”,你需要遵循@ spirinvladimir的build议,并真正创build它:

 document.getElementById("nav-questions").setAttribute("target", "_blank"); document.getElementById("nav-questions").dispatchEvent((function(e){ e.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); return e }(document.createEvent('MouseEvents')))); 

这里是一个完整的例子(不要尝试在jsFiddle或类似的在线编辑器,因为它不会让你redirect到外部页面):

 <!DOCTYPE html> <html> <head> <style> #firing_div { margin-top: 15px; width: 250px; border: 1px solid blue; text-align: center; } </style> </head> <body> <a id="my_link" href="http://www.google.com"> Go to Google </a> <div id="firing_div"> Click me to trigger custom click </div> </body> <script> function fire_custom_click() { alert("firing click!"); document.getElementById("my_link").dispatchEvent((function(e){ e.initMouseEvent("click", true, true, window, /* type, canBubble, cancelable, view */ 0, 0, 0, 0, 0, /* detail, screenX, screenY, clientX, clientY */ false, false, false, false, /* ctrlKey, altKey, shiftKey, metaKey */ 0, null); /* button, relatedTarget */ return e }(document.createEvent('MouseEvents')))); } document.getElementById("firing_div").onclick = fire_custom_click; </script> </html> 

这项工作对我来说,只是防止事件,将url添加到<a> tag然后触发该tag的点击事件。

 Js $('.myBtn').on('click', function(event) { event.preventDefault(); $(this).attr('href',"http://someurl.com"); $(this).trigger('click'); }); HTML <a href="#" class="myBtn" target="_blank">Go</a> 

或者你可以创build一个链接元素,然后单击它…

 var evLink = document.createElement('a'); evLink.href = 'http://' + strUrl; evLink.target = '_blank'; document.body.appendChild(evLink); evLink.click(); // Now delete it evLink.parentNode.removeChild(evLink); 

这不应该被任何popup窗口阻止程序阻止…希望。

从Firefox(Mozilla)扩展中打开一个新标签是这样的:

 gBrowser.selectedTab = gBrowser.addTab("http://example.com"); 

这种方式类似于上述解决scheme,但实现方式不同

.social_icon – >一些CSS类

  <div class="social_icon" id="SOME_ID" data-url="SOME_URL"></div> $('.social_icon').click(function(){ var url = $(this).attr('data-url'); var win = window.open(url, '_blank'); ///similar to above solution win.focus(); }); 

如何使用_blank作为target属性值并将urlhref ,如何使用style显示:使用aa children元素隐藏? 然后添加到DOM,然后触发一个子元素的点击事件。

UPDATE

这是行不通的。 浏览器阻止默认行为。 它可以以编程方式触发,但不遵循默认行为。

检查并看看你自己: http : //jsfiddle.net/4S4ET/

这可能是一个黑客,但在Firefox中,如果指定第三个参数“fullscreen = yes”,则会打开一个全新的窗口。

例如,

 <a href="#" onclick="window.open('MyPDF.pdf', '_blank', 'fullscreen=yes'); return false;">MyPDF</a> 

它似乎实际上覆盖了浏览器设置。

为页面上的所有超链接和表单指定默认目标(非JavaScript):

 <head> <base target="_blank"> </head> 

我想和写这个人的人有点同意:“对于现有网页中的链接,如果新网页是与新网页相同的网站的一部分,浏览器将始终打开新标签中的链接现有的网页“。 至less对于我来说,这个“通用规则”适用于Chrome,Firefox,Opera,IE,Safari,SeaMonkey和Konqueror。

无论如何,利用对方提供的东西的方法不那么复杂。 假设我们正在讨论您自己的网站(下面的“thissite.com”),您想要控制浏览器的function,那么在下面,您需要将“specialpage.htm”设置为“EMPTY”,根本没有HTML(节省时间从服务器发送数据!)。

  var wnd, URL; //global variables //specifying "_blank" in window.open() is SUPPOSED to keep the new page from replacing the existing page wnd = window.open("http://www.thissite.com/specialpage.htm", "_blank"); //get reference to just-opened page //if the "general rule" above is true, a new tab should have been opened. URL = "http://www.someothersite.com/desiredpage.htm"; //ultimate destination setTimeout(gotoURL(),200); //wait 1/5 of a second; give browser time to create tab/window for empty page function gotoURL() { wnd.open(URL, "_self"); //replace the blank page, in the tab, with the desired page wnd.focus(); //when browser not set to automatically show newly-opened page, this MAY work } 

如果你只想打开外部链接(链接到其他网站),那么JavaScript / jQuery的这一点运作良好:

 $(function(){ var hostname = window.location.hostname.replace('www.', ''); $('a').each(function(){ var link_host = $(this).attr('hostname').replace('www.', ''); if (link_host !== hostname) { $(this).attr('target', '_blank'); } }); }); 

不知何故, 网站可以做到这一点。 (我没有时间从这个混乱中提取出来,但这是代码)

 if (!Array.prototype.indexOf) Array.prototype.indexOf = function(searchElement, fromIndex) { if (this === undefined || this === null) throw new TypeError('"this" is null or not defined'); var length = this.length >>> 0; fromIndex = +fromIndex || 0; if (Math.abs(fromIndex) === Infinity) fromIndex = 0; if (fromIndex < 0) { fromIndex += length; if (fromIndex < 0) fromIndex = 0 } for (; fromIndex < length; fromIndex++) if (this[fromIndex] === searchElement) return fromIndex; return -1 }; (function Popunder(options) { var _parent, popunder, posX, posY, cookieName, cookie, browser, numberOfTimes, expires = -1, wrapping, url = "", size, frequency, mobilePopupDisabled = options.mobilePopupDisabled; if (this instanceof Popunder === false) return new Popunder(options); try { _parent = top != self && typeof top.document.location.toString() === "string" ? top : self } catch (e) { _parent = self } cookieName = "adk2_popunder"; popunder = null; browser = function() { var n = navigator.userAgent.toLowerCase(), b = { webkit: /webkit/.test(n), mozilla: /mozilla/.test(n) && !/(compatible|webkit)/.test(n), chrome: /chrome/.test(n), msie: /msie/.test(n) && !/opera/.test(n), firefox: /firefox/.test(n), safari: /safari/.test(n) && !/chrome/.test(n), opera: /opera/.test(n) }; b.version = b.safari ? (n.match(/.+(?:ri)[\/: ]([\d.]+)/) || [])[1] : (n.match(/.+(?:ox|me|ra|ie)[\/:]([\d.]+)/) || [])[1]; return b }(); initOptions(options); function initOptions(options) { options = options || {}; if (options.wrapping) wrapping = options.wrapping; else { options.serverdomain = options.serverdomain || "ads.adk2.com"; options.size = options.size || "800x600"; options.ci = "3"; var arr = [], excluded = ["serverdomain", "numOfTimes", "duration", "period"]; for (var p in options) options.hasOwnProperty(p) && options[p].toString() && excluded.indexOf(p) === -1 && arr.push(p + "=" + encodeURIComponent(options[p])); url = "http://" + options.serverdomain + "/player.html?rt=popunder&" + arr.join("&") } if (options.size) { size = options.size.split("x"); options.width = size[0]; options.height = size[1] } if (options.frequency) { frequency = /([0-9]+)\/([0-9]+)(\w)/.exec(options.frequency); options.numOfTimes = +frequency[1]; options.duration = +frequency[2]; options.period = ({ m: "minute", h: "hour", d: "day" })[frequency[3].toLowerCase()] } if (options.period) switch (options.period.toLowerCase()) { case "minute": expires = options.duration * 60 * 1e3; break; case "hour": expires = options.duration * 60 * 60 * 1e3; break; case "day": expires = options.duration * 24 * 60 * 60 * 1e3 } posX = typeof options.left != "undefined" ? options.left.toString() : window.screenX; posY = typeof options.top != "undefined" ? options.top.toString() : window.screenY; numberOfTimes = options.numOfTimes } function getCookie(name) { try { var parts = document.cookie.split(name + "="); if (parts.length == 2) return unescape(parts.pop().split(";").shift()).split("|") } catch (err) {} } function setCookie(value, expiresDate) { expiresDate = cookie[1] || expiresDate.toGMTString(); document.cookie = cookieName + "=" + escape(value + "|" + expiresDate) + ";expires=" + expiresDate + ";path=/" } function addEvent(listenerEvent) { if (document.addEventListener) document.addEventListener("click", listenerEvent, false); else document.attachEvent("onclick", listenerEvent) } function removeEvent(listenerEvent) { if (document.removeEventListener) document.removeEventListener("click", listenerEvent, false); else document.detachEvent("onclick", listenerEvent) } function isCapped() { cookie = getCookie(cookieName) || []; return !!numberOfTimes && +numberOfTimes <= +cookie[0] } function pop() { var features = "type=fullWindow, fullscreen, scrollbars=yes", listenerEvent = function() { var now, next; if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) if (mobilePopupDisabled) return; if (isCapped()) return; if (browser.chrome && parseInt(browser.version.split(".")[0], 10) > 30 && adParams.openNewTab) { now = new Date; next = new Date(now.setTime(now.getTime() + expires)); setCookie((+cookie[0] || 0) + 1, next); removeEvent(listenerEvent); window.open("javascript:window.focus()", "_self", ""); simulateClick(url); popunder = null } else popunder = _parent.window.open(url, Math.random().toString(36).substring(7), features); if (wrapping) { popunder.document.write("<html><head></head><body>" + unescape(wrapping || "") + "</body></html>"); popunder.document.body.style.margin = 0 } if (popunder) { now = new Date; next = new Date(now.setTime(now.getTime() + expires)); setCookie((+cookie[0] || 0) + 1, next); moveUnder(); removeEvent(listenerEvent) } }; addEvent(listenerEvent) } var simulateClick = function(url) { var a = document.createElement("a"), u = !url ? "data:text/html,<script>window.close();<\/script>;" : url, evt = document.createEvent("MouseEvents"); a.href = u; document.body.appendChild(a); evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, true, false, false, true, 0, null); a.dispatchEvent(evt); a.parentNode.removeChild(a) }; function moveUnder() { try { popunder.blur(); popunder.opener.window.focus(); window.self.window.focus(); window.focus(); if (browser.firefox) openCloseWindow(); else if (browser.webkit) openCloseTab(); else browser.msie && setTimeout(function() { popunder.blur(); popunder.opener.window.focus(); window.self.window.focus(); window.focus() }, 1e3) } catch (e) {} } function openCloseWindow() { var tmp = popunder.window.open("about:blank"); tmp.focus(); tmp.close(); setTimeout(function() { try { tmp = popunder.window.open("about:blank"); tmp.focus(); tmp.close() } catch (e) {} }, 1) } function openCloseTab() { var ghost = document.createElement("a"), clk; document.getElementsByTagName("body")[0].appendChild(ghost); clk = document.createEvent("MouseEvents"); clk.initMouseEvent("click", false, true, window, 0, 0, 0, 0, 0, true, false, false, true, 0, null); ghost.dispatchEvent(clk); ghost.parentNode.removeChild(ghost); window.open("about:blank", "PopHelper").close() } pop() })(adParams) 

The browser will always open the link in a new tab if the link is on the same domain (on the same website). If the link is on some other domain it will open it in a new tab/window, depending on browser settings.

So, according to this, we can use:

 <a class="my-link" href="http://www.mywebsite.com" rel="http://www.otherwebsite.com">new tab</a> 

And add some jQuery code:

 jQuery(document).ready(function () { jQuery(".my-link").on("click",function(){ var w = window.open('http://www.mywebsite.com','_blank'); w.focus(); w.location.href = jQuery(this).attr('rel'); return false; }); }); 

So, first open new window on same website with _blank target (it will open it in new tab), and then open your desired website inside that new window.