2011-09-08 5 views
15

JavaScriptのprompt関数は、ユーザーが「キャンセル」をクリックするとnullの関数を返し、ユーザーが何もせずに「OK」をクリックすると空の文字列を返します。テキストボックスしかし、Safari 5.1では、両方の場合に空の文字列を返します。Safari 5.1のprompt()関数とキャンセル

Safariの「バグを報告する」機能を使用してAppleに報告しましたが、それを修正することはほとんどないことを知っています。誰にも回避策がありますか?

答えて

2

Safariは5.1のshowModalDialog()のサポートを追加して以来、実際の回避策を思いつきました。すごく便利。

まず、この内容でファイルを作成します。次に

<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> 

、サファリの壊れたバージョンのを(プロンプトをポップアップし、ヒットするユーザに尋ねることなくこれを備えています-検出する方法はないように思えます上記の作成への正しいパスにパス/js/safari-5.1-bugfix.htmlを変更、もちろん

(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; 
})(); 

を:window.promptを交換するには、次のJavaScriptを実行、)あなたは、おそらくのUser-Agentのチェックを行う必要がありますので、「キャンセル」サーバー上のHTMLファイル。残念ながら、data: URIをSafariとして使用することはできません。別のバグwindow.dialogArgumentsを失い、data:のダイアログでは、window.returnValueを無視します。

通常通り、prompt()を使用することができます。

+0

ニース、ありがとう! – Bibou

-1

確かに、2つです。

最初に明らかなのは、システムを再設計して空の文字列が有効な応答でないようにすることです。それについて考えてみてください。会話の中で、あなたの質問に対する実際の答えで、一人の男があなたをじっと見つめていても大丈夫ですか?

第2の方法は、jQueryのようなモーダルダイアログを使用してこの情報を求めることです。あなたはそれを完全に制御を得るでしょうし、私は行動に気づいていなかったアップアプリケーションは、私は頭を高く評価し、1996年

+4

あなたの最初の答えは無用である私のために働きました。空の文字列が有効な応答である理由はたくさんあります。あなたの2番目のものはあまり役に立ちませんが、私はJQueryのソースを掘り下げて、 "モーダルダイアログ"のために何をしているのか調べようとしていません。 – Anomie

+0

この理論はとてもシンプルですが、全体のビューポートをカバーする「大きな」「div」を置き、その上にダイアログを表示します。ダイアログを閉じると、先ほど作成した 'div'が削除されます。それはすべて単純な '.dialog( 'show')'コールでカプセル化されています! – Blindy

+1

しかし、そのスタイルを 'var retval = dialog( 'show')'として使うことはできません。ユーザーが「OK」または「キャンセル」をクリックしたときに呼び出される疑似ダイアログのコールバックを設定し、ダイアログの表示を「前」および「後」の間に状態を維持しながらプロンプト機能を分割しなければなりません二つ。私がそのようなことをしたいとき、私はすでにそれをやります。しかし、ユーザに必要な情報を尋ねるのに必要なのは、単純な 'prompt()'だけです。 – Anomie

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

私はあなたがこれを暴言として願っています。 – pimvdb

+0

+1、ちょうど私が最初にバグに遭遇したときに私はストップギャップの測定と同じことをしたからです。 – Anomie

3

にそれが行われたように見えませんが、今私はあなたがしていることがわかり正しい。 Safari 5は正常に動作し、5.1のいずれかのボタンクリックで空の文字列が返されます。の場合、プロンプトフィールドに空の文字列があります。

私の唯一の提案は、フィールドにスペース文字を入れて始めることです。 「OK」ボタンだけがスペースを返します。キャンセルはnullまたは空の文字列を返します。

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 

ユーザー、何かを入力して開始し、それを削除し、「OK」をヒット代わりのキャンセル、 が、例その種類は、同様に取り消すことがことができます。

0

私がしようと試み、これは

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

if(p!==null) { location = p; alert("ok do query"); } 
関連する問題