2012-07-25 14 views
6

ファイル入力ダイアログが現在開いているかどうかを検出するにはどうすればよいですか?ファイル入力ダイアログが開いているかどうかの検出

ビルドしているWebアプリケーションのポップアップ(ブートストラップスタイル)モデルにファイルアップロード機能を統合しようとしています。モデルの動作の一部として、エスケープが押されると、モデルは閉じられます。

オープンモデルからファイル入力ダイアログを開くまではこれがすべて有効です。エスケープを押して入力ダイアログを閉じると、モデルも閉じられます。私が達成しようとしているものの

A超簡易版 http://jsfiddle.net/ckevy/1/

答えて

4

はこのようにそれを解決してみてください。

ユーザがファイル選択入力をクリックすると、それがフォーカスを:$(el).focus()を。

次に、ユーザーがESCを押すたびに、$( ':focus')要素がファイル選択入力かどうかを調べます。その場合、モーダルを入力して閉じないblur()。最悪の場合 - ユーザーがモーダルを閉じたいと思ってESCを押しても何も起こらない[1]。 "wtf"と思って、ESCをもう一度押し、モーダルは必要に応じて閉じます。可能性のあるすべてのケースでファイル選択入力にフォーカスが当てられていることを確認してください - 入力によるタブ移動など。サードパーティーのアップローダを使用していて、うまくいきません - そのアップローダがファイルセレクションをどのようにラップするかを見てくださいカスタムリンクやボタン、実際にクリックイベントを受信するケース(タブをタップすると、入力がイベントを受け取る可能性があります。クリックするとリンクになる可能性があります)。全体的に、これは私が記述した警告と一緒に働くことは管理しやすいです。

これは、-sも同様に機能します(ESCがヒットしたときにselectがフォーカスされていないことを確認してください)。

blur()ファイル選択入力が必要な場合は、すべてのケースを検出することはできません。それはクロスブラウザソリューションではありません。 FFでも調整が必要です。私は肯定的な結果をWebkitでテストしていますが、他のブラウザでは動作しない可能性があります。私の場合は

+1

私は、ほとんどの人がESCキーの代わりに「キャンセル」ボタンを押したと思います。この解決策がサポートしていないもの。 –

1

私はあなたが実際に対話自体を直接制御を持っていると信じていません。 FFなどの一部のブラウザでは、ダイアログをある程度操作することができましたが、これはすべてのブラウザとすべてのブラウザのバージョンには当てはまりません。

これを行う最も簡単な方法は、ファイルウィンドウを開く前にモデルダイアログでショートカットキーを無効にすることです。

+1

ポップアップが表示されたとき(ファイル入力のクリックイベント)にはキーを無効にするのは簡単ですが、私が入力した場合はそれまでに入力フィールドにフォーカスを当てると問題が解決します。ユーザーがダイアログを再び閉じる時を知らせる方法はありません。 残念ながら、ダイアログボックスが表示されても$(window).blurがトリガされません。または、ウィンドウのフォーカスがD: – Doug

+1

@Dolondroのときに消えてしまいます。実際にはファイルアップロードダイアログが実際にはブラウザにはまったく接続されていて、実際にはOS固有の要素なので、これらは呼び出されません。モデルダイアログのショートカットを無効にするのは醜いことです。なぜなら、ユーザーがキャンセルを押すようにする必要があるからですが、それは唯一の方法だと思います。 – Sammaye

0

は、jQueryの上でこのコードを動作します:ニキータの答えに基づいて

// esc must close popup 
$("body").keyup(function(e) { 
    if (27 == e.keyCode) { 
     hidepopup(); 
    } 
}); 

// input in popup 
var $file = $("input:file"); 
// keyup will be catched for input, not for body 
$file.bind("click", function(e) { 
    $(this).focus(); 
}); 
// keyup catching will be changed back to body after selecting file 
$file.bind("change", function(e) { 
    $(this).blur(); 
}); 
// we catched esc keyup, so change esc catching back to the body 
$file.keyup(function(e) { 
    if (27 == e.keyCode) { 
     $(this).blur(); 
     // i don't know, why it works with return false, because i am not js programmer), but cancelBubble or e.preventDefault is not working 
     return false; 
    } 
}); 
0

$('input[type="file"]').on('keydown',function(e){ 

    //Prevents code from firing if file browser is open 
    if($(this).is(':focus')){ 

     //run code here that should only be applied when the dialog box is closed 

    } 

}); 
関連する問題