Jak zamknąć bieżącą kartę w oknie przeglądarki?

434

Chcę utworzyć link na stronie internetowej, który zamknąłby aktualnie aktywną kartę w przeglądarce bez zamykania innych kart w przeglądarce.
Gdy użytkownik kliknie link zamykający, powinien pojawić się komunikat ostrzegawczy z prośbą o potwierdzenie za pomocą dwóch przycisków: „TAK” i „NIE”. Jeśli użytkownik kliknie „TAK”, zamknij tę stronę, a jeśli „NIE”, nie rób nic.

Jak można to zrobić? Jakieś sugestie?

Naveed
źródło
Mogę się tu spóźnić, ale przeglądarki uniemożliwiają to z jakiegoś powodu. <br> <br> Pomyśl o tym, jak próbujesz zamykać okno od nowa i nie zamyka się, ponieważ robi część „ jeśli nie ” z twojego pytania, które to „nic nie robić”. <br> <br> Na pewno będzie to irytujące!
Muhammad Osama,

Odpowiedzi:

502

Aby to zrobić, potrzebujesz Javascript. Użyj window.close():

close();

Uwaga: sugerowana jest bieżąca karta. Jest to równoważne:

window.close();

lub możesz określić inne okno.

Więc:

function close_window() {
  if (confirm("Close Window?")) {
    close();
  }
}

z HTML:

<a href="javascript:close_window();">close</a>

lub:

<a href="#" onclick="close_window();return false;">close</a>

Jesteś return falsetutaj, aby zapobiec domyślnemu zachowaniu zdarzenia. W przeciwnym razie przeglądarka spróbuje przejść do tego adresu URL (co oczywiście nie jest).

Teraz opcje w window.confirm()oknie dialogowym będą OK i Anuluj (nie Tak i Nie). Jeśli naprawdę chcesz Tak i Nie, musisz stworzyć jakieś modalne okno dialogowe Javascript.

Uwaga: w powyższym przypadku występują różnice specyficzne dla przeglądarki. Jeśli otworzyłeś okno za pomocą Javascript (via window.open()), możesz zamknąć okno javascript. Firefox nie pozwala ci zamykać innych okien. Wierzę, że IE poprosi użytkownika o potwierdzenie. Inne przeglądarki mogą się różnić.

Cletus
źródło
386
Nie można zamknąć żadnej karty za pomocą JavaScript. „Tę metodę można wywoływać tylko w przypadku okien, które zostały otwarte przez skrypt za pomocą metody window.open”. Innymi słowy, możesz używać JavaScript tylko do zamykania okna / karty, która została spawnowana przez JavaScript.
Ryan Joy,
7
-1 nie działa Chrome 30 PC pozostałe odpowiedzi pokazują, aby otworzyć okno w bieżącej karcie, a następnie zamknąć to działa
markasoftware
2
W about:config dom.allow_scripts_to_close_windows = truemoże być rozwiązaniem w Firefoksie (może być poważne zagrożenie bezpieczeństwa!)
Nepomuk Frädrich
6
Przeglądarka nie zezwala na takie zachowanie. JavaScript może tylko zamknąć otwartą kartę.
Edward Kennedy
1
Działa to (przynajmniej) w przeglądarce Chrome 62: <button type="button" onclick="window.open('', '_self', ''); window.close();">Discard</button> Zobacz także ten artykuł
hering
247

Spróbuj tego

<a href="javascript:window.open('','_self').close();">close</a>
Daniel Shen
źródło
2
Praca w przeglądarce Firefox 31.0
Adrian Carr
1
Złą stroną tego rozwiązania jest to, że żądanie pobierania jest wysyłane do serwera. Ale z drugiej strony nie znalazłem żadnego innego rozwiązania.
100r 12.03.15
18
Robiąc to z danych wyjściowych konsoli Chrome „Skrypty mogą zamykać tylko okna, które zostały przez nią otwarte”
parlament
Nie działa Skrypty mogą zamykać tylko okna, które zostały przez niego otwarte.
Roman Losev
1
Nie działa w chrome 60.0.3079.0: „Skrypty mogą zamykać tylko okna, które zostały przez niego otwarte”.
Our_Benefactors
65

Ta metoda działa w Chrome i IE:

<a href="blablabla" onclick="setTimeout(function(){var ww = window.open(window.location, '_self'); ww.close(); }, 1000);">
    If you click on this the window will be closed after 1000ms
</a>
Palesz
źródło
56
Prostsze:open(location, '_self').close();
13
Działa to dobrze w IE 11, ale nie działało w Chrome 38
Yann Duran
31

O ile mi wiadomo, nie jest to już możliwe w Chrome ani FireFox. Nadal może być to możliwe w IE (przynajmniej przed Edge).

Guy Schalnat
źródło
2
Działa to (przynajmniej) w przeglądarce Chrome 62: <button type="button" onclick="window.open('', '_self', ''); window.close();">Discard</button> Zobacz także ten artykuł
hering
@hering Cóż, artykuł pochodzi z 2006 roku, ale jeśli znalazłeś coś, co działa, to świetna wiadomość i być może pomoże ludziom, którzy czytają tak daleko. Dzięki za udostępnienie.
Guy Schalnat
Pytanie dotyczyło zamknięcia bieżącej aktywnej karty z poziomu tej karty. Jak mówisz, nie jest to możliwe w Chrome ani Firefox. To powinna być zaakceptowana odpowiedź.
decyduje
14

To jest możliwe. Szukałem tego w całej sieci, ale raz, kiedy wziąłem jedną z ankiet Microsoft, w końcu dostałem odpowiedź.

Spróbuj tego:

window.top.close();

spowoduje to zamknięcie bieżącej karty.


źródło
12
„Skrypty mogą zamykać tylko okna, które zostały przez niego otwarte”. na Chrome 50.
Husky
7

Przetestowany pomyślnie w FF 18 i Chrome 24:

Wstaw w głowę:

<script>
    function closeWindow() {
        window.open('','_parent','');
        window.close();
    }
</script> 

HTML:

<a href="javascript:closeWindow();">Close Window</a>

Kredyty należą się Marcos J. Drake .

Julesfrog
źródło
Nie mrucząc po chromie „Skrypty mogą zamykać tylko okna, które zostały przez niego otwarte”.
César León
7

Spróbuj również tego. Pracuje dla mnie we wszystkich trzech głównych przeglądarkach.

<!-- saved from url=(0014)about:internet -->
<a href="#" onclick="javascript:window.close();opener.window.focus();" >Close Window</a>
Bhavin Shah
źródło
nie działa w przeglądarce Firefox Quantum 68.0.1
Zeke
7

Poniższe działa dla mnie w Chrome 41:

function leave() {
  var myWindow = window.open("", "_self");
  myWindow.document.write("");
  setTimeout (function() {myWindow.close();},1000);
}

Wypróbowałem kilka pomysłów na FF, w tym otwarcie prawdziwej strony internetowej, ale wydaje się, że nic nie działa. O ile rozumiem, każda przeglądarka zamknie kartę lub okno za pomocą xxx.close (), jeśli tak naprawdę było otwarte przez JS, ale FF, przynajmniej, nie może zostać oszukany w celu zamknięcia karty poprzez otwarcie nowej zawartości wewnątrz tej karty.

Ma to sens, gdy się nad tym zastanowić - użytkownik może nie chcieć, aby JS zamykał kartę lub okno z przydatną historią.

Tajski
źródło
Chrome: „Uncaught TypeError: Nie można ustawić właściwości„ innerHTML ”na null”
Francisco Corrales Morales
5

Przepraszam za nekropostę tego, ale niedawno wdrożyłem lokalnie hostowaną witrynę, która wymagała możliwości zamknięcia bieżącej karty przeglądarki i znalazłem kilka ciekawych obejść, które nie są dobrze udokumentowane w dowolnym miejscu, więc postanowiłem to zrobić.

Uwaga: te obejścia zostały wykonane z myślą o witrynie hostowanej lokalnie i (z wyjątkiem Edge) wymagają specjalnej konfiguracji przeglądarki, więc nie byłyby idealne dla witryn hostowanych publicznie.

Kontekst: w przeszłości skrypt jQuerywindow.close() był w stanie zamknąć bieżącą kartę bez problemu w większości przeglądarek. Jednak współczesne przeglądarki nie obsługują już tego skryptu, potencjalnie ze względów bezpieczeństwa.

Google Chrome:

Chrome nie pozwala na uruchomienie skryptu window.close () i nic się nie dzieje, jeśli spróbujesz go użyć. Za pomocą wtyczki Chrome TamperMonkey jednak mamy można użyć metody window.close () jeśli jesteś zawierać // @grant window.closew nagłówku UserScript z TamperMonkey.

Na przykład mój skrypt (uruchamiany po kliknięciu przycisku o identyfikatorze = „close_page” i naciśnięciu „tak” w oknie podręcznym przeglądarki) wygląda następująco:

// ==UserScript==
// @name         Close Tab Script
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Closes current tab when triggered
// @author       Mackey Johnstone
// @match        http://localhost/index.php
// @grant        window.close
// @require      http://code.jquery.com/jquery-3.4.1.min.js
// ==/UserScript==

(function() {
    'use strict';
    $("#close_page").click(function() {
        var confirm_result = confirm("Are you sure you want to quit?");
        if (confirm_result == true) {
            window.close();
        }
    });
})();

Uwaga: To rozwiązanie może zamknąć kartę tylko wtedy, gdy NIE jest to ostatnia otwarta karta. Tak skutecznie nie może zamknąć karty, jeśli spowodowałoby zamknięcie okna, ponieważ jest ostatnią otwartą kartą.

Firefox:

Firefox ma zaawansowane ustawienia, które można włączyć, aby umożliwić skryptom zamykanie okien, co skutecznie włącza tę window.close()metodę. Aby włączyć to ustawienie, przejdź do about: config, a następnie wyszukaj i znajdź preferencje dom.allow_scripts_to_close_windows i przełącz je z false na true.

Pozwala to na użycie window.close()metody bezpośrednio w pliku jQuery, tak jak w przypadku każdego innego skryptu.

Na przykład ten skrypt działa idealnie z ustawioną preferencją true:

<script>
  $("#close_page").click(function() {
    var confirm_result = confirm("Are you sure you want to quit?");
    if (confirm_result == true) {
      window.close();
    }
  });
</script>

Działa to znacznie lepiej niż obejście Chrome, ponieważ pozwala użytkownikowi zamknąć bieżącą kartę, nawet jeśli jest to jedyna otwarta karta i nie wymaga wtyczki innej firmy. Jedynym minusem jest to, że umożliwia on uruchamianie tego skryptu na różnych stronach internetowych (nie tylko tych, na których zamierzasz go używać), więc może potencjalnie stanowić zagrożenie bezpieczeństwa, chociaż nie wyobrażam sobie, aby zamknięcie obecnej karty było szczególnie niebezpieczne.

Krawędź:

Rozczarowujące Edge faktycznie działał najlepiej ze wszystkich 3 przeglądarek, które wypróbowałem, i pracował z tą window.close()metodą, nie wymagając żadnej konfiguracji. Po uruchomieniu window.close()skryptu dodatkowe wyskakujące okienko ostrzega, że ​​strona próbuje zamknąć bieżącą kartę i pyta, czy chcesz kontynuować.

wprowadź opis zdjęcia tutaj

Uwaga końcowa: rozwiązania dla Chrome i Firefox są obejściem problemu, który został celowo wyłączony przez przeglądarkę, potencjalnie ze względów bezpieczeństwa. Oba wymagają również od użytkownika skonfigurowania swoich przeglądarek, aby były kompatybilne wcześniej, więc prawdopodobnie nie byłyby opłacalne w przypadku witryn przeznaczonych do użytku publicznego, ale idealnie nadają się do rozwiązań hostowanych lokalnie, takich jak moje.

Mam nadzieję, że to pomogło! :)

Mackey Johnstone
źródło
5

Jeśli chodzi o osoby, które nadal odwiedzają tę stronę, możesz zamknąć kartę, która jest otwierana przez skrypt LUB za pomocą tagu kotwicy HTML z celem _blank. Oba można zamknąć za pomocą

<script>
    window.close();
</script>
killstreet
źródło
Działa to w każdej nowoczesnej przeglądarce. IE11 i Edge 17 pokazują alert potwierdzający, ale nadal działa.
Fabian von Ellerts
1
<button class="closeButton" style="cursor: pointer" onclick="window.close();">Close Window</button>

to zadziałało dla mnie

pikax
źródło
1

trochę późno, ale to właśnie się dowiedziałem ...

window.close()będzie działał (IE jest wyjątkiem), jeśli okno, które próbujesz close()otworzyć, zostało otwarte za pomocą skryptu przy użyciu metody window.open ().

! (zobacz komentarz @killstreet poniżej na temat tagu kotwicy z celem _blank)

TLDR : chrome i firefox pozwalają je zamknąć.

pojawi się błąd konsoli: Skrypty nie mogą zamykać okien, które nie zostały otwarte przez skrypt. jako błąd i nic więcej.

możesz dodać unikalny parametr w adresie URL, aby wiedzieć, czy strona została otwarta ze skryptu (jak czas) - ale to tylko włamanie a nie natywna funkcjonalność i w niektórych przypadkach zawiedzie .

nie mogłem znaleźć żadnego sposobu, aby dowiedzieć się, czy strona została otwarta z open (), czy nie, a close nie wyrzuci i błędów. to NIE zostanie wydrukowane „testu”:

try{
  window.close();
}
catch (e){
  console.log("text");
}

możesz przeczytać w MDN więcej o funkcji close ()

kalios
źródło
2
Skrypty otwierają nie tylko zakładki, ale także tag kotwicy z celem _blank będzie mógł zostać zamknięty. Do tej pory przetestowane w chrome i firefoxie i oba wydają się pozwalać na zamykanie kart, które zostały otwarte przez tag zakotwiczenia.
killstreet
-1

Oto jak utworzyłbyś taki link:

<a href="javascript:if(confirm('Close window?'))window.close()">close</a>

Eric Mickelsen
źródło
-1

Jest to jeden ze sposobów rozwiązania tego samego, zadeklaruj taką funkcję JavaScript

<script>
  function Exit() {
     var x=confirm('Are You sure want to exit:');
     if(x) window.close();
   }
</script>

Dodaj następujący wiersz do kodu HTML, aby wywołać funkcję za pomocą <button>

<button name='closeIt' onClick="Exit()" >Click to exit </Button>
Mohsin Chaudhari
źródło