Sayfadan çıkarken tetiklenen JavaScript uyarılarını nasıl önleyebilirim?


12

Sayfaları terk ettiğinizde birçok sayfa uyarısı vardır: Sekmeleri kapatırsanız, kaydetmeden uzaklaşırsanız vb. Bir siteyi bir uyarıyı onaylayana kadar sizi uyarmak / engellemenin çeşitli nedenleri vardır, örneğin "İstediğinizden emin misiniz? bu sayfadan uzaklaşılsın mı? "

Bu genellikle onbeforeunloadve / veya onunloadişleyicilerle yapılır.

İşte bir örnek.

Bu işleyiciler tarafından oluşturulan uyarıları / kullanıcı engelleme olaylarını engelleyebilmemin bir yolu var mı? Temel olarak, JS'yi etkin bırakmak ve özellikle fazladan bir tıklama olmadan bir sayfadan çıkmamı engelleyecek şeylere izin vermemek istiyorum.

onbeforeunloadve onunloadişleyiciler hala ateş etmeli; kullanıcıyı engelleyecek şeyler yapmalarına izin verilmemelidir. Bu, uyarı olmaması ve birkaç saniyeden uzun süren işlemler olmaması anlamına gelir.

Düzenleme / greasemonkey belirli sayfalar için javascript yama bazı birkaç eklentiler buldum ve kodlarını biraz evrensel olarak uygulanabilir hale getirmek için biraz oynadı. Ancak, kullanıcı çıkışını engellemeye çalışan herhangi bir sayfada çalışan bir çözüm bulmayı umuyorum .


Bunu yapan bir URL gönderebilir misiniz?
golimar

Düzenlendi, örnek eklendi. Ayrıca, bu davranışın neden genellikle arzu edildiğini ve birçok durumda yanlışlıkla veri kaybını önlemek için gerekli olduğunu anlıyorum. Hala nasıl geçersiz kılacağını / devre dışı bırakılacağını bilmek istiyorum.
Zac B

Not: mevcut yanıtın tümü (değişen onbeforeunload), yalnızca onbeforeunloadolayları eklemek için kullanılan yöntemlerden birini kullanan sayfalar için değil , yalnızca kullanılan sayfalar için çalışır .
Ocak'ta Synetech

Yanıtlar:


7

Yapılacak en basit şey, doğrudan sayfa komut dosyasını geçersiz kılmak ve etkinliği yeniden atamaktır null.

window.onbeforeunload = null;

Bu, gerçekten kötü niyetli olmadıkları her yerde çalışmalı ve kendileri yeniden atamaya devam etmelidir. Böyle bir durumda, ayarı korumak için bir döngü nullmuhtemelen işe yarayacaktır.

while(true) {
    if (window.onbeforeunload != null) {
        window.onbeforeunload = null;
    }
}

Şimdi dikkat edin, bazı sayfalar bunu iyi kullanır. YouTube yükleme sayfasını alın: Bir yükleme sırasında uzaklaşırsanız, saatlerce ilerleme kaydetmiş olabilirsiniz! Ya da tekrar doldurmak istemeyebileceğiniz bir web formu ya da yeniden yazmak istemeyeceğiniz bir mesaj (forum / e-posta). Bu özellik sayesinde korunursunuz.

Başka bir sorun, verileri AJAX tarafından kaydetmek gibi ikincil bir amaç için kullanan herhangi bir sayfadır. Kaydetme eylemini tetiklemek için bu olayı kullanabilirler ve kullanıcının isteğin gerçekleşmesi için düğmeyi tıklamak için yeterince uzun sürdüğünü umarlar. Yine, bu genellikle sizi kendinizden kurtarmak için yapılır.

Ancak, açıkçası, birçok sayfanın bunu hasta için kullandığını biliyoruz. Bu yüzden, üzerinde çalışmasını istediğiniz sayfaları biliyorsanız, her zaman bir beyaz liste sisteminiz olabilir. Bu eylemi, tamamen engellemeden window.onbeforeunloadve yapabileceği (muhtemelen iyi) herhangi bir işlem yapmadan engellemenin bir yolu yoktur .

Açılır pencereyi durdururken iyi eylemleri korumanın hiçbir yolu (belirli bir sayfa kodu hakkında önceden bilgi sahibi olmadan) yoktur. Bu kutu değil bir alert(). Kutu, amaçlanan davranış olarak tarayıcı tarafından oluşturulur onbeforeunload. Biri, window.onbeforeunloadbir dize döndürmek için atadıkları işlevi yaparak oluşturur . Bu dize açılır pencerede yazdırılacaktır.

window.onbeforeunload = function() {
    //Whatever
    return "WARNING! You have unsaved changes that may be lost!";
}

Böylece, işlevi silmeden açılır pencereyi engelleyemezsiniz.

Ayrıca, bir yol bulursanız, herhangi bir AJAX başarısız olur. Açılır pencere, isteklere veri olmadan kaybolabilir.

Gelince onunload, bununla sizi engellemek mümkün olmamalıdır. Etkinleştiği yana sonra sayfa kaldırır. Ama güvende olmak için her zaman yapabilirsiniz window.onunload = null;ve bununla ilgilenilmelidir.


Bu tür işler, ama onbeforeunloadişleyici başka önemli bir şey yaptıysa? Örneğin, kısa bir AJAX isteği yaptığında veya yerel HTML5 depolamasına bir şey yaptığında ne olur? onbeforeunloadİşleyicilerin belirli aramalar yapmasını (yani alert()) veya belirli bir süreden daha uzun süre çalışmasını önlemenin bir yolu var mı ? Bu yüzden sadece greasemonkey tipi bir komut dosyası yerine bir uzantı sordum: Görünüşe göre, bunu doğru yapmak için JavaScript motoru düzeyinde bir şey değişmesi gerekiyordu.
Zac B

1
Biraz daha bilgi ekledim. Aslında bunu daha düşük bir seviyeye sabitlerken, uzantılar aslında daha düşük bir seviye değildir. Daha yüksek izinleri ve bazı özel API'leri vardır, ancak tarayıcının temel işlevlerini değiştirme konusunda herhangi bir yetenekleri yoktur. FF takmanın ne kadar derin gidebileceğinden emin değilim, o alanda deneyimim yok. Açık kaynak kodlu olarak, bu değişiklikleri yapabilirsiniz. Ama bu bir pop-up'ı düzeltmek için biraz ileri gidiyor.
zeel

Benim için çalışmıyor :(
Phuc Nguyen

0
    // ==/UserScript==

var th = document.getElementsByTagName('body')[0];
var s = document.createElement('script');
s.setAttribute('type','text/javascript');
s.innerHTML = "window.onbeforeunload = function() {}";
th.appendChild(s);

1
Neden böyle bir senaryo oluşturdunuz?
Brad

3
@her kimse. Komut dosyanızı başkalarının ne yaptığını bilmelerine yardımcı olmak için açıklamaya çalışırsanız yardımcı olabilir. Bu ayrıca, komut dosyasının belirli bir parçasının, komut dosyasını iyileştirecek şekilde değiştirilebileceği veya bir parçanın tamamen farklı bir komut dosyasında kullanılabileceği için, birçok kişi tarafından kullanılmasına izin verir. Ayrıca, insanların sorularına nasıl uygulanacağını bilmelerine yardımcı olmak için yine de size cevap vermeniz iyi bir fikirdir. Yine de yanıtınızı gönderdiğiniz için teşekkür ederiz.
David

0

Bir Windows sisteminde can sıkıcı pop- up'ları işleyebilecek güzel bir araç var - ClickOff . Buradan indirebilirsiniz . Ben kontrol ettim ve SharePoint sitesi için "Yaptığınız değişiklikler kaydedilemeyebilir" uyarısı ile çalışır.

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.