JavaScript mở trong một cửa sổ mới, không phải tab


364

Tôi có một hộp chọn gọi window.open(url)khi một mục được chọn. Firefox sẽ mở trang trong một tab mới theo mặc định. Tuy nhiên, tôi muốn trang mở trong một cửa sổ mới, không phải là một tab mới.

Làm thế nào tôi có thể thực hiện điều này?


3
xem ví dụ tại " jsfiddle.net/HLbLu
Michael Freidgeim


Bạn có thể sử dụng github.com/reduardo7/xpopup
Eduardo Cuomo

Câu trả lời:


456

Cung cấp cho cửa sổ một tham số 'thông số kỹ thuật' với chiều rộng / chiều cao. Xem ở đây cho tất cả các tùy chọn có thể.

window.open(url, windowName, "height=200,width=200");

Khi bạn chỉ định chiều rộng / chiều cao, nó sẽ mở nó trong một cửa sổ mới thay vì một tab.


5
Mẹo tốt. Tôi nghĩ Opera vẫn sẽ mở cái này trong một tab mặc dù :).
Kevin Tighe

7
Làm việc trong IE6, FF 3.6, Chrome 9.0
James Westgate

3
Không hoạt động nữa trong FF 11.0, xem câu hỏi của tôi ! @James
TMS

14
Không hoạt động trong các trình duyệt ngày nay. Theo mặc định, tất cả họ đều mở một cửa sổ mới trong một tab mới của cửa sổ hiện tại. Nó cũng phụ thuộc vào tùy chọn trình duyệt. Bạn không thể kiểm soát nó bằng JavaScript.
Pavel Hodek

3
Đây KHÔNG phải là thực tế bạn đặt "height = 200, width = 200", thực hiện mở trong một cửa sổ mới. Đây chỉ đơn giản là thực tế để đặt thêm tham số (vị trí, trạng thái, v.v .... không thành vấn đề)
Peter

110

Bạn không cần sử dụng chiều cao, chỉ cần đảm bảo rằng bạn sử dụng _blank, Nếu không có nó, nó sẽ mở ra trong một tab mới.

Đối với một cửa sổ trống:

window.open('', '_blank', 'toolbar=0,location=0,menubar=0');

Đối với một URL cụ thể:

window.open('http://www.google.com', '_blank', 'toolbar=0,location=0,menubar=0');

3
Nhưng nếu tôi cũng muốn đặt tên cho nó thì sao?
Aditi

Ít nhất là trong Chrome, location=0là cần thiết khi JS được gọi từ một nút hoặc phần tử neo.
Ohad Schneider

làm việc hoàn hảo phải bao gồm location = 0 cũng như trong firefox.
Rick james

@nwbrad bạn có chắc chắn về phần '_blank' vì theo như tôi biết '_blank' là giá trị mặc định khi chúng tôi không chỉ định bất kỳ giá trị nào khác. Trong trường hợp của bạn, việc mở một cửa sổ mới thay vì một tab mới phải làm điều gì đó với việc cung cấp tham số thứ 3 cho hàm window.open. Trong trường hợp của bạn, đó là 'thanh công cụ = 0, vị trí = 0, menubar = 0'. Bạn có thể xác minh nó bằng cách bỏ qua tham số thứ ba này và để lại '_blank' ở đó làm tham số thứ 2.
dùng1451111

Hoạt động hoàn hảo trong các trình duyệt hiện đại như Firefox 76 và Internet Explorer 11. Mẹo là thêm location=0các tham số. Tôi cũng đề nghị đặt tên cửa sổ thay vì sử dụng _blankmục tiêu, để cùng một cửa sổ được sử dụng lại nếu người dùng nhấp nhiều lần vào phần tử mở cửa sổ bật lên và kết nối với nhau focus()để cửa sổ bật lên đã mở sẽ tập trung:window.open('http://stackoverflow.com', 'Stack_Overflow','location=0').focus();
OuzoPower

82

Tôi có thể sai, nhưng theo những gì tôi hiểu, điều này được kiểm soát bởi các tùy chọn trình duyệt của người dùng và tôi không tin rằng điều này có thể bị ghi đè.


1
Bạn đã đúng, người dùng có thể đặt trình duyệt "about: config" ưu tiên.tabs.opentabfor.windowopen "thành đúng, nhưng đó là cài đặt toàn cầu và tôi không muốn thay đổi hành vi toàn cầu của trình duyệt người dùng của chúng tôi;)
adam

45
Tôi nói với bạn tôi có mã hoạt động. Tôi đã gõ cái này vào bảng điều khiển firebird: window.open ("", "poop", "height = 200, width = 200, modal = yes, alwaysRaised = yes"); và đoán xem??? nó hoạt động !!!!!!

24
Vâng, nó hoạt động, nhưng điều này có vẻ là một chút hack. Firefox được viết theo cách mở một cửa sổ mới so với tab là tùy chọn trình duyệt, không phải là tùy chọn javascript. Do đó, điều khả thi là đề xuất của bạn sẽ không hoạt động giống nhau trong phiên bản mới hơn của firefox. Tôi không muốn dựa vào một hack.
adam

2
Và để rõ ràng, tôi không có nghĩa đó là một bản hack javascript. Thêm chiều cao và chiều rộng cửa sổ là các tính năng rõ ràng của phương pháp js window.open ( w3schools.com/HTMLDOM/met_win_open.asp ) Ý tôi là hack theo nghĩa điều khiển hành vi dự định của firefox.
adam

2
Tôi thực sự sẽ không gọi nó là hack, mỗi người. Thay vào đó, bạn chỉ thỏa hiệp về hành vi mà bạn thực sự muốn có và thực hiện điều đó.
Matchu

15

Thử:

window.open("", [window name], "height=XXX,width=XXX,modal=yes,alwaysRaised=yes");

Tôi có một số mã làm những gì bạn nói, nhưng có rất nhiều tham số trong đó. Tôi nghĩ rằng đây là mức tối thiểu, hãy cho tôi biết nếu nó không hoạt động, tôi sẽ đăng phần còn lại.


Điều này hoạt động trong FF 31 và Chrome 36 chỉ sử dụng tùy chọn "modal = yes". Tất cả các tùy chọn chỉ định làm việc là tốt. Tôi cũng đã kiểm tra "Mở cửa sổ mới trong các tab mới" trong tùy chọn FF của mình. Không có tùy chọn mở, cửa sổ sẽ mở trong tab mới.
Clint Pachl

Sau một số thử nghiệm nữa, dường như hầu hết mọi tham số miễn là có ít nhất một sẽ mở một cửa sổ mới thay vì một tab. Ví dụ: chỉ "top = 0" thậm chí hoạt động trong FF 31 và Chrome 36. Đây là trên OpenBSD bằng trình quản lý cửa sổ cwm. Vì vậy, kết quả có thể khác nhau.
Clint Pachl

Tôi có thể biết, [tên cửa sổ] là gì không?
chiếc

10

OK, sau khi thực hiện rất nhiều bài kiểm tra, đây là concluson của tôi:

Khi bạn thực hiện:

     window.open('www.yourdomain.tld','_blank');
     window.open('www.yourdomain.tld','myWindow');

hoặc bất cứ điều gì bạn đặt vào trường đích, điều này sẽ không thay đổi gì: trang mới sẽ được mở trong một tab mới (vì vậy tùy thuộc vào sở thích của người dùng)

Nếu bạn muốn trang được mở trong một cửa sổ "thực" mới, bạn phải đặt thêm tham số. Giống:

window.open('www.yourdomain.tld', 'mywindow','location=1,status=1,scrollbars=1, resizable=1, directories=1, toolbar=1, titlebar=1');

Sau khi thử nghiệm, có vẻ như tham số phụ bạn sử dụng, không thực sự quan trọng: đây không phải là thực tế bạn đặt "tham số này" hoặc "thông số khác" này tạo ra "cửa sổ thực" mới nhưng thực tế có tham số mới ).

Nhưng một cái gì đó bị nhầm lẫn và có thể giải thích rất nhiều câu trả lời sai:

Điều này:

 win1 = window.open('myurl1', 'ID_WIN');
 win2 = window.open('myurl2', 'ID_WIN', 'location=1,status=1,scrollbars=1');

Và điều này:

 win2 = window.open('myurl2', 'ID_WIN', 'location=1,status=1,scrollbars=1');
 win1 = window.open('myurl1', 'ID_WIN');

sẽ KHÔNG cho kết quả tương tự.

Trong trường hợp đầu tiên, khi bạn lần đầu mở một trang không có tham số phụ, nó sẽ mở trong một tab mới . Và trong trường hợp này, cuộc gọi thứ hai cũng sẽ được mở trong tab này vì tên bạn đặt.

Trong trường hợp thứ hai, vì cuộc gọi đầu tiên của bạn được thực hiện với tham số phụ, trang sẽ được mở trong một " cửa sổ thực " mới. Và trong trường hợp đó, ngay cả khi cuộc gọi thứ hai được thực hiện mà không có tham số phụ, nó cũng sẽ được mở trong " cửa sổ thực " mới này ... nhưng cùng một tab!

Điều này có nghĩa là cuộc gọi đầu tiên rất quan trọng vì nó quyết định nơi đặt trang.


Câu trả lời này nên có nhiều
++++

9

Bạn không cần phải làm vậy. Cho phép người dùng có bất cứ sở thích nào họ muốn.

Firefox làm điều đó theo mặc định vì việc mở một trang trong một cửa sổ mới gây khó chịu và một trang không bao giờ được phép làm như vậy nếu đó không phải là điều người dùng mong muốn. (Firefox không cho phép bạn mở các tab trong một cửa sổ mới nếu bạn đặt nó theo cách đó).


31
bạn rất là sai. và nhân tiện, nói rằng "bạn không cần phải" là không phù hợp, đặc biệt nếu đó là điều mà ông chủ muốn

8
Hãy thử và giữ cho các ý kiến ​​thiết thực và hữu ích. Chúng tôi có thể không đồng ý mà không bị xúc phạm.
adam

17
@theman_on_vista: Thuyết phục sếp là trách nhiệm của bạn . Công ty của bạn đã trao cho bạn trách nhiệm giải quyết các vấn đề thiết kế. Điều này bao gồm chỉ ra những ý tưởng thiết kế sai.
EFraim

2
Thật vậy. Màn hình thuộc về người dùng, và không ai khác.
Christopher Creutzig

12
Đó là trong lĩnh vực của nhà thiết kế để chọn cửa sổ bật lên hoặc tab. Mặc dù tôi là người dùng luôn thích các tab, đôi khi tôi nhận ra rằng thiết kế thực sự yêu cầu một cửa sổ bật lên hoặc thực sự gọi cho một tab. Nó nên ở trong lĩnh vực của lập trình viên để làm cho nó có thể. Đặt sự khác biệt triết học sang một bên, loại bình luận này là hoàn toàn không phù hợp cho một trang web tham khảo lập trình. Và trong trường hợp này, nó không phải là "tôi nên?" câu hỏi Đó là "làm thế nào để tôi?"
jbenet

9

Bạn có thể thử chức năng sau:

<script type="text/javascript">
function open(url)
{
  var popup = window.open(url, "_blank", "width=200, height=200") ;
  popup.location = URL;
}
</script>

Mã HTML để thực thi:

<a href="#" onclick="open('http://www.google.com')">google search</a>

2
Mục đích của là popup.location = URL;gì? Cuộc window.open()gọi sẽ mở nó đến URL thích hợp và trong ví dụ mã của bạn, URLkhông được xác định để nó sẽ quay trở lại đối tượng URL thử nghiệm (và không hỗ trợ rộng rãi) . Trong khi sử dụng nó cho điều đó là gây tranh cãi, tôi tò mò những động lực cho việc sử dụng nó ở đây là gì?
ken

Câu trả lời chắc chắn và dạy tôi làm thế nào để làm cho vị trí không thể chỉnh sửa. cảm ơn
VirtualProdigy

6

Chìa khóa là các tham số:

Nếu bạn cung cấp Thông số [Chiều cao = "", Chiều rộng = ""], thì nó sẽ mở trong các cửa sổ mới.

Nếu bạn KHÔNG cung cấp Thông số, thì nó sẽ mở trong tab mới.

Đã thử nghiệm trong Chrome và Firefox


1
newwin = window.open ('test.aspx', '', ''); đã thử nghiệm trên Chrome: 26
MuniR

5

Thật thú vị, tôi thấy rằng nếu bạn chuyển vào một chuỗi trống (trái ngược với chuỗi null hoặc danh sách các thuộc tính) cho thuộc tính thứ ba của window.open, nó sẽ mở trong một tab mới cho Chrome, Firefox và IE. Nếu vắng mặt, hành vi đã khác.

Vì vậy, đây là cuộc gọi mới của tôi:

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

Không phải poster ban đầu đang cố mở cửa sổ bật lên trong một cửa sổ mới sao? Ngoài ra, trong IE 11, đoạn mã bạn đã cung cấp sẽ mở một cửa sổ hoặc tab mới dựa trên tùy chọn trình duyệt của người dùng.

4

thử phương pháp đó .....

function popitup(url) {
       //alert(url);
       newwindow=window.open("http://www.zeeshanakhter.com","_blank","toolbar=yes,scrollbars=yes, resizable=yes, top=500, left=500, width=400, height=400");
       newwindow.moveTo(350,150);
   if (window.focus) 
          {
             newwindow.focus()
          }
   return false;
  }

3

Đối với tôi giải pháp là có

"location=0"

trong tham số thứ 3. Đã thử nghiệm trên FF / Chrome mới nhất và phiên bản IE11 cũ

Cuộc gọi phương thức đầy đủ tôi sử dụng ở bên dưới (Vì tôi muốn sử dụng chiều rộng thay đổi):

window.open(url, "window" + id, 'toolbar=0,location=0,scrollbars=1,statusbar=1,menubar=0,resizable=1,width=' + width + ',height=800,left=100,top=50');

2

Tôi vừa thử điều này với IE (11) và Chrome (54.0.2794.1 canary SyzyASan):

window.open(url, "_blank", "x=y")

... Và nó đã mở trong một cửa sổ mới.

Điều đó có nghĩa là Clint pachl đã đúng khi nói rằng việc cung cấp bất kỳ một tham số nào sẽ khiến cửa sổ mới mở.

- và rõ ràng nó không phải là một tham số hợp pháp!

(YMMV - như tôi đã nói, tôi chỉ thử nghiệm ở hai nơi ... và lần nâng cấp tiếp theo có thể làm mất hiệu lực kết quả, bằng mọi cách)

ETA: Tôi chỉ nhận thấy, mặc dù - trong IE, cửa sổ không có trang trí.


1

Đã trả lời ở đây . Nhưng đăng nó một lần nữa để tham khảo.

window.open()sẽ không mở trong tab mới nếu nó không xảy ra trong sự kiện nhấp thực tế. Trong ví dụ đã cho, url đang được mở trong sự kiện nhấp thực tế. Điều này sẽ làm việc với điều kiện người dùng có các cài đặt phù hợp trong trình duyệt.

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

Tương tự, nếu bạn đang cố gắng thực hiện cuộc gọi ajax trong chức năng nhấp và muốn mở cửa sổ thành công, hãy đảm bảo bạn đang thực hiện cuộc gọi ajax với async : falsetùy chọn được đặt.


1

Tôi nghĩ vấn đề không phải thuộc tính mục tiêu html của nó nhưng bạn đã bỏ chọn "mở nw windows trong tab mới thay vì" tùy chọn trong tab "tab" trong menu "tùy chọn" firefox. kiểm tra nó và thử lại

nhập mô tả hình ảnh ở đây


0

Tôi đã có câu hỏi tương tự nhưng tìm thấy một giải pháp tương đối đơn giản cho nó.

Trong JavaScript tôi đã kiểm tra window.opener !=null;để xác định xem cửa sổ có bật lên không. Nếu bạn đang sử dụng một số mã phát hiện tương tự để xác định xem cửa sổ mà trang web của bạn đang được hiển thị có bật lên hay không, bạn có thể dễ dàng "tắt" khi muốn mở cửa sổ "mới" bằng cách sử dụng JavaScript windows mới.

Chỉ cần đặt cái này ở đầu trang bạn muốn luôn là một cửa sổ "mới" .

<script type="text/javascript">
    window.opener=null;
</script>

Tôi sử dụng điều này trên trang đăng nhập của trang web của mình để người dùng không có hành vi bật lên nếu họ sử dụng cửa sổ bật lên để điều hướng đến trang web của tôi.

Bạn thậm chí có thể tạo một trang chuyển hướng đơn giản thực hiện điều này và sau đó di chuyển đến URL bạn đã cung cấp. Cái gì đó như,

JavaScript trên trang mẹ:

window.open("MyRedirect.html?URL="+URL, "_blank");

Và sau đó bằng cách sử dụng một ít javascript từ đây, bạn có thể lấy URL và chuyển hướng đến nó.

JavaScript trên trang chuyển hướng:

 <script type="text/javascript">
        window.opener=null;

    function getSearchParameters() {
          var prmstr = window.location.search.substr(1);
          return prmstr != null && prmstr != "" ? transformToAssocArray(prmstr) : {};
    }

    function transformToAssocArray( prmstr ) {
        var params = {};
        var prmarr = prmstr.split("&");
        for ( var i = 0; i < prmarr.length; i++) {
            var tmparr = prmarr[i].split("=");
            params[tmparr[0]] = tmparr[1];
        }
        return params;
    }

    var params = getSearchParameters();
    window.location = params.URL;
    </script>
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.