Chrome, Javascript, window.open trong tab mới


110

Trong chrome, điều này sẽ mở ra trong một tab mới:

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

điều này sẽ mở ra trong một cửa sổ mới (nhưng tôi cũng muốn nó mở trong một tab mới:

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

Điều này có khả thi không?


2
Bạn có chắc chắn về những gì bạn khẳng định? Cả hai phân đoạn đều có cùng một kết quả.
Denys Séguret

1
Việc một cửa sổ mở ra trong một tab hay một cửa sổ mới là tùy thuộc vào trình duyệt cục bộ và cách người dùng định cấu hình trình duyệt của họ - đó không phải là điều bạn có thể chỉ định trong javascript.
jfriend00

Câu trả lời:


150

Bạn không thể kiểm soát trực tiếp điều này, vì đó là một tùy chọn do người dùng Internet Explorer kiểm soát.

Mở trang bằng Window.open với một tên cửa sổ khác sẽ mở trong một cửa sổ trình duyệt mới như cửa sổ bật lên HOẶC mở trong một tab mới, nếu người dùng đã định cấu hình trình duyệt để làm như vậy.

BIÊN TẬP:

Giải thích chi tiết hơn:

1. Trong các trình duyệt hiện đại, window.open sẽ mở trong một tab mới chứ không phải một cửa sổ bật lên.

2. Bạn có thể buộc trình duyệt sử dụng cửa sổ mới ('cửa sổ bật lên') bằng cách chỉ định các tùy chọn trong tham số thứ 3

3. Nếu lệnh gọi window.open không phải là một phần của sự kiện do người dùng khởi tạo, nó sẽ mở trong một cửa sổ mới.

4. “Sự kiện do người dùng khởi tạo” không nhất thiết phải có cùng một lệnh gọi hàm - nhưng nó phải bắt nguồn từ hàm được gọi bởi một lần nhấp của người dùng

5. Nếu sự kiện do người dùng khởi tạo ủy quyền hoặc hủy bỏ một lệnh gọi hàm (trong trình xử lý sự kiện hoặc người ủy quyền không bị ràng buộc với sự kiện nhấp chuột hoặc bằng cách sử dụng setTimeout chẳng hạn), nó sẽ mất trạng thái là “do người dùng khởi tạo”

6. Một số trình chặn cửa sổ bật lên sẽ cho phép các cửa sổ được mở từ các sự kiện do người dùng khởi tạo, nhưng không cho phép các cửa sổ được mở theo cách khác.

7. Nếu bất kỳ cửa sổ bật lên nào bị chặn, những cửa sổ bật lên thường được trình chặn (thông qua sự kiện do người dùng khởi tạo) đôi khi cũng sẽ bị chặn. Vài ví dụ…

Buộc một cửa sổ mở trong một phiên bản trình duyệt mới, thay vì một tab mới:

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

Sự kiện sau sẽ đủ điều kiện là sự kiện do người dùng khởi tạo, ngay cả khi nó gọi một hàm khác:

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

Sự kiện sau sẽ không đủ điều kiện là sự kiện do người dùng khởi tạo, vì setTimeout xác định nó:

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

2
Tôi chỉ muốn thêm điều đó bằng cách thử nghiệm trong Chrome và FF, tôi phát hiện ra rằng việc sử dụng window.open trong cái mà bạn định nghĩa là “sự kiện do người dùng khởi tạo” sẽ giữ hành động mặc định của trình duyệt. Ý tôi là nếu trong Chrome, bạn giữ phím shift trên chrome và nhấp vào, một cửa sổ trình duyệt mới sẽ xuất hiện, nếu bạn giữ ctrl (hoặc nhấn nút chuột giữa), một tab mới sẽ mở trong nền. Điều này rất hay, bạn có thể thực hiện một số thứ mà không cần phải đặt các thẻ liên kết.
Hoffmann

3
"Nếu lệnh gọi window.open không phải là một phần của sự kiện do người dùng khởi tạo, nó sẽ mở trong một cửa sổ mới." Không, nó gần như chắc chắn sẽ không được mở ra.
TJ Crowder

3
Kể từ ngày 29/9/2014, Firefox ESR và IE 11 mới nhất mở liên kết _blank hoặc window.open trong cửa sổ mới khi các lệnh gọi js sử dụng _blank làm tên cửa sổ. Chrome hiện tại không đơn giản như vậy. Tôi đã thử nghiệm mở một cửa sổ mới đi qua trên cùng, bên trái, chiều rộng, chiều cao, thanh công cụ, vị trí, thư mục, trạng thái, thanh menu, thanh cuộn và có thể thay đổi kích thước, và lần lượt bỏ qua từng cái. Chrome đã mở tất cả chúng trong một tab mới trừ khi trạng thái, thanh menu hoặc thanh cuộn bị bỏ qua. Điều này có vẻ tùy tiện đến mức khó tin, nhưng theo kinh nghiệm thì đó là những gì đã xảy ra. Ví dụ ở đây: jsbin.com/mobiyeqojaha/1
enigment 29/09

34

Đôi khi, việc buộc sử dụng một tab sẽ hữu ích nếu người dùng thích điều đó. Như Prakash đã nêu ở trên, điều này đôi khi được quyết định bởi việc sử dụng một sự kiện không phải do người dùng khởi tạo, nhưng có nhiều cách để giải quyết vấn đề đó.

Ví dụ:

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

sẽ luôn mở "newurl" trong cửa sổ trình duyệt mới vì chức năng "always" không được coi là do người dùng khởi tạo. Tuy nhiên, nếu chúng ta làm điều này:

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

chúng tôi mở cửa sổ trình duyệt mới hoặc tạo tab mới, được xác định bởi tùy chọn người dùng trong lần nhấp vào nút mà IS do người dùng khởi tạo. Sau đó, chúng tôi chỉ cần đặt vị trí thành URL mong muốn sau khi quay lại từ bài đăng AJAX. Thì đấy, chúng tôi buộc sử dụng tab nếu người dùng thích điều đó.


Tôi nhận thấy rằng nếu bạn đặt điểm ngắt trong chrome trên window.open thì trình duyệt sẽ mở một cửa sổ mới. Để mã không bị phá vỡ dường như dẫn đến một tab mới được mở thay thế.
skinnybrit51

Đó là một cách giải quyết OK trừ khi window.open của bạn và kết quả của hàm là thứ gì đó mất 5/6/7 giây hoặc lâu hơn. Cân nhắc xem chức năng có đang đăng dữ liệu lên máy chủ đang tạo PDF hay không, mất 10 giây. Cửa sổ mở đến một tab trống ngay lập tức và người dùng nhìn chằm chằm vào tab trống trong 10 giây cho đến khi nó được điền một cách kỳ diệu. Vẫn còn trên iOS, đó là giải pháp duy nhất.
Kevin Brown


11

Hiện tại (Chrome 39), tôi sử dụng mã này để mở một tab mới:

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

Tất nhiên, điều này có thể thay đổi trong các phiên bản Chrome trong tương lai.

Sẽ là một ý tưởng tồi nếu bạn không thể kiểm soát trình duyệt mà người dùng của bạn đang sử dụng. Nó có thể không hoạt động trong các phiên bản tương lai hoặc với các cài đặt khác nhau.


Theo nhận xét của jfriend00, cách người dùng định cấu hình trình duyệt xác định cách các cửa sổ mới được mở chứ không phải mã.
Lee Taylor

Tôi đồng ý với bạn, rằng đó là một ý tưởng tồi nếu bạn không thể kiểm soát môi trường của mình. Nhưng có một số tình huống có thể xảy ra điều này (ví dụ: tôi sử dụng nó trong một ứng dụng đi kèm với Chrome di động của riêng nó). Để làm rõ điều này, tôi đã chỉnh sửa anser của mình.
Nico Wiedemann

2
Đối với những băn khoăn, chạy đoạn mã này không làm việc vì lỗi này: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

Thao tác này sẽ mở liên kết trong một tab mới trong Chrome và Firefox và có thể là nhiều trình duyệt khác mà tôi chưa thử nghiệm:

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

Về cơ bản, nó sẽ mở một tab trống mới, sau đó đặt vị trí của tab trống đó. Hãy cẩn thận rằng đó là một loại hack, vì hành vi tab / cửa sổ trình duyệt thực sự là miền, trách nhiệm và sự lựa chọn của Trình duyệt và Người dùng.

Dòng thứ hai có thể được gọi trong một lệnh gọi lại (ví dụ sau khi bạn thực hiện một số yêu cầu AJAX), nhưng sau đó trình duyệt sẽ không nhận ra nó là sự kiện nhấp chuột do người dùng khởi tạo và có thể chặn cửa sổ bật lên.


1
$windowchỉ là cách sử dụng của AngularJS window. Bạn chỉ cần sử dụng windowthay thế. Thông tin thêm: docs.angularjs.org/api/ng/service/$window
Magne

3

Giải pháp mini rõ ràng $('<form action="http://samedomainurl.com/" target="_blank"></form>').submit()


0

Bạn có thể sử dụng mã này để mở trong tab mới ..

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

Tôi lấy nó từ stackoverflow ..


1
Điều này hoạt động, nhưng chỉ khi bạn đang ở trong trình xử lý nhấp chuột của người dùng. Nếu không, nó sẽ mở ra một cửa sổ mới (nhưng ít nhất Firefox sẽ chặn bạn cho đến khi người dùng cho phép).
djsmith

@djsmith, tôi đang sử dụng cái này .. và chỉ gặp sự cố trong IE7. Nếu bạn có bất kỳ giải pháp khác xin đề nghị .. Cảm ơn bạn ..
Dilip Rajkumar

-2

Cách tốt nhất tôi sử dụng:

1- thêm liên kết vào html của bạn:

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

2- thêm chức năng JS:

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

3- chỉ cần gọi hàm OpenNewTab với liên kết bạn muốn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.