Otwórz adres URL w nowej karcie (a nie w nowym oknie)


2102

Próbuję otworzyć adres URL w nowej karcie, a nie w wyskakującym oknie.

Widziałem powiązane pytania, w których odpowiedzi wyglądałyby mniej więcej tak:

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

Ale żaden z nich nie działał dla mnie, przeglądarka nadal próbowała otworzyć wyskakujące okienko.


85
Zazwyczaj jest to kwestia preferencji. Niektóre osoby lubią okna (i zaciekle chronią to zachowanie), niektóre karty (i zaciekle chronią to zachowanie). Pokonałbyś więc zachowanie, które jest ogólnie uważane za kwestię gustu, a nie projektu.
Jared Farrish,

42
JavaScript nie wie nic o przeglądarce i kartach w porównaniu z oknami, więc to od przeglądarki zależy, jak otworzyć nowe okno.
Andrey

3
Jak skonfigurować Chrome, aby wyświetlał go w nowej karcie zamiast w wyskakującym okienku?
Mark

8
Gmail robi to jakoś, przynajmniej w Chrome. Shift + kliknij wiersz wiadomości e-mail i otworzysz tę wiadomość w nowym oknie. Ctrl + kliknięcie i otworzysz go w nowej karcie. Jedyny problem: kopanie w zaciemnionym kodzie Gmaila to PITA
Sergio

48
@Sergio, jest to domyślne zachowanie przeglądarki dla każdego linku. (Przynajmniej dla Chrome i Firefox.) Nie ma nic wspólnego z Gmailem.
Qtax,

Odpowiedzi:


929

Nic, co autor może zrobić, nie może otworzyć w nowej karcie zamiast w nowym oknie; jest to preferencja użytkownika . (Należy pamiętać, że domyślna preferencja użytkownika w większości przeglądarek dotyczy nowych kart, więc trywialny test w przeglądarce, w której preferencje te nie zostały zmienione, nie wykaże tego).

CSS3 zaproponował nowy cel , ale specyfikacja została porzucona .

Odwrotna nie jest prawdziwe określając wymiary okna w trzecim argumencie window.open(), możesz uruchomić nowe okno, gdy preferowane są tabulatory.


42
@AliHaideri Javascript nie ma nic wspólnego z otwieraniem nowej karty / okna. Wszystko zależy od ustawień przeglądarki. Używanie window.openmówi przeglądarce, aby otworzyła coś nowego, a następnie przeglądarka otwiera to, co jest wybrane w jej ustawieniach - zakładce lub oknie. W testowanych przeglądarkach zmień ustawienia, aby otworzyć w nowym oknie zamiast karty, a zobaczysz, że rozwiązania innych są złe.
Ian

239
Dwie rzeczy, które marnują czas innych ludzi bardziej niż mówienie im, że coś nie można zrobić. (1) Powiedzenie im czegoś, czego nie można zrobić, można zrobić. (2) Milczenie i pozwalanie im szukać sposobu na zrobienie czegoś, czego nie da się zrobić.
Quentin,

8
@Ciastko - Dokumentacja zwykle nie zawraca sobie głowy opisywaniem funkcji, które nie istnieją. evernote.com/shard/s3/sh/428d2d68-39f9-491d-8352-8a9c217b67d7/…
Quentin

9
@Neel - Ponieważ zwięźle przechodzi do tematu, o którym wiele osób chce wiedzieć.
Quentin

4
Autorzy mogą robić różne rzeczy (głównie pisząc inny kod). Żadna z tych rzeczy nie spowoduje uruchomienia karty zamiast okna.
Quentin

1733

To podstęp

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

W większości przypadków powinno to nastąpić bezpośrednio w onclickmodule obsługi łącza, aby zapobiec blokowaniu wyskakujących okienek i domyślnemu zachowaniu „nowego okna”. Możesz to zrobić w ten sposób lub dodając detektor zdarzeń do swojego DOMobiektu.

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

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


117
Nie działa. Dostałem wiadomość po prawej stronie paska adresu: Popup zablokowany . Następnie zezwoliłem na wyskakujące okienka. I voila, otwiera się w wyskakującym okienku, a nie w zakładce ! Chrome 22.0.1229.94 w systemie OS X Lion.
dokładnie

39
@ b1naryatr0phy To dlatego, że właściwie nie przetestowałeś go poprawnie. Zmień ustawienia w swoich przeglądarkach. To, czy jest otwierane na karcie, czy w oknie, zależy od ustawień przeglądarki. Nic nie możesz zrobić, dzwoniąc do window.open (lub dowolnego Javascript), aby wybrać sposób otwarcia nowego okna / karty.
Ian

Pytanie: Ustawiam adres URL bez protokołu (na przykład my.site.com/Controller/Index). W rezultacie otrzymuję nowe okno (zakładkę) według adresu URL, takiego jak adres URL bieżącej strony (skąd korzystam z funkcji OpenInNewTab) oraz przekazane do adresu URL funkcji. W oknie protokołu otwiera się poprawny link. Dlaczego?
user2167382

2
var win = window.open (url, '_blank'); „_blank” nie jest konieczne, dla window.open () drugim parametrem jest strWindowName, dla: Nazwa ciągu dla nowego okna. Nazwa może być używana jako cel linków i formularzy przy użyciu atrybutu target elementu <a> lub <form>. Nazwa nie powinna zawierać żadnych białych znaków. Zauważ, że strWindowName nie określa tytułu nowego okna.
hydranger

Czy jest jakiś sposób, aby otworzyć tę nową kartę bez iframe w piaskownicy? Gdy go używam, otrzymuję błędy CORS, ponieważ wartość document.domain nie jest zmieniana, ponieważ jest otwierana jako element iframe.
Ids van der Zee

380

window.open()nie otworzy się w nowej karcie, jeśli nie dzieje się to podczas rzeczywistego zdarzenia kliknięcia. W podanym przykładzie otwierany jest adres URL rzeczywistego zdarzenia kliknięcia. Działa to pod warunkiem, że użytkownik ma odpowiednie ustawienia w przeglądarce .

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

Podobnie, jeśli próbujesz wykonać wywołanie Ajax w ramach funkcji kliknięcia i chcesz otworzyć okno sukcesu, upewnij się, że wykonujesz wywołanie Ajax z async : falsezestawem opcji.


28
Byłoby miło oznaczyć to jako PRAWIDŁOWĄ odpowiedź. Moje testy z Chrome v26 (Windows) potwierdzają, że jeśli kod znajduje się w module obsługi kliknięć przycisku, otwiera nową kartę, a jeśli kod jest wywoływany programowo, np. Z konsoli, to otwiera nowe okno.
CyberFonic

2
@Ian Z moich testów w przeglądarkach z ustawieniami domyślnymi, ta odpowiedź działa w przypadkach, w których powyższe odpowiedzi nie. Przyjęta odpowiedź, która mówi „nic nie możesz zrobić”, jest prawdziwa tylko wtedy, gdy użytkownik zmieni ustawienia domyślne.
Garfield

@Ian Dla jasności wspomniałem o tym w odpowiedzi na ostrzeżenie o ustawieniach użytkownika. „To zadziała, pod warunkiem, że użytkownik ma odpowiednie ustawienia w przeglądarce.” Myślę, że większość użytkowników nie zmienia ustawień przeglądarki i ta odpowiedź działa na większość z nich.
Venkat Kotra

async: falsenie działa w Chrome. Aby otworzyć nowe okno z wywołania zwrotnego, musisz najpierw otworzyć puste okno przed wysłaniem żądania HTTP, a następnie zaktualizować je. Oto dobry hack .
attacomsian

250

window.open Nie można niezawodnie otwierać wyskakujących okienek w nowej karcie we wszystkich przeglądarkach

Różne przeglądarki implementują zachowanie window.open na różne sposoby, szczególnie w odniesieniu do preferencji przeglądarki użytkownika. Nie można oczekiwać, że to samo zachowanie window.openbędzie prawdziwe we wszystkich przeglądarkach Internet Explorer, Firefox i Chrome, ze względu na różne sposoby, w jakie obsługują preferencje przeglądarki użytkownika.

Na przykład użytkownicy programu Internet Explorer (11) mogą otwierać wyskakujące okienka w nowym oknie lub nowej karcie, nie można zmusić użytkowników programu Internet Explorer 11 do otwierania wyskakujących okienek w określony sposób window.open , jak wspomniano w odpowiedzi Quentina .

W przypadku użytkowników przeglądarki Firefox (29) korzystanie z nich window.open(url, '_blank') zależy od preferencji kart przeglądarki, ale nadal można zmusić ich do otwierania wyskakujących okienek w nowym oknie, określając szerokość i wysokość (patrz sekcja „Co z Chrome?” Poniżej).

Demonstracja

Przejdź do ustawień przeglądarki i skonfiguruj ją, aby otwierać wyskakujące okienka w nowym oknie.

Internet Explorer (11)

Okno dialogowe ustawień przeglądarki Internet Explorer 1

Okno dialogowe ustawień zakładki Internet Explorer

Strona testowa

Po skonfigurowaniu przeglądarki Internet Explorer (11) do otwierania wyskakujących okienek w nowym oknie, jak pokazano powyżej, użyj następującej strony testowej do przetestowania window.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>

Zauważ, że wyskakujące okienka są otwierane w nowym oknie, a nie w nowej karcie.

Możesz również przetestować te fragmenty powyżej w przeglądarce Firefox (29) z preferencjami tabulatorów ustawionymi na nowe okna i zobaczyć te same wyniki.

Co z Chrome? Implementuje się window.openinaczej niż Internet Explorer (11) i Firefox (29).

Nie jestem w 100% pewien, ale wygląda na to, że Chrome (wersja 34.0.1847.131 m) nie wydaje się mieć żadnych ustawień, których użytkownik może użyć, aby wybrać, czy otwierać wyskakujące okienka w nowym oknie lub nowej karcie (np. Firefox i Internet Explorer mieć). Sprawdziłem dokumentację Chrome do zarządzania wyskakującymi oknami , ale nic nie wspominało o takich rzeczach.

Również po raz kolejny różne przeglądarki wydają się inaczej wdrażać zachowanie window.open . W Chrome i Firefox określenie szerokości i wysokości wymusi wyskakujące okienko, nawet jeśli użytkownik ustawił Firefoksa (29) na otwieranie nowych okien w nowej karcie (jak wspomniano w odpowiedziach na JavaScript otwieranie w nowym oknie, a nie na karcie ) :

<!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>

Jednak ten sam fragment kodu powyżej zawsze otworzy nową kartę w Internet Explorerze 11, jeśli użytkownicy ustawią karty jako preferencje przeglądarki, nawet brak określenia szerokości i wysokości wymusi dla nich nowe wyskakujące okno.

Tak więc zachowanie window.openw Chrome wydaje się być otwierane wyskakujące okienka w nowej karcie, gdy stosuje się w onclickprzypadku, aby otworzyć je w nowych oknach, gdy używana z konsoli przeglądarki ( jak wspomniano przez innych ludzi ), i otworzyć je w nowych oknach, gdy określone za pomocą szerokości i wysokości.

Podsumowanie

Różne przeglądarki window.open różnie implementują zachowanie w zależności od preferencji użytkowników. Nie można oczekiwać, że to samo zachowanie window.openbędzie prawdziwe we wszystkich przeglądarkach Internet Explorer, Firefox i Chrome, ze względu na różne sposoby, w jakie obsługują preferencje przeglądarki użytkownika.

Dodatkowe czytanie


12
Nie odpowiedziałeś na pytanie, po prostu udowodniłeś, że window.open jest niespójne.
BentOnCoding

223

Jedna wkładka:

Object.assign(document.createElement('a'), { target: '_blank', href: 'URL_HERE'}).click();

Tworzy wirtualny aelement, daje go, target="_blank"aby otwierał się w nowej karcie, daje mu właściwy, url hrefa następnie klika.

A jeśli chcesz, na tej podstawie możesz stworzyć jakąś funkcję:

function openInNewTab(href) {
  Object.assign(document.createElement('a'), {
    target: '_blank',
    href,
  }).click();
}

a następnie możesz użyć go w następujący sposób:

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

Ważna uwaga:

openInNewTab(jak również każde inne rozwiązanie na tej stronie) należy wywołać podczas wywołania zwrotnego akcji użytkownika - np. zdarzenie kliknięcia wewnątrz (nie jest konieczne bezpośrednio w funkcji wywołania zwrotnego, ale podczas akcji kliknięcia).

Jeśli zadzwonisz ręcznie w przypadkowym momencie (np. W odstępie czasu lub po odpowiedzi serwera) - może zostać zablokowany przez przeglądarkę (co ma sens, ponieważ stanowiłoby to zagrożenie bezpieczeństwa i może prowadzić do bardzo złej wygody użytkownika )


8
Dziękuję Ci. W twoim czystym JS brakuje brakującego elementu - jak napisał Luke Alderton (patrz poniżej), musisz dołączyć utworzony element do treści dokumentu, w kodzie wisi w próżni, a przynajmniej w Firefox 37 nic nie robi .
greenoldman

4
@mcginniwa Każda taka akcja - jeśli nie zostanie wywołana przez akcję użytkownika, taką jak kliknięcie myszą, zmieni blokadę wyskakujących okienek. Wyobraź sobie, że możesz po prostu otworzyć dowolny adres URL za pomocą Javascript bez działania użytkownika - byłoby to dość niebezpieczne. Jeśli umieścisz ten kod w zdarzeniu, np. Funkcję kliknięcia - będzie działał dobrze - będzie tak samo ze wszystkimi proponowanymi tutaj rozwiązaniami.
pie6k

4
Możesz uprościć swój kod w następujący sposób: $('<a />',{'href': url, 'target', '_blank'}).get(0).click();
shaedrich

5
@shaedrich zainspirowany twoją wycinką Dodałem nie-jquery one-liner:Object.assign(document.createElement('a'), { target: '_blank', href: 'URL_HERE'}).click();
pie6k

To nie działa w FF!
Nolesh

91

Jeśli go użyjesz window.open(url, '_blank'), zostanie on zablokowany (blokowanie wyskakujących okienek) w Chrome.

Spróbuj tego:

//With JQuery

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

Z czystym JavaScript,

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

Ale w tym pytaniu nie wspominają o autorze strony. Chcę tylko otworzyć adres URL w nowym oknie lub nowej karcie. To zależy od przeglądarki. Nie musimy martwić się o autora. Sprawdź to skrzypce. Działa
Mohammed Safeer

Stwierdzono, że nie działało to na skrzypcach js i plunker, ale działa podczas tworzenia pliku HTML. Jest tak, ponieważ skrzypce js, dane wyjściowe są wyświetlane w ramce iframe, więc nowe okno jest blokowane z powoduthe request was made in a sandboxed frame whose 'allow-popups' permission is not set
Mohammed Safeer

67

Aby rozwinąć odpowiedź Stevena Spielberga, zrobiłem to w takim przypadku:

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

W ten sposób tuż przed tym, jak przeglądarka podąży za linkiem, ustawiam atrybut docelowy, dzięki czemu link otworzy się w nowej karcie lub oknie (w zależności od ustawień użytkownika ).

Przykład jednego wiersza w jQuery:

$('a').attr('target', '_blank').get(0).click();
// The `.get(0)` must be there to return the actual DOM element.
// Doing `.click()` on the jQuery object for it did not work.

Można to również osiągnąć za pomocą natywnych interfejsów API DOM przeglądarki:

document.querySelector('a').setAttribute('target', '_blank');
document.querySelector('a').click();

57

Korzystam z poniższych i działa bardzo dobrze!

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

2
Może się otworzyć w nowej karcie lub oknie, w zależności od ustawień przeglądarki. Pytanie dotyczy w szczególności otwarcia w nowej karcie, nawet jeśli preferencje dotyczą nowego okna.
Quentin


19

Ciekawym faktem jest to, że nowej karty nie można otworzyć, jeśli użytkownik nie wywoła akcji (kliknięcia przycisku lub czegoś) lub jeśli jest asynchroniczny, na przykład NIE otworzy się w nowej karcie:

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

Może się to jednak otworzyć w nowej karcie, w zależności od ustawień przeglądarki:

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

2
To jest blokowane jako wyskakujące okienko w Firefox 28, Chrome 34b i Safari 7.0.2, wszystkie ustawienia zapasów. :(
Steve Meisner

1
„nowej karty nie można otworzyć, jeśli użytkownik nie wywoła akcji (kliknięcia przycisku lub czegoś) lub jeśli jest asynchroniczny” - prawda dla Chrome, ale nie dla wszystkich przeglądarek. Zapisz <script>open('http://google.com')</script>do .htmlpliku i otwórz go w nowej instalacji najnowszej wersji Firefoksa; zauważysz, że Firefox szczęśliwie otwiera Google w nowej karcie (być może po tym, jak chcesz, aby zezwalał na wyskakujące okienka), a nie w nowym oknie.
Mark Amery

13

Po prostu pominięcie parametrów [strWindowFeatures] otworzy nową kartę, O ile ustawienie przeglądarki nie zastąpi ustawień przeglądarki (ustawienie przeglądarki przebija JavaScript).

Nowe okno

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

Nowa karta

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

- lub -

var myWin = window.open(strUrl);

11
(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')))

11

Możesz użyć lewy z 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();
}

Demo jsFiddle


4
Jeśli wybierzesz tę metodę, upewnij się, że adres URL nie ma parametrów zapytania, ponieważ zostaną one pominięte przez przesłanie formularza. Jednym z rozwiązań jest osadzenie ukrytych elementów wejściowych w elemencie formularza, które mają nameklucz i valuewartość dla wszystkich parametrów wewnątrz parametrów zapytania. A następnie prześlij formularz
Mudassir Ali

można to zrobić prościej za pomocą atagu zamiast formularza i używając .click()metody jQuery do „przesłania” go. sprawdź moją odpowiedź

10

Nie ma to nic wspólnego z ustawieniami przeglądarki, jeśli próbujesz otworzyć nową kartę z funkcji niestandardowej.

Na tej stronie otwórz konsolę JavaScript i wpisz:

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

I spróbuje otworzyć wyskakujące okienko niezależnie od twoich ustawień, ponieważ „kliknięcie” pochodzi z akcji niestandardowej.

Aby zachowywać się jak rzeczywiste „kliknięcie myszką” na link, musisz postępować zgodnie z radą @ spirinvladimir i naprawdę go utworzyć:

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'))));

Oto kompletny przykład (nie próbuj go na jsFiddle lub podobnych edytorach internetowych, ponieważ nie pozwoli ci to przekierować na zewnętrzne strony z tego miejsca):

<!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>

1
Skończyło się na innym rozwiązaniu, w którym robię w = window.open("placeholder"); $.ajax(...ajax call that returns the url...) success (...w.location = data.url...)zgodnie z theandystratton.com/2012
Paul Tomblin

11
@FahadAbidJanjua To absolutnie nieprawda . Nadal zależy to od ustawień przeglądarki. W specyfikacjach HTML lub JavaScript nie ma niczego, co deklarowałoby, że „akcja niestandardowa” musi otwierać się w wyskakującym okienku, a nie w zakładce. Rzeczywiście, żadna przeglądarka na moim bieżącym komputerze nie wyświetla tego zachowania.
nmclean

7
function openTab(url) {
  const link = document.createElement('a');
  link.href = url;
  link.target = '_blank';
  document.body.appendChild(link);
  link.click();
  link.remove();
}

1
Może się otworzyć w nowej karcie lub oknie, w zależności od ustawień przeglądarki. Pytanie dotyczy w szczególności otwarcia w nowej karcie, nawet jeśli preferencje dotyczą nowego okna.
Quentin,

3

JQuery

$('<a />',{'href': url, 'target': '_blank'}).get(0).click();

JS

Object.assign(document.createElement('a'), { target: '_blank', href: 'URL_HERE'}).click();

Może się otworzyć w nowej karcie lub oknie, w zależności od ustawień przeglądarki. Pytanie dotyczy w szczególności otwarcia w nowej karcie, nawet jeśli preferencje dotyczą nowego okna.
Quentin

2

Lub możesz po prostu utworzyć element łącza i kliknąć go ...

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);

Nie powinno to być blokowane przez żadne programy blokujące wyskakujące okienka ... Mam nadzieję.


2

Istnieje odpowiedź na to pytanie i nie jest to nie.

Znalazłem łatwe obejście:

Krok 1: Utwórz niewidoczny link:

<a id="yourId" href="yourlink.html" target="_blank" style="display: none;"></a>

Krok 2: Kliknij ten link programowo:

document.getElementById("yourId").click();

Proszę bardzo! Działa dla mnie urok.


Może się otworzyć w nowej karcie lub oknie, w zależności od ustawień przeglądarki. Pytanie dotyczy w szczególności otwarcia w nowej karcie, nawet jeśli preferencje dotyczą nowego okna.
Quentin

1

wprowadź opis zdjęcia tutaj

Zbadałem wiele informacji o tym, jak otworzyć nową kartę i pozostać na tej samej karcie. Znalazłem jedną małą sztuczkę, aby to zrobić. Załóżmy, że masz adres URL, który musisz otworzyć - newUrl i stary adres URL - currentUrl , na którym musisz pozostać po otwarciu nowej karty. Kod JS będzie wyglądał następująco:

// init urls
let newUrl = 'http://example.com';
let currentUrl = window.location.href;
// open window with url of current page, you will be automatically moved 
// by browser to a new opened tab. It will look like your page is reloaded
// and you will stay on same page but with new page opened
window.open(currentUrl , '_blank');
// on your current tab will be opened new url
location.href = newUrl;

Pytanie dotyczy otwarcia nowej karty, gdy użytkownik woli otwierać je w nowych oknach. Nie pyta, jak otworzyć adres URL w nowej karcie, jednocześnie otwierając inny adres URL w istniejącej karcie.
Quentin

0

Jak o stworzenie <a>ze _blankjako targetwartość atrybutu, a urljakohref , z wyświetlaczem styl: ukryte z aa elementu dzieci? Następnie dodaj do DOM, a następnie uruchom zdarzenie click na elemencie potomnym.

AKTUALIZACJA

To nie działa. Przeglądarka zapobiega domyślnemu zachowaniu. Można go uruchomić programowo, ale nie jest zgodny z domyślnym zachowaniem.

Sprawdź i przekonaj się sam: http://jsfiddle.net/4S4ET/


-1

Otwieranie nowej karty z poziomu rozszerzenia przeglądarki Firefox (Mozilla) wygląda następująco:

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

-1

Ten sposób jest podobny do powyższego rozwiązania, ale wdrożony inaczej

.social_icon -> jakaś klasa z 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();
   });

-1

Może to być włamanie, ale w Firefoksie, jeśli podasz trzeci parametr, „fullscreen = yes”, otworzy się nowe okno.

Na przykład,

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

Wygląda na to, że faktycznie zastępuje ustawienia przeglądarki.


-1

to działa dla mnie, po prostu zapobiegaj zdarzeniu, dodaj adres URL, a <a> tagnastępnie uruchom na nim zdarzenie kliknięcia 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>

Może się otworzyć w nowej karcie lub oknie, w zależności od ustawień przeglądarki. Pytanie dotyczy w szczególności otwarcia w nowej karcie, nawet jeśli preferencje dotyczą nowego okna.
Quentin

-1

window.open(url)Otworzy url w nowej karcie przeglądarki. Alternatywa Belowe JS

let a= document.createElement('a');
a.target= '_blank';
a.href= 'https://support.wwf.org.uk/';
a.click(); // we don't need to remove 'a' from DOM because we not add it

Oto działający przykład (fragmenty przepływu stosu nie pozwalają na otwarcie nowej karty)


„Okno.open (adres URL) otworzy adres URL w nowej karcie przeglądarki” - będzie odpowiadać preferencjom użytkownika dotyczącym nowego okna lub nowej karty. Nie wymusi nowej karty, gdy preferencja dotyczy okna. (O co chodzi w tym pytaniu). To samo dotyczy celu = _blank.
Quentin

Oba podejścia, które sugerujesz, były wielokrotnie wymieniane (i krytykowane) w poprzednich 56 nieodebranych odpowiedziach na to pytanie.
Quentin

-1

To, czy otworzyć adres URL w nowej karcie, czy w nowym oknie, jest faktycznie kontrolowane przez preferencje przeglądarki użytkownika. Nie ma możliwości zastąpienia go w JavaScript.

window.open()zachowuje się różnie w zależności od sposobu jego użycia. Jeśli zostanie wywołany w wyniku bezpośredniego działania użytkownika , powiedzmy, że kliknięcie przycisku powinno działać dobrze i otworzyć nową kartę (lub okno):

const button = document.querySelector('#openTab');

// add click event listener
button.addEventListener('click', () => {
    // open a new tab
    const tab = window.open('https://attacomsian.com', '_blank');
});

Jeśli jednak spróbujesz otworzyć nową kartę z wywołania zwrotnego żądania AJAX , przeglądarka zablokuje ją, ponieważ była to bezpośrednia akcja użytkownika.

Aby ominąć blokadę wyskakujących okienek i otworzyć nową kartę z wywołania zwrotnego, oto mały hack :

const button = document.querySelector('#openTab');

// add click event listener
button.addEventListener('click', () => {

    // open an empty window
    const tab = window.open('about:blank');

    // make an API call
    fetch('/api/validate')
        .then(res => res.json())
        .then(json => {

            // TODO: do something with JSON response

            // update the actual URL
            tab.location = 'https://attacomsian.com';
            tab.focus();
        })
        .catch(err => {
            // close the empty window
            tab.close();
        });
});

-1

Próbowałem w ten sposób i wydaje się, że działa dobrze

window.open('example.com', 'newWin');

Znalazłem tutaj wiele działających przykładów:

http://www.gtalbot.org/FirefoxSection/Popup/PopupAndFirefox.html#TestPopupControl


Zostanie otwarte w nowej karcie lub oknie zgodnie z preferencjami użytkownika. Nie wymusi nowej zakładki, o którą chodzi w tym pytaniu.
Quentin


@Quentin Tęskniłem za tą częścią, ale kiedy próbowałem wywołać window.open z drugim parametrem «windowName» równym «_blank» lub bez niego, wyskakujące okienko lub nowa karta nie pojawiły się w najnowszej przeglądarce Google Chrome. Kiedy zmieniłem nazwę okna na «newWin», otworzyła się nowa karta. To dziwne, ponieważ parametr nazwy okna jest opcjonalny.
Artem Szewcow

-4

Zgodzę się nieco z osobą, która napisała (parafrazując tutaj): „W przypadku linku na istniejącej stronie internetowej przeglądarka zawsze otworzy link w nowej karcie, jeśli nowa strona jest częścią tej samej strony internetowej, co istniejąca strona internetowa. ” Dla mnie przynajmniej ta „ogólna zasada” działa w Chrome, Firefox, Opera, IE, Safari, SeaMonkey i Konqueror.

W każdym razie istnieje mniej skomplikowany sposób na wykorzystanie tego, co przedstawiła druga osoba. Zakładając, że mówimy o Twojej własnej stronie internetowej („thissite.com” poniżej), w której chcesz kontrolować, co robi przeglądarka, a następnie poniżej chcesz, aby „specialpage.htm” był PUSTY, bez HTML w ogóle ( oszczędza czas wysyłania danych z serwera!).

 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
 }

-7

Jeśli chcesz tylko otwierać linki zewnętrzne (linki prowadzące do innych stron), ten fragment JavaScript / jQuery działa dobrze:

$(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');
        }
    });
});

Ta odpowiedź nie jest odpowiednia dla tego pytania, ale jest to bardzo przydatna myśl! Dziękuję za pomysł!
Nuri Akman

-9

Przeglądarka zawsze otworzy link w nowej karcie, jeśli link znajduje się w tej samej domenie (w tej samej witrynie). Jeśli link znajduje się w innej domenie, otworzy go w nowej karcie / oknie, w zależności od ustawień przeglądarki.

Zgodnie z tym możemy użyć:

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

I dodaj trochę kodu jQuery:

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;
    });
});

Więc najpierw otwórz nowe okno na tej samej stronie z celem _blank (otworzy się w nowej karcie), a następnie otwórz żądaną stronę internetową w tym nowym oknie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.