window.close ve self.close, Chrome'daki pencereyi kapatmaz


174

Sorun, çağırdığımda window.close()veya self.close()pencereyi kapatmaz. Şimdi Chrome'da komut dosyası tarafından oluşturulmuş herhangi bir pencereyi komut dosyasıyla kapatamayacağınıza dair bir inanç var gibi görünüyor. Bu kesinlikle yanlıştır, ancak onaylamak için bir uyarı açması gerekse bile, hala yapması gerekir. Bunlar olmuyor.

Peki herkes gibi bir şey kullanarak bir pencereyi kapatmak için gerçek, fonksiyonel ve kanıtlanmış bir yöntem var mı javascript:window.close()ya javascript:self.close()da aslında ne bekleniyor ve Chrome tabanlı DEĞİL her tarayıcıda iyi bir şey olur mu? Herhangi bir öneri büyük mutluluk duyacağız ve Javascript belirli bir çözüm, hiçbir şey JQuery veya üçüncü taraf uygulama arıyorum.

Güncelleme: Önerilenlerin çoğunun ciddi sınırlamaları ve kullanılabilirlik sorunları olsa // @grant window.closeda, komut dosyası başlığında kullanılan en son öneri (TamperMonkey'e özgü) , normalde kapatma yöntemini işleyemeyen sekmelerde bile genellikle işe yarayacaktır. Tamamen ideal olmasa da ve her durumda genelleştirilmemiş olsa da, benim durumumda iyi bir çözümdür.


window.close()krom benim için çalışıyor.
püre

3
@ GµårÐïåñ: Hımm, hayır değil. Bunun dil ile ilgisi yok. Tarayıcılar tarafından uygulanan bir işlevdir. Nasıl window.closeolması gerektiği gibi çalışmadığını gösteren minimal bir örnek yazabilirseniz , bunun "işe yaramaz" demekten daha yararlı olabileceğini düşünüyorum.
Blender

3
Size iki örnek verdim. Senin için <a href="javascript:window.close">CLOSE</a>
heceleyerek

3
uygun olmayan javascript koruyucusu. Window.close () yöntemini deneyin ve işe yarar. window.close sadece değişken bir isimdir ve işlevi çağırmaz (en azından krom 37'de test ettiğimde değil). Örneğinizi window.close () olarak değiştirdiğimde krom 37'de çalışır.
George

3
GµårÐïåñ @ George'un söylediği şey tartışılmaz DEĞİL (kelimenin anlamını tamamen yanlış anlamadım). Örneklerinizdeki javascript'te sözdizimsel bir hataya sahip olduğunuzu ve uygulama kodunuzda aynı hataya sahip olduğunuzu belirtmenizde doğrudur, bu muhtemelen sorunun nedenidir. Bununla birlikte, bunlar sadece örneklerinizdeki yazım hatalarıysa, daha iyi yanıtlar almak için bu yazım hatalarını düzeltmelisiniz.
Superole

Yanıtlar:


187

Normal javascript willy-nilly pencereleri kapatamaz. Bu, çeşitli kötü niyetli istismarları ve sıkıntıları durdurmak için bir süre önce sunulan bir güvenlik özelliğidir.

Gönderen en son çalışma specwindow.close() :

close()Window yöntem gereken nesneleri, aşağıdaki koşulların yerine getirilmesi halinde, yakın tarama bağlam A :

  • Karşılık gelen tarama bağlam A bir komut kapatılabilir .
  • Görevdeki komut dosyasının tarama içeriği, tarama içeriği A'ya aşinadır .
  • Görevdeki komut dosyasının gözatma içeriğinin, gözatma içeriğinde A gezinmesine izin verilir .

Tarama içeriği, bir komut dosyasının (kullanıcının eyleminin aksine) oluşturduğu yardımcı bir tarama bağlamıysa veya oturum geçmişi yalnızca bir Belge içeren bir tarama bağlamıysa komut dosyasına kapatılabilir .

Bu, küçük bir istisna dışında, javascript'in aynı javascript tarafından açılmayan bir pencereyi kapatmasına izin verilmemesi gerektiği anlamına gelir .

Chrome, kullanıcı komut dosyalarına uygulanmadığı istisnalara izin verir, ancak Firefox buna izin vermez. Firefox uygulamasının durumu şöyle :

Bu yöntemin yalnızca bir komut dosyası tarafından window.openyöntem kullanılarak açılan pencereler için çağrılmasına izin verilir .


Eğer kullanmayı denerseniz window.close: Eğer alacak userscript / Greasemonkey / Tampermonkey dan
Firefox'u: hata mesajı, " Scripts may not close windows that were not opened by script."
Chrome: sessizce başarısız sadece.



Uzun vadeli çözüm:

Bununla başa çıkmanın en iyi yolu , bunun yerine bir Chrome uzantısı ve / veya Firefox eklentisi yapmaktır. Bunlar geçerli pencereyi güvenilir bir şekilde kapatabilir.

Bununla birlikte, güvenlik riskleri window.closebir Greasemonkey / Tampermonkey betiği için çok daha az olduğu için; Greasemonkey ve Tampermonkey bu işlevselliği API'larında makul bir şekilde sağlayabilir (esas olarak uzantı çalışmasını sizin için paketler).
Bir özellik isteği yapmayı düşünün.



Keskin geçici çözümler:

Chrome şu anda "kendi kendine yönlendirme" istismarına karşı savunmasızdı. Yani genel olarak işe yarayan bunun gibi kod:

open(location, '_self').close();

Bu hatalı davranış, IMO ve şimdi (kabaca Nisan 2015 itibariyle) çoğunlukla engellendi. Yalnızca sekme yeni açılmışsa ve tarama geçmişinde hiç sayfa yoksa, eklenen koddan çalışmaya devam eder. Bu nedenle, yalnızca çok küçük koşullarda kullanılabilir.

Bununla birlikte, Chrome (v43 ve v44) artı Tampermonkey'de (v3.11 veya üstü) bir varyasyon hala çalışıyor . Açık @grantve sade bir yöntem kullanın window.close(). ÖRNEĞİN:

// ==UserScript==
// @name        window.close demo
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant       GM_addStyle
// ==/UserScript==

setTimeout (window.close, 5000);

Güncelleme için zanetu'ya teşekkürler . Açıkta yalnızca bir sekme varsa bunun işe yaramayacağını unutmayın. Yalnızca ek sekmeleri kapatır.


Firefox bu sömürüye karşı güvenlidir. Bu nedenle, tek javascript yolu güvenlik ayarlarını, her seferinde bir tarayıcıyı saklamaktır.

Sen açabilir about:configve set
allow_scripts_to_close_windowsiçin true.

Senaryonuz kişisel kullanım içinse, devam edin ve yapın. Başka birinden bu ayarı açmasını isterseniz, önyargıyla reddetmek akıllı ve haklı olur.

Şu anda Chrome için eşdeğer bir ayar yok.


3
Hey arkadaşım, nihayet senden haber almaktan mutluluk duyuyorum. Sadece bir nota Fx'te sen saygısız tarafından bu sınırlama baypas edebilir dom.allow_scripts_to_close_windows;falseiçin truekaynak hack olmadan ben Chrome'da bir şey sanırım ama / şimdilik etrafında nasıl geldiğini olan yeniden. Biliyorum ve TM geliştirici ile konuştum ve son alfa / beta biz bir uyumluluk seçeneği olarak koyduk (script ayarı) ortadaki adam tarzı, çalışır çalışır. Sanırım hacklerin hiçbiri temiz bir çözümümüz yok, yazık.
GµårÐïåñ

3
Birisi window.close veya tarayıcılar arasındaki belirli davranış farkı ile ilgili sorun yaşıyorsa, bu yanıtı çok dikkatli bir şekilde okuyun - gerçekten doğru bilgilere sahip.
Bron Davies

Pencerenin komut dosyası tarafından açılıp açılmadığını kontrol etmenin bir yolu var mı? (Bir geri düğmesini göstermem / gizlemem gerekiyor,
hack'i

Chrome 36.0.1985.125 ÇARŞAMBA, 16 Temmuz 2014 tarihinden bu yana, hacky geçici çözümleri çalışmayabilir, cevabımdaki ayrıntılar.
swcool

2
window.close()@grantdışında bir değere ayarlarsanız Tampermonkey'de çalışır none. Bu konuya bakın .
zanetu

32

Chrome 36.0.1985.125 sürümündeki güvenlik sorunları düzeltildi

Chrome 36.0.1985.125 ÇARŞAMBA, 16 Temmuz 2014 Sürüm notu

Benim gözlemimden, bu güncelleme window.close()pop-up pencereyi kapatmak için kullanma sorununu çözdü . Bunu başarısız olduğunda konsolda görürsünüz, "Komut dosyaları yalnızca onun açtığı pencereleri kapatabilir." Yani hacky geçici çözümleri (Brock Adams'ın cevabı) en son sürümde çalışmayabilir .

Bu nedenle, önceki Chrome sürümlerinde, aşağıdaki kod bloğu bu güncellemeyle çalışmayabilir, ancak çalışmayabilir.

window.open('', '_self', '');
window.close();

Bu güncelleme için açılır pencereyi kapatmak üzere kodunuzu uygun şekilde güncellemeniz gerekir. Çözümlerden biri pop-up pencere kimliğini alıp

chrome.windows.remove(integer windowId, function callback)

kaldırmak için yöntem. Chrome uzantı pencereleri API'sını chrome.windows adresinde bulabilirsiniz .

Aslında Chrome uzantım MarkView bu sorunla karşı karşıyaydı ve bu Chrome Güncellemesi için çalışması için kodumu güncellemem gerekiyordu. Bu arada, MarkView Awesome Markdown Dosyalarını okumak ve yazmak için bir araçtır, İçerik Anahattı, Sıralanabilir Tablolar ve satır numarası ile kod bloğu sözdizimi vurgulama gibi özellikler sağlar.

Ben de bu yazı yarattı , herhangi bir yorum bekliyoruz.


2
Doğru saldırı open(location, '_self').close();- dönüş değerinin kullanılmasına dikkat edin open(). Bu hala Chrome'da çalışıyor36.0.1985.125 m
Brock Adams

Benim durumumda, sadece tekrar test open(location, '_self').close();, bu konuda "Yetkisiz" hatası aldım. Bu hata 'window.close () (warning on this"Scripts may close only the windows that were opened by it."). It looked like open (location,' _self '). Close (); `biraz ilerledi, ancak benim durumumda tamamlanamıyor. Yorum için @ brock-adams teşekkürler.
swcool

Ben daktilo var ve ne zaman koymak chrome.windows.removesembol krom bulamadı diyor. bunu nasıl çözebilirim? bir tür referans eklemem gerekir mi?
DevT

@devt chrome.windows.remove Chrome uzantı API'sıdır, javascript'iniz krom uzantı programınız tarafından tanınmalıdır. Background.js içinde deneyebilirsiniz, krom uzantınız manifest.json'da şunları yapmanız gerekir: "background": {"scriptler": ["background.js"], ...},
swcool

Kullanıcıların serbestçe erişebilmesi için MarkView giriş işlevini kaldırmıştım . Yani yukarıda bahsettiğim örnek şu anda mevcut değil.
swcool

21

Tampermonkey'de artık

// @grant        window.close

Ve sonra sadece ara

window.close();

Bunun pek çok durumda işe yaradığını doğruladım ama hala inatçı olanlar ama hiç yoktan iyidir, teşekkürler. Bunu yazıya ekleyeceğim.
Gµår 18ïåñ

2
Gibi not: Greasemonkey 3.10 benim için çalışmıyor
mt025

17

Brock Adams tarafından yayınlanan yöntemi kullanıyorum ve kullanıcı tarafından başlatıldığında bile Firefox'ta çalışıyor.

open(location, '_self').close();

Bir düğmeye basarak çağırıyorum, böylece kullanıcı başlatıldı ve hala Chrome 35-40, Internet Explorer 11, Safari 7-8 ve ALSO Firefox 29-35 kullanarak iyi çalışıyor. Windows 8.1 ve Mac OS X 10.6, 10.9 ve 10.10 sürümlerini farklıysa test ettim.


Kendiliğinden Kapanan Pencere Kodu (kendi kendini kapatan sayfada)

Kendini kapatabilecek kullanıcı tarafından açılan pencerede kullanılacak kodun tamamı:

window_to_close.htm

JavaScript:

function quitBox(cmd)
{   
    if (cmd=='quit')
    {
        open(location, '_self').close();
    }   
    return false;   
}

HTML:

<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />

Bu test sayfasını deneyin: (Artık Chrome 40 ve Firefox 35'te test edildi)

http://browserstrangeness.bitbucket.io/window_close_tester.htm


Pencere Açıcı Kodu (yukarıdaki sayfayı açan bir sayfada)

Bu işi yapmak için, güvenlik tarafından uygulanan çapraz tarayıcı uyumluluğu, kapatılacak pencerenin kullanıcı tarafından aynı site etki alanındaki bir düğmeyi tıklatarak açılmış olmasını gerektirir.

Örneğin, kendisini kapatmak için yukarıdaki yöntemi kullanan pencere, bu kodu (yukarıda bağlantılı örnek sayfamdan sağlanan kod) kullanılarak bir sayfadan açılabilir:

window_close_tester.htm

JavaScript:

function open_a_window() 
{
    window.open("window_to_close.htm"); 

    return false;
}

HTML:

<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />

Kullanıcı tarafından başlatılan istisnaları unuttum; İyi yakalama. Sanırım çoğu kullanıcı yazarı tam otomatik çalışma istiyor. Zaten kullanışlı, kullanıcı tarafından başlatılan bir yakın mekanizma var - sağ üstteki küçük X. --^_^)
Brock Adams

1
Her nasılsa, bu benim için işe yaramıyor. Ne firefox 30'da ne de Chrome 37'de. Tek yapmanız gereken sayfayı boş yapmak (gerçekten tuhaf davranış). Kodum <button onclick="open(location,'_self').close()" >Close Window</button>. Açıkça yanlış bir şey mi yapıyorum? Bana öyle geliyor ki bu da kullanıcı tarafından başlatıldı. A <button>veya an kullanırsam aynı sonucu aldığımı unutmayın <input type="button">.
LordOfThePigs

Yukarıdaki cevaba sizin için bir test sayfası ekledik.
Jeff Clayton

@YumYumYum gönderi için teşekkürler, bitbucket.org son zamanlarda bitbucket.io bağlantısını değiştirdi - şimdi cevapta düzeltildi
Jeff Clayton

Benim için çalışıyor (pencereyi kapatmak için sayfada bir düğme olması). Ne işe yaramadı: window.open('', '_self', ''); window.close(); ama ile çalıştı open(location, '_self').close();
krystonen

10

Birçok kişi hala javascript kullanarak Chrome tarayıcıyı kapatmanın bir yolunu bulmaya çalışıyor. Aşağıdaki yöntem yalnızca Chrome'u APP başlatıcısı olarak kullandığınızda çalışır - örneğin kiosk!

Aşağıdakileri test ettim:

Aşağıdaki uzantıyı kullanıyorum: Close Kiosk

Kullanım talimatlarını izliyorum ve gayet iyi çalışıyor gibi görünüyor (testleri yaparken önbelleği temizlediğinizden emin olun). Kullandığım javascript (click olayına ekli):

window.location.href = '/closekiosk';

Umarım bulduğum tek çalışma çözümü olduğu için birine yardımcı olur.

Not: Görünüşe göre uzantı arka planda çalışıyor ve bir Chrome tepsi simgesi ekliyor. Şu seçeneği işaretleyin: "Chrome'un arka planda çalışmasına izin ver" (veya benzer bir metin). Sizin için çalışana kadar onunla oynamanız gerekebilir. Ben kontrol ettim ve şimdi gayet iyi çalışıyor!


9

"Patentli olarak yanlış" olduğunu düşünmesine rağmen, "inanç gibi görünüyor" dediğin aslında doğrudur. Window.close için Mozilla belgeleri diyor

Bu yöntemin yalnızca window.open yöntemi kullanılarak bir komut dosyası tarafından açılan pencereler için çağrılmasına izin verilir. Pencere bir komut dosyası tarafından açılmadıysa, JavaScript Konsolu'nda aşağıdaki hata görünür: Komut dosyaları, komut dosyası tarafından açılmayan pencereleri kapatmayabilir

"Hala yapması gerekiyor" diyorsunuz ama bunu destekleyen herhangi bir referans bulacağınızı sanmıyorum, belki bir şeyi yanlış hatırlamışsınızdır?


9

Benim için işe yarayan yeni bir yol buldum

var win = window.open("about:blank", "_self");
win.close();

1
Bu 2017 ve hala "Komut dosyaları komut dosyası tarafından açılmayan pencereleri kapatmayabilir" hatasını alıyorum.
Rotimi

IE 11 onayla düğmesi için güzel kesmek
Gopal00005

Chrome ve Firefox'ta Çalışır
Vineeth Pradhan

1
Bu delik dolu gibi görünüyor. Ne zamandan beri bilmiyorum ama en son dev derlemesi 84.x'i kullanıyorum. Boş sayfa yüklenir, ancak kapanış tetiklenmez.
Scott Christensen

4

Aşağıdaki kod benim için çalıştı -

window.open('location', '_self', '');
window.close();

Chrome'da test edildi 43.0.2357.81


Chrome sürümünüzü ekleyebilir misiniz lütfen?
Stephan

Krom sürümüm 43.0.2357.81.
DfrDkn

7
Benim için sadece geçerli pencerenin yerini / location konumunda olan bir pencereyle değiştirir.
alianos-

@ alianos- benim için de.
RicardoGonzales

1
En son kromda çalışmıyor - Sürüm 61.0.3163.100 (Resmi Derleme) (64 bit)
Subhajit

1

Bu eski olabilir, ama cevaplayalım.

Bir sekmeyi kapatmak için top.close () yöntemini kullanıyorum . window.close () veya başka bir açık ... close benim için çalışmadı.


11
Bu aynı zamanda "Scripts may not close windows that were not opened by script."diğer cevaplarda belirtilen problemden de muzdariptir .
kad81

1
lütfen cevabınıza çözüm verin. lütfen sorunu sadece cevabınızda tartışmayın.
Bimal Das

0

Benim durumumda, sayfanın kapatılması gerekiyordu, ancak bir bağlantı tarafından açılmış olabilir ve bu nedenle window.closebaşarısız olur.

Seçtiğim çözüm window.close, ardından window.setTimeoutfarklı bir sayfaya yönlendiren bir sorunu yayınlamaktır .

Bu şekilde, window.closebaşarılı olursa, o sayfadaki yürütme durur, ancak başarısız olursa, bir saniye içinde farklı bir sayfaya yönlendirir.

window.close();
window.setTimeout(function(){location.href = '/some-page.php';},1000);

0

Brock'un bu cevabı benim için işe yaradı. javascript'in aynı javascript tarafından açılmayan bir pencereyi kapatmasına izin verilmemelidir.

Alt pencereyi yalnızca üst javascript'ten kapatacaksam kapatabilirim. böylece ailemde böyle bir şey yapabilirim.

var myChildWindow;

function openWindow(){
myChildWindow = window.open("","myChildWindow","width=400,height=400");
}

function closeWindow() {
myChildWindow.close();
}

-1

Kodumu aşağıda kullanmayı da deneyebilirsiniz. Bu, üst pencerenizi yeniden yönlendirmenize de yardımcı olur:

Veli:

<script language="javascript">

function open_a_window() 
{
    var w = 200;
        var h = 200;
        var left = Number((screen.width/2)-(w/2));
        var tops = Number((screen.height/2)-(h/2));

        window.open("window_to_close.html", '', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+tops+', left='+left);

   return false;
}

// opener:
window.onmessage = function (e) {
  if (e.data === 'location') {
    window.location.replace('https://www.google.com');
  }
};

</script>

<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />

Açılır:

<!DOCTYPE html>
<html>
<body onload="quitBox('quit');">

<h1>The window closer:</h1>

<input type="button" onclick="return quitBox('quit');" value="Close This Window/Tab" /> 


<script language="javascript">

function quitBox(cmd) 
{      
    if (cmd=='quit')    
    {   
       window.opener.postMessage('location', '*');
       window.open(location, '_self').close();    
    }     
    return false;   
}

</script>

</body>
</html>


-2

Yalnızca window.open () kullanarak yeni bir pencere açarsanız, yeni pencere yukarıda bahsettiğim gibi kod kullanarak kapanabilir. Bu benim için mükemmel çalışıyor :) Not: Sayfayı yeni bir sekmede açmak için asla href kullanmayın. Window.close () "href" ile çalışmaz. Bunun yerine window.open () öğesini kullanın.


1
Sadece para birimi penceresinin yerini alıyor. Daha fazla yok.
RicardoGonzales

-3

"Çözümüm" ü bu sorunla paylaşmak istedim. Birçoğumuz, bir kullanıcının başka bir web sitesini veya başka bir web sitesini ziyaret ettikten sonra ve biraz daha ziyaret etmeden önce bir tarayıcı penceresini standart bir tarayıcı oturumunda kapatmaya çalışıyor gibi görünüyor.

Ancak, benim durumum, cihazın yaptığı tek şey olacak bir cihaz için bir web uygulaması oluşturuyorum. Başlatıyorsunuz, Chrome'u başlatıyor ve uygulamamıza gidiyor. İnternete bile bağlı değil, konuştuğu sunucular yerel Docker kaplarımızda. Kullanıcının, sistem güncellemelerini gerçekleştirmek için terminale erişebilmesi için uygulamayı kapatmak için bir yola ihtiyacı vardır.

Böylece, Chrome'u kiosk modunda zaten doğru adreste başlatır, başlatır. Bu özellikteki ikinci seçeneği kolayca tatmin etmek için olur:

Tarama içeriği, bir komut dosyası tarafından oluşturulan (kullanıcının eyleminin aksine) yardımcı bir tarama bağlamıysa veya oturum geçmişi yalnızca bir Belge içeren üst düzey bir tarama bağlamıysa komut dosyasına kapatılabilir .

Yani sadece window.close()benim kiosk uygulamasından arama sadece çalışıyor !


-5

Bunun gibi bir şey deneyin onclick = "return self.close ()"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.