2016-09-08 22 views
3

ボタンをクリックしたときにdijit/popupを使用してダイアログ・ウィジェットを表示しています。以下のドキュメントでは、dijit/popupを使用してポップアップを制御する方法について説明します。次のようにDojo - エスケープ・キー・プレスでdijit/popup cancelを無効にする

https://dojotoolkit.org/reference-guide/1.10/dijit/popup.html

コードは次のとおりです。

define(["dijit/popup"], function(popup){ 
... 

// wrap the pop-up widget and position it offscreen so 
// that it can be measured by the widget’s startup method 
popup.moveOffScreen(dropDown); 

// if the pop-up has not been started yet, start it now 
if(dropDown.startup && !dropDown._started){ 
    dropDown.startup(); 
} 

// make the pop-up appear around my node 
popup.open({ 
    parent: this, 
    popup: dropDown, 
    around: this.domNode, 
    orient: ["below-centered", "above-centered"], 
    onExecute: function(){ 
     popup.close(dropDown); 
    }, 
    onCancel: function(){ 
     popup.close(dropDown); 
    }, 
    onClose: function(){ 
    } 
}); 

... 

ポップアップウィジェットは、そのキャンセルを通知するとき、またはESCときのdijit /ポップアップのデフォルトの動作は、どちらかonCancelコールバック関数を呼び出すことですがキーが押された:ときESCAP

https://dojotoolkit.org/reference-guide/1.10/dijit/popup.html#keyboard-handling

私はこの出来事を見ることができますeキーが押されていますが、ESC(またはTAB)キーを押してダイアログを閉じないようにしたいのですが、どうしたらいいですか?ユーザーがEscキーを押した結果、onCancelコールバックが実行されたときを検出するにはどうすればよいですか?

また、エスケープキーが押されたときにのみ、onCancelを呼び出すdijit/popupの防止方法を教えてください。

答えて

1

これを行うにはクリーンな方法がないようです。あなたができることは、ポップアップ/ドロップダウンのエスケープキーイベントを抑制することです。これを行うには、ポップアップが表示された後にキーハンドラを設定する必要があります。これを行うには、ポップアップを開く関数名が必要で、ポップアップ自体またはその親にアクセスする必要があります。ポップアップはDOM内のランダムな場所に配置され、ウィジェットを開いたりドロップしたりするウィジェットの子ではありません。たとえば、DateTextBoxはopenDropDown関数を呼び出してカレンダーウィジェットを開き、メンバーのdropDownに格納します。

require([ 
    "dijit/form/DateTextBox", 
    "dojo/aspect", 
    "dojo/on", 
    "dojo/keys", 
    "dojo/domReady!" 
], function(DateTextBox, aspect, on, keys){ 

    var dateBox = new DateTextBox({}); 
    aspect.after(dateBox, "openDropDown", function() { 
     on(this.dropDown, "keydown", function(event) 
     { 
      if (event.keyCode == keys.ESCAPE) 
      { 
       event.stopPropagation(); 
       event.preventDefault(); 
       return; 
      } 
     }); 
    }); 
    dateBox.placeAt("datebox"); 
    dateBox.startup(); 
}); 

あなたは、あなたのポップアップに追加機能を追加する必要があります(または既存の機能への側面)公開する:ドロップがダウンこのようなエスケープキーで閉じられないようにするには、キーイベントを抑制することができます開いた後のポップアップ(上記のスニペットのthis.dropDownに相当)。

+0

ありがとう私は私のシナリオでこれをテストする必要があります。ドロップされたウィジェットに対してESCが無視されるようにする必要がありますが、別のウィジェットの伝播を防ぐことはできません。私の場合、ArcGIS Javascript API Drawツールバーはエスケープを使用してマップ上にフィーチャーを描画しないようにしていますので、これを動作させたい、ポップアップダイアログを開いたままにしておきます。 – user2486488

+0

このロジックをイベントハンドラに追加する必要がある場合があります。つまり、stopProgation()を呼び出して描画を停止してから戻ることが必要な場合があります。 – pgianna

+0

私はこれをやろうとしましたが、マップ描画ツールからESCキーが伝播するのを防ぐことができないようですが、esriウィジェットはどのハンドラによっても傍受されないようです。ポップアップを開くと、ウィンドウ/マップ/マップレイヤーにグローバルkeydownハンドラを添付します。描画を開始してもキープレスをインターセプトしません。 – user2486488

0

簡単な方法:this.domNodeが通常のDIV要素であることを確認してください。ポップアップを表示するために、このdomNodeに接続されたonClickリスナーを作成します。このように作成されたポップアップウィンドウは、ESCボタンを無視するか、ユーザーがポップアップの周りの空白スペースをクリックするのを無視します。 popup.close(this)をポップアップから、popup.close(this.dropDown)を外側から隠す必要があります。 何も抑制/上書きする必要はありません。

+0

提案していただきありがとうございます - この作業の簡単な例がありますか?私の場合は、プログラムでポップアップを開きます。ボタンをクリックするか、地図上のリンクをクリックするとダイアログが開く必要があります。私は、直接divに添付されたポップアップを作成しようとしたが、私はエラーを取得する - Objectはプロパティまたはメソッドをサポートしていない 'isLeftToRight'ポップアップを開くときに – user2486488

関連する問題