使用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)
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
属性值并将url
为href
,如何使用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.