Chrome, Javascript, window.open ในแท็บใหม่


110

ใน Chrome สิ่งนี้จะเปิดขึ้นในแท็บใหม่:

<button onclick="window.open('newpage.html', '_blank')" />

สิ่งนี้จะเปิดขึ้นในหน้าต่างใหม่ (แต่ฉันต้องการให้เปิดในแท็บใหม่ด้วย:

<script language="javascript">
  window.open('newpage.html', '_blank');
</script>

เป็นไปได้หรือไม่


2
คุณแน่ใจในสิ่งที่คุณยืนยันหรือไม่? เศษทั้งสองมีผลเหมือนกัน
Denys Séguret

1
ไม่ว่าหน้าต่างจะเปิดขึ้นในแท็บหรือหน้าต่างใหม่ขึ้นอยู่กับเบราว์เซอร์ในระบบและวิธีการที่ผู้ใช้กำหนดค่าเบราว์เซอร์ไม่ใช่สิ่งที่คุณสามารถระบุได้ในจาวาสคริปต์
jfriend00

คำตอบ:


150

คุณไม่สามารถควบคุมสิ่งนี้ได้โดยตรงเนื่องจากเป็นตัวเลือกที่ควบคุมโดยผู้ใช้ Internet Explorer

การเปิดหน้าโดยใช้ Window.open ด้วยชื่อหน้าต่างอื่นจะเปิดขึ้นในหน้าต่างเบราว์เซอร์ใหม่เช่นป๊อปอัปหรือเปิดในแท็บใหม่หากผู้ใช้กำหนดค่าเบราว์เซอร์ให้ทำเช่นนั้น

แก้ไข:

คำอธิบายโดยละเอียดเพิ่มเติม:

1.ในเบราว์เซอร์สมัยใหม่ window.open จะเปิดขึ้นในแท็บใหม่แทนที่จะเป็นป๊อปอัป

2.คุณสามารถบังคับให้เบราว์เซอร์ใช้หน้าต่างใหม่ ('ป๊อปอัป') โดยระบุตัวเลือกในพารามิเตอร์ที่ 3

3.หากการเรียก window.open ไม่ได้เป็นส่วนหนึ่งของเหตุการณ์ที่เริ่มโดยผู้ใช้การเรียกจะเปิดในหน้าต่างใหม่

4. "เหตุการณ์ที่ผู้ใช้เริ่มต้น" ไม่จำเป็นต้องมีการเรียกใช้ฟังก์ชันเดียวกัน แต่จะต้องมาจากฟังก์ชันที่เรียกใช้โดยการคลิกของผู้ใช้

5.หากผู้ใช้เริ่มต้นเหตุการณ์มอบหมายหรือเลื่อนการเรียกใช้ฟังก์ชัน (ในผู้ฟังเหตุการณ์หรือผู้รับมอบสิทธิ์ที่ไม่ผูกพันกับเหตุการณ์การคลิกหรือโดยใช้ setTimeout เป็นต้น) ผู้ใช้จะสูญเสียสถานะเป็น "ผู้ใช้เริ่มต้น"

6.ตัวป้องกันป๊อปอัปบางตัวจะอนุญาตให้เปิดหน้าต่างจากเหตุการณ์ที่ผู้ใช้เริ่มต้นขึ้น แต่จะเปิดไม่ได้

7.หากป๊อปอัปใด ๆ ถูกบล็อกตัวบล็อกที่อนุญาตตามปกติ (ผ่านเหตุการณ์ที่ผู้ใช้เริ่มต้น) จะถูกบล็อก ตัวอย่างบางส่วน ...

บังคับให้เปิดหน้าต่างในอินสแตนซ์เบราว์เซอร์ใหม่แทนที่จะเป็นแท็บใหม่:

window.open('page.php', '', 'width=1000');

สิ่งต่อไปนี้จะถือว่าเป็นเหตุการณ์ที่ผู้ใช้เริ่มต้นแม้ว่าจะเรียกใช้ฟังก์ชันอื่น:

function o(){
  window.open('page.php');
}
$('button').addEvent('click', o);

สิ่งต่อไปนี้จะไม่ถือเป็นเหตุการณ์ที่เริ่มโดยผู้ใช้เนื่องจาก setTimeout เลื่อนออกไป:

function g(){
  setTimeout(o, 1);
}
function o(){
  window.open('page.php');
}
$('button').addEvent('click', g);

2
ฉันแค่ต้องการเพิ่มสิ่งนั้นโดยการทดสอบใน Chrome และ FF ฉันพบว่าการใช้ window.open ในสิ่งที่คุณกำหนดเป็น "เหตุการณ์ที่ผู้ใช้เริ่มต้น" จะทำให้การทำงานเริ่มต้นของเบราว์เซอร์คงอยู่ โดยที่ฉันหมายความว่าหากใน Chrome คุณกด shift บน chrome ค้างไว้และคลิกหน้าต่างเบราว์เซอร์ใหม่จะปรากฏขึ้นหากคุณกด ctrl (หรือกดปุ่มกลางของเมาส์) แท็บใหม่จะเปิดขึ้นในพื้นหลัง ซึ่งดีมากคุณสามารถสร้างบางสิ่งได้โดยไม่จำเป็นต้องวางแท็กยึดทั้งหมด
Hoffmann

3
"หากการเรียก window.open ไม่ได้เป็นส่วนหนึ่งของเหตุการณ์ที่เริ่มโดยผู้ใช้การเรียกจะเปิดในหน้าต่างใหม่" ไม่มันแทบจะไม่ถูกเปิดเลยอย่างแน่นอน
TJ Crowder

3
ณ วันที่ 29 กันยายน 2557 Firefox ESR และ IE 11 ล่าสุดเปิดลิงก์ _blank หรือ window.open ในหน้าต่างใหม่เมื่อการเรียก js ใช้ _blank เป็นชื่อหน้าต่าง Chrome ปัจจุบันไม่ใช่เรื่องง่าย ฉันทดสอบการเปิดหน้าต่างใหม่ผ่านด้านบนซ้ายความกว้างความสูงแถบเครื่องมือตำแหน่งไดเร็กทอรีสถานะแถบเมนูแถบเลื่อนและปรับขนาดได้และละเว้นแต่ละหน้าต่าง Chrome เปิดขึ้นทั้งหมดในแท็บใหม่ยกเว้นเมื่อไม่ใส่สถานะแถบเมนูหรือแถบเลื่อน สิ่งนี้ดูเหมือนจะยากที่จะเชื่อโดยพลการ แต่ในเชิงประจักษ์นั่นคือสิ่งที่เกิดขึ้น ตัวอย่างที่นี่: jsbin.com/mobiyeqojaha/1
enigment

34

ในบางครั้งการบังคับใช้แท็บก็มีประโยชน์หากผู้ใช้ชอบ ตามที่ Prakash ระบุไว้ข้างต้นบางครั้งสิ่งนี้ถูกกำหนดโดยการใช้เหตุการณ์ที่ไม่ได้เริ่มต้นโดยผู้ใช้ แต่มีวิธีการแก้ไข

ตัวอย่างเช่น:

$("#theButton").button().click( function(event) {
   $.post( url, data )
   .always( function( response ) {
      window.open( newurl + response, '_blank' );
   } );
} );

จะเปิด "newurl" ในหน้าต่างเบราว์เซอร์ใหม่เสมอเนื่องจากฟังก์ชัน "always" ไม่ถือว่าผู้ใช้เริ่มต้น อย่างไรก็ตามหากเราทำสิ่งนี้:

$("#theButton").button().click( function(event) {
   var newtab = window.open( '', '_blank' );
   $.post( url, data )
   .always( function( response ) {
      newtab.location = newurl + response;
   } );
} );

เราเปิดหน้าต่างเบราว์เซอร์ใหม่หรือสร้างแท็บใหม่ตามที่กำหนดโดยความต้องการของผู้ใช้ในการคลิกปุ่มที่ผู้ใช้เริ่มต้น จากนั้นเราก็ตั้งค่าตำแหน่งเป็น URL ที่ต้องการหลังจากกลับจากโพสต์ AJAX Voila เราบังคับให้ใช้แท็บหากผู้ใช้ชอบสิ่งนั้น


ฉันสังเกตว่าหากคุณมีจุดพักใน chrome บนหน้าต่างเปิดเบราว์เซอร์จะเปิดหน้าต่างใหม่ การปล่อยให้โค้ดไม่พังดูเหมือนจะส่งผลให้มีการเปิดแท็บใหม่แทน
skinnybrit51

เป็นวิธีแก้ปัญหาที่ใช้ได้เว้นแต่ window.open ของคุณและผลลัพธ์ของฟังก์ชันคือสิ่งที่ใช้เวลา 5/6/7 วินาทีหรือมากกว่านั้น พิจารณาว่าฟังก์ชันกำลังโพสต์ข้อมูลไปยังเซิร์ฟเวอร์ที่กำลังสร้าง PDF ซึ่งใช้เวลา 10 วินาทีหรือไม่ window.open เป็นแท็บว่างจะปรากฏขึ้นทันทีและผู้ใช้จ้องที่แท็บว่างเป็นเวลา 10 วินาทีจนกว่าจะได้รับการเติมข้อมูลอย่างน่าอัศจรรย์ ยังคงอยู่บน iOS มันเป็นเพียงทางออกเดียว
Kevin Brown

13

หากคุณใช้window.open(url, '_blank')มันจะถูกบล็อก (ตัวป้องกันป๊อปอัป) บน Chrome, Firefox และอื่น ๆ

ลองสิ่งนี้

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

working js fiddle นี้http://jsfiddle.net/safeeronline/70kdacL4/2/

working js fiddle สำหรับหน้าต่าง ajax เปิดhttp://jsfiddle.net/safeeronline/70kdacL4/1/


11

ในขณะนี้ (Chrome 39) ฉันใช้รหัสนี้เพื่อเปิดแท็บใหม่:

window.open('http://www.stackoverflow.com', '_blank', 'toolbar=yes, location=yes, status=yes, menubar=yes, scrollbars=yes');

แน่นอนสิ่งนี้อาจเปลี่ยนแปลงได้ใน Chrome เวอร์ชันอนาคต

เป็นความคิดที่ไม่ดีหากคุณไม่สามารถควบคุมเบราว์เซอร์ที่ผู้ใช้ของคุณใช้อยู่ได้ อาจใช้ไม่ได้ในเวอร์ชันอนาคตหรือการตั้งค่าอื่น


ตามความคิดเห็นของ jfriend00 วิธีที่ผู้ใช้กำหนดค่าเบราว์เซอร์จะกำหนดวิธีการเปิดหน้าต่างใหม่ไม่ใช่โค้ด
Lee Taylor

ฉันเห็นด้วยกับคุณว่าการพึ่งพาวิธีแก้ปัญหาดังกล่าวเป็นความคิดที่ดีหากคุณไม่สามารถควบคุมสภาพแวดล้อมของคุณได้ แต่มีบางสถานการณ์ที่เป็นไปได้ (ตัวอย่างเช่นฉันใช้ในแอปพลิเคชันที่มาพร้อมกับ Chrome แบบพกพาของตัวเอง) เพื่อให้ชัดเจนฉันแก้ไขคำตอบของฉัน
Nico Wiedemann

2
สำหรับผู้ที่สงสัยว่าการเรียกใช้ข้อมูลโค้ดนี้ไม่ทำงานเนื่องจากข้อผิดพลาดนี้:VM646 js:12 Blocked opening 'http://www.stackoverflow.com/' in a new window because the request was made in a sandboxed frame whose 'allow-popups' permission is not set.
Benjamin Crouzier

6

สิ่งนี้จะเปิดลิงค์ในแท็บใหม่ใน Chrome และ Firefox และอาจเป็นเบราว์เซอร์อื่น ๆ ที่ฉันยังไม่ได้ทดสอบ:

var popup  = $window.open("about:blank", "_blank"); // the about:blank is to please Chrome, and _blank to please Firefox
popup.location = 'newpage.html';

โดยทั่วไปจะเปิดแท็บว่างใหม่จากนั้นตั้งค่าตำแหน่งของแท็บว่างนั้น ระวังว่าเป็นการแฮ็กประเภทหนึ่งเนื่องจากพฤติกรรมของแท็บ / หน้าต่างเบราว์เซอร์เป็นโดเมนความรับผิดชอบและทางเลือกของเบราว์เซอร์และผู้ใช้

สามารถเรียกบรรทัดที่สองในการโทรกลับได้ (หลังจากที่คุณได้ดำเนินการตามคำขอ AJAX แล้ว) แต่เบราว์เซอร์จะไม่รับรู้ว่าเป็นเหตุการณ์คลิกที่ผู้ใช้เริ่มต้นและอาจบล็อกป๊อปอัป


1
$windowเป็นเพียงวิธี AngularJS windowของใช้ คุณสามารถใช้windowแทนได้ ข้อมูลเพิ่มเติม: docs.angularjs.org/api/ng/service/$window
Magne


0

คุณสามารถใช้รหัสนี้เพื่อเปิดในแท็บใหม่ ..

function openWindow( url )
{
  window.open(url, '_blank');
  window.focus();
}

ฉันได้มาจากstackoverflow ..


1
วิธีนี้ใช้ได้ แต่ถ้าคุณอยู่ในตัวจัดการการคลิกของผู้ใช้ มิฉะนั้นจะเปิดหน้าต่างใหม่ (แต่อย่างน้อย Firefox ก็จะบล็อกคุณจนกว่าผู้ใช้จะอนุญาต)
djsmith

@djsmith ฉันใช้สิ่งนี้ .. และประสบปัญหาเฉพาะใน IE7 หากคุณมีทางออกอื่น ๆ กรุณาแนะนำ.. ขอบคุณ ..
Dilip Rajkumar

-2

วิธีที่ดีที่สุดที่ฉันใช้:

1- เพิ่มลิงค์ไปยัง html ของคุณ:

<a id="linkDynamic" target="_blank" href="#"></a>

2- เพิ่มฟังก์ชัน JS:

function OpenNewTab(href)
{
    document.getElementById('linkDynamic').href = href;
    document.getElementById('linkDynamic').click();
}

3- เพียงเรียกใช้ฟังก์ชัน OpenNewTab ด้วยลิงก์ที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.