2017-05-05 6 views
0

私はctrl-x/vを編集アプリケーション用に実装しようとしています(テキストではなく、画面上に描写されたものなので、ブラウザのコピー/貼り付けは使用できません)。取り扱いCtrl + <...>基本以外のキーコード

それはすべて、以下の設定で働いている:

  • KeyDownイベントメッセージ - キーボードライブラリによってトリガは - model.ctrlPressed toTrue(たKeyCode 17上)
  • にこれを逆にするkeyUpイベントハンドラを設定します。

しかし、それは私が離れてクリックしたときに、私は、CTRLボタンを押すことができますいくつかの時間が発生しているし、その後KeyUpはエルムに渡されることはありませんし、model.ctrlPressedが間違った状態で立ち往生。

私はPageVisibilityライブラリを試しました。Hiddenサブスクリプションでは、私はctrlPressedをFalseに設定しました。これは、ブラウザやスイッチのタブを最小限に抑えるだけで、デベロッパーコンソールをクリックしたときにCtrlキーを押しているインスタンスでは役に立ちません。

おそらくこれは開発中に実際に起こるエラーですが、私はそのリスクを冒すつもりはありません。誰もがこれの方法のための提案を持っていますか?

答えて

0

document.hasFocus()が必要です。イベントは発生しませんが、ポーリングする必要があります。

ここでは一例(run)です:

port module Main exposing (..) 

import Html as H exposing (Html) 
import Time 


port focusStateRequest :() -> Cmd msg 


port focusStateResponse : (Bool -> msg) -> Sub msg 


type alias Model = 
    { windowFocused : Bool } 


type Msg 
    = FocusStateRequest 
    | FocusStateResponse Bool 


main : Program Never Model Msg 
main = 
    H.program 
     { init = init 
     , update = update 
     , view = view 
     , subscriptions = subscriptions 
     } 


init : (Model, Cmd Msg) 
init = 
    ({ windowFocused = True } 
    , Cmd.none 
    ) 


update : Msg -> Model -> (Model, Cmd Msg) 
update msg model = 
    case msg of 
     FocusStateRequest -> 
      (model 
      , focusStateRequest() 
      ) 

     FocusStateResponse isFocused -> 
      -- reset your ctrlPressed here if False 
      ({ model | windowFocused = isFocused } 
      , Cmd.none 
      ) 


view : Model -> Html Msg 
view model = 
    model 
     |> toString 
     |> H.text 


subscriptions : Model -> Sub Msg 
subscriptions model = 
    Sub.batch 
     [ Time.every (500 * Time.millisecond) (\_ -> FocusStateRequest) 
     , focusStateResponse FocusStateResponse 
     ] 

そして、JS側:

var app = Elm.Main.fullscreen(); 

app.ports.focusStateRequest.subscribe(function() { 
    var hasFocus = document.hasFocus(); 
    app.ports.focusStateResponse.send(hasFocus); 
}); 
関連する問題