2008-11-25 45 views
6

Bu here yayınlanmıştır, ama tek başına bir soru hak diye düşündüm. Ben bunu yapmaya çalışıyorum neASP.NET iki kez

o/o kaydedilmemiş değişiklikler olup olmadığını sayfadan ayrılmak istiyorsa kullanıcıyı soran bir iletişim kutusu görünmek. Her şey yolunda.

herkes Internet Explorer onbeforeunload olayı iki kez tetikler sorun rastlamak Has

: Ama sorun aşağıda açıklanmıştır? Etrafında Googling yaparken, (diğerleri arasında) bir ASP.NET linkbutton için HTML kodu <a href="javascript: __doPostBack... olduğu gerçeği ile ilgili bir şey olduğunu buldum. IE bir href="#" sahip olmayan bir bağlantıyı hatırlayacağı

Görünüşe

, bu onbeforeunload olayı tetikler. Ardından, gösterdiğimiz javascript iletişim kutusunu onayladığınızda, sayfa diğer sayfaya gitmek için 'gerçek' boşaltma yapacak ve onbeforeunload olayını ikinci kez yükseltecektir.

internette sunulan bir çözüm bir boolean değişkeni ayarlamak ve iletişim göstermeden önce üzerine kontrol etmektir. Yani ikinci kez, gösterilmeyecek. Her şey yolunda, ancak kullanıcı iptal ettiğinde, değişken hala ayarlanacaktır. Dolayısıyla, kullanıcı sayfayı terk etmek istediğinde, iletişim kutusu artık gösterilmeyecek.

Bu biraz açık, ve umarım birisi bu konuda bir yol bulmuştur?

cevap

10

: Evet, fakat tarayıcı tarafından kullanılmak üzere iletişim kutusunun sonucunu istiyorum. Bu yüzden 'return bFlag' ifadesini kullanmanın (ya da event.returnValue = bFlag) olacağını düşünebilirsiniz, ancak bu size ikinci bir iletişim kutusu sağlar. Bir yol buldum, this page için teşekkürler. Aslında oldukça basit: Bu genel değişken burada

var onBeforeUnloadFired = false; 

Kullanım:

if (!onBeforeUnloadFired) { 
    onBeforeUnloadFired = true; 
    event.returnValue = "You'll lose changes!"; 
} 
window.setTimeout("ResetOnBeforeUnloadFired()", 1000); 

Ve sonra o fonksiyonu uygulamak:

function ResetOnBeforeUnloadFired() { 
    onBeforeUnloadFired = false; 
} 

Yani, aslında, bayrak kullanın, ancak bunu sıfırlamak kullanıcı iptal tıklarsa. İstediğim gibi değil ama daha iyi bir şey bulamadım.

+0

Bence cevabımı tam anlamıyla alıyorsunuz. Onaylama değerini, iletişim kutusunu göstermeden önce kontrol etmek için kullandığınız bir bayrakta saklamak istediğiniz anlamına gelir. Sanırım her iki tarafta da var. – annakata

1

Bu karşılaşmadım ama kesinlikle iletişim sonucu eşit olacak şekilde bayrak değişkeni ayarlayabilirsiniz? Kullanıcı iptal ederse bayrak bu yüzden yanlış kalacaktır. annakata tepki olarak

var bFlag = window.confirm('Do you want to leave this page?'); 
0

IE, onstop adlı belge nesnesindeki bir olayı destekler. Bu olay, onbeforeunload olayından sonra, ancak onunload olayından önce patlar. Bu iki diyalog sorusuyla tam olarak ilgili değil, ama hala bu iş parçacığıyla ilgili olarak gelebilecek diğer insanlarla alakalı.

Yapmakta olduğum problem, onbefore unload olayı üzerine bir yükleme mesajı görüntülemem gerektiğiydi. Bu, sayfada bir çeşit onay iletişim kutusu bulunana kadar sorun değil. Onbeforeunload olayı, kullanıcı iptal edip sayfada kalsa bile tetiklenir. Yapmam gereken en kolay şey, "yükleme" görüntü mantığımı document.onstop için bir işleyiciye taşımaktı. Bunun üzerine, başka bir IE-only alanı olan document nesnesinin readyState özelliğini kontrol etmeniz gerekir. "Yükleme" ise, kullanıcının aslında sayfadan ayrıldığı anlamına gelir. Eğer "tamamlandı" ise, kullanıcının kaldığı anlamına gelir.

Yalnızca IE kullanarak sorun yoksa, aşağıdakileri ilginizi çekebilir.

document.onstop = function() 
{ 
    try 
    { 
     if(document.readyState != "complete") 
     { 
      showLoadingDiv(); 
     } 
    } 
    catch(error) 
    { 
     handleError(error); 
    } 
}