2011-09-08 15 views
15

Çoğu tarayıcıda (Safari'nin eski sürümleri de dahil olmak üzere), Javascript prompt işlevi, kullanıcı "İptal" i tıklattığında null değerini döndürür ve kullanıcı "Tamam" ı tıklarsa boş dizeyi metin kutusu Ancak Safari 5.1'de, her iki durum için boş dizeyi döndürür.Safari 5.1 prompt() işlevi ve iptal

Safari'nin "bir hata bildir" özelliğini Apple'a bildirmek için kullandım, ancak bunu ne zaman daha kabul edebileceğini bile bilebilirler. Herkesin bir çözümü var mı?

cevap

2

Gerçek bir çözüm bulmayı başardım, çünkü Safari 5.1'de showModalDialog() desteğini ekledi. Çok uygun, bu.

Birincisi, bu içeriğe sahip bir dosya oluşturmak: O

<html> 
<head> 
<title>Prompt</title> 
<script type="text/javascript"> 
function a(){ 
     if(window.dialogArguments.length > 0) 
       document.getElementById('a').textContent = window.dialogArguments[0]+'\n\n'; 
     if(window.dialogArguments.length > 1) 
       document.getElementById('b').value = window.dialogArguments[1]; 
     document.getElementById('b').focus(); 
} 

function s(b){ 
     window.returnValue=b?document.getElementById('b').value:null; 
     window.close(); 
} 

function kp(e){ 
     if(!e.DOM_VK_ENTER) e.DOM_VK_ENTER=13; 
     if(!e.DOM_VK_RETURN) e.DOM_VK_RETURN=13; 
     if(!e.DOM_VK_ESCAPE) e.DOM_VK_ESCAPE=27; 

     switch(e.keyCode){ 
      case e.DOM_VK_ENTER: 
      case e.DOM_VK_RETURN: 
      if(e.preventDefault) e.preventDefault(); 
      if(e.stopPropagation) e.stopPropagation(); 
      e.returnValue = false; 
      e.cancelBubble = true; 
      s(1); 
      return false; 

      case e.DOM_VK_ESCAPE: 
      if(e.preventDefault) e.preventDefault(); 
      if(e.stopPropagation) e.stopPropagation(); 
      e.returnValue = false; 
      e.cancelBubble = true; 
      s(0); 
      return false; 

      default: 
      return true; 
     } 
} 
</script> 
<body style="text-align:center;white-space:pre-wrap" onload="a()"> 
<span id="a"></span> 
<input type="text" id="b" onkeydown="return kp(event)" /><input type="button" value="Ok" onclick="s(1)" /><input type="button" value="Cancel" onclick="s(0)" /> 
</body> 
</html> 

, Safari'nin kırık sürümleri için (bir istem haşhaş ve vurmak için kullanıcı sormadan bu özelliği algılama için hiçbir yol var gibi görünüyor yukarıda oluşturulan doğru yola yolunu /js/safari-5.1-bugfix.html değiştirmek tabii

(function(){ 
     if(window.console && window.console.log) 
       window.console.log('Applying bugfix for Safari 5.1\'s prompt()'); 
     var oldprompt = window.prompt; 
     window.prompt = function() { 
       return showModalDialog(location.protocol+'//'+location.host+'/js/safari-5.1-bugfix.html', arguments); 
     }; 
     window.prompt.$orig = oldprompt; 
})(); 

: muhtemelen bir kullanıcı aracısı denetimi yapmak gerekecek böylece window.prompt değiştirmek için aşağıdaki Javascript yürütmek,), "İptal" Sunucunuzdaki HTML dosyası. Ne yazık ki, bir data: URI, Safari'nin başka bir hataya sahip olduğunu ve window.dialogArguments değerini kaybettiğini ve data: URI'leri için iletişim kutuları için window.returnValue öğelerini göz ardı edemeyiz.

prompt()'u normalde kullandığınız gibi kullanabilirsiniz.

+0

Güzel, teşekkürler! – Bibou

-1

Elbette, aslında iki.

İlk olarak, açık olanı, sisteminizi yeniden tasarlayın, böylece boş bir dize geçerli bir yanıt değildir. Bir düşüncede, bir insanın sorusuna gerçek bir cevap olarak boş bir şekilde bakması kabul edilebilir mi?

İkincisi, bu bilgileri istemek için jQuery olanlar gibi kalıcı iletişim kutularını kullanmaktır. Bunun üzerinde tam kontrole sahip olursunuz ve ben davranışlarını fark etmemişlerdi yukarı uygulama Sana kafalarını takdir 1996.

+4

çalıştı. Boş bir dizenin geçerli bir yanıt olabileceğinin birçok nedeni vardır.İkincisiniz de çok faydalı değil, JQuery'nin kaynağını, “kalıcı iletişim” için neler yapabileceğini öğrenmeye çalışmak üzereyim. – Anomie

+0

Teori oldukça basit, tüm viewport'u kaplayan bir "büyük" div 'koydunuz, sonra diyaloğunuzu üzerinde görüntüleyeceksiniz. İletişim kutusunu kapattığınızda, daha önce oluşturduğunuz 'div 'öğesini kaldırırsınız. Her şey basit bir '.dialog ('show')' çağrısı içinde kapsüllenmiş! – Blindy

+1

Ancak, bu diyalog stilini “var retval = dialog ('show')' olarak kullanamazsınız. Kullanıcı "Tamam" veya "İptal et" i tıklattığında ve iletme işlevinizi "arasında" ve "sonrasındaki" için "önce" ve "sonrasını" keserken, söz konusu durum arasındaki durumu koruyarak, sözde diyaloğunuzun çağrılması için geri çağrıları ayarlamanız gerekir. iki. Böyle bir şey istediğimde, bunu zaten yapıyorum. Ancak bazen basit bir 'prompt()', kullanıcının gerekli bilgileri sorması için ihtiyaç duyulan her şeydir. – Anomie

3
var res = prompt('hello?', '') 
if (res === null || res === '' && isSafari && confirm('was that cancel?')) 
    cancel 
+1

Umarım bunu bir rant olarak kastediyorsunuzdur. – pimvdb

+0

+1, sadece hatayla ilk karşılaştığımda bir stopgap ölçümü olarak aynı şeyi yaptım. – Anomie

3

yılında yapıldığı gibi görünmüyor, ama şimdi senin olduğunu görüyoruz doğru. Safari 5 normalde davranıyor, 5.1, her iki düğme için için boş bir dize döndürüyorsa, komut satırında boş bir dize var.

Tek önerim, alana başlamak için bir boşluk karakteri koymaktır. Sadece 'Tamam' düğmesi alanı döndürür, iptal işlemi boşalır veya boş dizge döner.

var p=prompt('what dya say?',' '); 
if(!p)// cancel was *probably* clicked 
else if(p===' ')//ok was clicked with no input 
else// there is user input 

o şey girmek silmek başlatın ve sonra, 'Tamam' tuşuna yerine iptal ama durum bu tür yanı bir iptal olabilir olabilir kullanıcı.

0

Ben uğraş ve bu İlk cevap işe yaramaz bana

var location=""; 
    var p=prompt("type your location",location); 

if(p!==null) { location = p; alert("ok do query"); }