Sorun şu ki, window.close()
veya self.close()
komutunu çağırdığımda pencere kapanmıyor. Şimdi Chrome'da komut dosyası oluşturulmamış herhangi bir pencereyi komut dosyası ile kapatamayacağınıza dair bir inanç var gibi görünüyor. Bu kesinlikle yanlıştır, ancak yine de onaylamak için bir uyarı açması gerekse bile bunu yapması beklenir. Bunlar gerçekleşmiyor.
Peki, javascript:window.close()
veya javascript:self.close()
gibi bir şey kullanarak bir pencereyi kapatmak için gerçekten bekleneni yapan ve Chrome tabanlı olmayan her tarayıcıda gayet iyi çalışan gerçek, işlevsel ve kanıtlanmış bir yöntemi olan var mı? Herhangi bir öneri çok takdir edilecektir ve Javascript'e özgü bir çözüm arıyorum, JQuery veya üçüncü taraf uygulaması değil.
Güncelleme: Önerilenlerin çoğu ciddi sınırlamalara ve kullanılabilirlik sorunlarına sahip olsa da, en son öneri (TamperMonkey'e özgü) komut dosyası başlığında // @grant window.close
kullanmak, normalde kapatma yöntemini işleyemeyen sekmelerde bile genellikle işe yarayacaktır. Tamamen ideal olmasa da ve her durum için genelleştirilmese de, benim durumumda iyi bir çözümdür.
Sıradan javascript pencereleri ister istemez kapatamaz. Bu, çeşitli kötü niyetli istismarları ve rahatsızlıkları durdurmak için bir süre önce tanıtılan bir güvenlik özelliğidir.
window.close()` için en son çalışma spesifikasyonu]1'den:
Pencere nesneleri üzerindeki
close()
yöntemi, aşağıdaki koşulların tümü karşılanırsa, A tarama bağlamını kapatmalıdır:
- İlgili gözatma bağlamı A script-closable'dır. Görevli komut dosyasının gözatma bağlamı A gözatma bağlamına aşinadır.
- Görevli komut dosyasının tarama bağlamının A tarama bağlamında gezinmesine izin verilir.
Bir gözatma bağlamı, bir komut dosyası tarafından oluşturulmuş (kullanıcının bir eyleminin aksine) yardımcı bir gözatma bağlamıysa veya oturum geçmişi yalnızca bir Belge içeren bir gözatma bağlamıysa script-closabledır.
Bu, küçük bir istisna dışında, javascript'in aynı javascript tarafından açılmamış bir pencereyi kapatmasına izin verilmemesi gerektiği anlamına gelir.
Chrome bu istisnaya izin verir - ki bu istisna kullanıcı betiklerine uygulanmaz - ancak Firefox bunu yapmaz. Firefox uygulaması bunu açıkça belirtmektedir:
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.
Bir Greasemonkey / Tampermonkey / usercript'ten window.close
kullanmaya çalışırsanız, şunu elde edersiniz:
Firefox: Hata mesajı, "Scripts may not close windows that were not opened by script.
"
Chrome: sadece sessizce başarısız oluyor.
Bununla başa çıkmanın en iyi yolu, bunun yerine bir Chrome uzantısı ve/veya Firefox eklentisi yapmaktır.** Bunlar mevcut pencereyi güvenilir bir şekilde kapatabilir.
Ancak, window.close
komutunun yarattığı güvenlik riskleri bir Greasemonkey/Tampermonkey betiği için çok daha az olduğundan; Greasemonkey ve Tampermonkey bu işlevi kendi API'lerinde makul bir şekilde sağlayabilir (esasen uzantı işini sizin için paketleyebilir).
Bir özellik talebinde bulunmayı düşünün.
Chrome şu anda "self redirection" istismarına karşı savunmasızdır. Yani bunun gibi kodlar genel olarak çalışıyordu:
open(location, '_self').close();
IMO'ya göre bu hatalı bir davranıştır ve artık (yaklaşık Nisan 2015 itibariyle) çoğunlukla engellenmiştir. Sekme yeni açılmışsa ve tarama geçmişinde sayfa yoksa enjekte edilmiş koddan sadece çalışmaya devam edecektir. Bu yüzden sadece çok küçük bir koşul kümesinde kullanışlıdır.
Bununla birlikte, bir varyasyon hala Chrome (v43 & v44) artı Tampermonkey (v3.11 veya üstü) üzerinde çalışmaktadır. Açık bir @grant
ve düz window.close()
kullanın. EG:
// ==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. Yalnızca bir sekme açıksa bunun çalışmayacağını unutmayın. Sadece ek sekmeleri kapatır.
Firefox bu istismara karşı güvenlidir. Bu nedenle, tek javascript yolu, her seferinde bir tarayıcı olmak üzere güvenlik ayarlarını bozmaktır.
about:configsayfasını açabilir ve allow_scripts_to_close_windows
öğesini true
olarak ayarlayın.
Senaryonuz kişisel kullanım içinse, devam edin ve bunu yapın. Başka birinden bu ayarı açmasını isterseniz, önyargıyla reddetmeleri akıllıca ve haklı olacaktır.
Şu anda Chrome için eşdeğer bir ayar bulunmamaktadır.
Brock Adams tarafından gönderilen yöntemi kullanıyorum ve eğer kullanıcı tarafından başlatıldıysa Firefox'ta bile çalışıyor.
open(location, '_self').close();
Bir düğmeye basarak çağırıyorum, bu yüzden kullanıcı tarafından başlatılıyor ve Chrome 35-40, Internet Explorer 11, Safari 7-8 ve AYRICA Firefox 29-35 kullanarak hala iyi çalışıyor. Windows'un 8.1 sürümünü ve Mac OS X 10.6, 10.9 & 10.10'u kullanarak test ettim, eğer farklıysa.
Kendi Kendine Kapanan Pencere Kodu (sayfada kendi kendine kapanan)
Kullanıcı tarafından açılan ve kendini kapatabilen 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: (Şimdi 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)
Bunun çalışabilmesi için, güvenliğin dayattığı çapraz tarayıcı uyumluluğu, kapatılacak pencerenin kullanıcı tarafından aynı site etki alanı içindeki bir düğmeye tıklanarak açılmış olmasını gerektirir.
Örneğin, kendini kapatmak için yukarıdaki yöntemi kullanan pencere, bu kodu kullanan bir sayfadan açılabilir (kod, yukarıda bağlantısı verilen örnek sayfamdan sağlanmıştır):
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" />
Açıkça yanlış olduğunu düşünmenize rağmen, "bir inanç gibi görünüyor" dediğiniz şey aslında doğrudur. window.close]1 için Mozilla belgeleri şöyle diyor
Bu yöntemin yalnızca window.open yöntemi kullanılarak bir kod tarafından açılan pencereler için çağrılmasına izin verilir. Pencere bir komut dosyası tarafından açılmamışsa, JavaScript Konsolu'nda aşağıdaki hata görüntülenir: Komut dosyaları, komut dosyası tarafından açılmamış pencereleri kapatamaz
Hala yapması gerektiğini söylüyorsunuz; ancak bunu destekleyen herhangi bir referans bulabileceğinizi sanmıyorum, belki de bir şeyleri yanlış hatırlıyorsunuzdur?