Purescriptハロゲンは、フォームの外部で入力検証を手動でトリガーします

Sandoichi

required属性でマークした入力フィールドがありますが、検証チェックをトリガーする方法がわかりません(フォーム内で作業していないため、デフォルトの送信ボタンアクションを使用しても機能しません)。

クイック追跡検索では、コアhtml要素タイプの多くの有効性関数が示されていますが、これらをハロゲンに適用する方法がわかりません。

DOM効果をトリガーして、ページで必要なすべての入力をチェックし、結果を返す方法はありますか?

これが私が達成しようとしていることを示すサンプルコンポーネントです

import Prelude

import Data.Maybe (Maybe(..))
import Halogen as H
import Halogen.HTML as HH
import Halogen.HTML.Events as HE
import Halogen.HTML.Properties as HP

data Message = Void

type State =
  { textValue :: String
  , verified :: Boolean
  }

data Query a = ContinueClicked a | InputEntered String a

inputHtml :: State -> H.ComponentHTML Query
inputHtml state =
  HH.div [ HP.class_ $ H.ClassName "input-div" ]
         [ HH.label_ [ HH.text "This is a required field" ]
         , HH.input [ HP.type_ HP.InputText
                    , HE.onValueInput $ HE.input InputEntered
                    , HP.value state.textValue
                    , HP.required true
                    ]
         , HH.button [ HE.onClick $ HE.input_ ContinueClicked ]
                     [ HH.text "Continue"]
         ]

verifiedHtml :: H.ComponentHTML Query
verifiedHtml =
  HH.div_ [ HH.h3_ [ HH.text "Verified!" ] ]

render :: State -> H.ComponentHTML Query
render state = if state.verified then verifiedHtml else inputHtml state

eval :: forall m. Query ~> H.ComponentDSL State Query Message m
eval = case _ of
  InputEntered v next -> do
    H.modify $ (_ { textValue = v })
    pure next
  ContinueClicked next -> do
    let inputValid = false -- somehow use the required prop to determine if valid
    when inputValid $ H.modify $ (_ { verified = true })
    pure next

initialState :: State
initialState =
  { textValue : ""
  , verified : false
  }

component :: forall m. H.Component HH.HTML Query Unit Message m
component =
  H.component
    { initialState: const initialState
    , render
    , eval
    , receiver: const Nothing
    }
ジョーダンマッキー

HTMLフォームの検証に依存することが、ハロゲンアプリケーション内の入力をチェックする最も効果的な方法ではないと思います。しかし、私はあなたがあなたの理由を持っていると仮定し、とにかく答えを提示します。


まず最初に、DOM要素を処理する場合は、それらを取得する方法が必要です。これがのpurescriptバージョンですdocument.getElementById

getElementById
    :: forall a eff
     . (Foreign -> F a)
    -> String
    -> Eff (dom :: DOM | eff) (Maybe a)
getElementById reader elementId =
    DOM.window
        >>= DOM.document
        <#> DOM.htmlDocumentToNonElementParentNode
        >>= DOM.getElementById (wrap elementId)
        <#> (_ >>= runReader reader)

runReader :: forall a b. (Foreign -> F b) -> a -> Maybe b
runReader r =
    hush <<< runExcept <<< r <<< toForeign

(今のところ、新しいインポートについて心配する必要はありません。最後に完全なモジュールがあります)

このgetElementById関数は、返される要素のタイプを判別するためのread*関数(おそらくからDOM.HTML.Types)と、文字列としての要素IDを受け取ります。

これを使用するには、次のプロパティを追加する必要がありますHH.input

HH.input [ HP.type_ HP.InputText
         , HE.onValueInput $ HE.input InputEntered
         , HP.value state.textValue
         , HP.required true
         , HP.id_ "myInput"  <-- edit
         ]

余談ですが、Showインスタンスを含む合計型は、あらゆる場所で文字列IDをハードコーディングするよりも安全です。それはあなたにお任せします。

涼しい。次にContinueClickedeval関数のブランチからこれを呼び出す必要があります

ContinueClicked next ->
    do maybeInput <- H.liftEff $
            getElementById DOM.readHTMLInputElement "myInput"
    ...

これは私たちMaybe HTMLInputElementに遊ぶことを与えます。そして、それは私たちが求めている情報を持っているタイプのプロパティをHTMLInputElement持っているはずです。validityValidityState

DOM.HTML.HTMLInputElementvalidityそのプロパティへのアクセスを提供する機能があります。次に、必要なデータを取得するために、外部値の操作を行う必要があります。簡単にするために、validフィールドを引き出してみましょう

isValid :: DOM.ValidityState -> Maybe Boolean
isValid =
    runReader (readProp "valid" >=> readBoolean)

そして、その小さなヘルパーで、ContinueClickedブランチを終了できます

ContinueClicked next ->
    do maybeInput <- H.liftEff $
            getElementById DOM.readHTMLInputElement "myInput"

       pure next <*
       case maybeInput of
            Just input ->
                do validityState <- H.liftEff $ DOM.validity input
                   when (fromMaybe false $ isValid validityState) $
                        H.modify (_ { verified = true })
            Nothing ->
                H.liftEff $ log "myInput not found"

そしてそれをすべてまとめると...

module Main where

import Prelude

import Control.Monad.Aff (Aff)
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Console (CONSOLE, log)
import Control.Monad.Except (runExcept)

import Data.Either (hush)
import Data.Foreign (Foreign, F, toForeign, readBoolean)
import Data.Foreign.Index (readProp)
import Data.Maybe (Maybe(..), fromMaybe)
import Data.Newtype (wrap)

import DOM (DOM)
import DOM.HTML (window) as DOM
import DOM.HTML.HTMLInputElement (validity) as DOM
import DOM.HTML.Types
    (ValidityState, htmlDocumentToNonElementParentNode, readHTMLInputElement) as DOM
import DOM.HTML.Window (document) as DOM
import DOM.Node.NonElementParentNode (getElementById) as DOM

import Halogen as H
import Halogen.Aff as HA
import Halogen.HTML as HH
import Halogen.HTML.Events as HE
import Halogen.HTML.Properties as HP
import Halogen.VDom.Driver (runUI)

main :: Eff (HA.HalogenEffects (console :: CONSOLE)) Unit
main = HA.runHalogenAff do
    body <- HA.awaitBody
    runUI component unit body

type Message
    = Void

type Input
    = Unit

type State
    = { textValue    :: String
      , verified     :: Boolean
      }

data Query a
    = ContinueClicked a
    | InputEntered String a

component
    :: forall eff
     . H.Component HH.HTML Query Unit Message (Aff (console :: CONSOLE, dom :: DOM | eff))
component =
    H.component
        { initialState: const initialState
        , render
        , eval
        , receiver: const Nothing
        }

initialState :: State
initialState =
  { textValue : ""
  , verified : false
  }

render :: State -> H.ComponentHTML Query
render state =
    if state.verified then verifiedHtml else inputHtml
  where
    verifiedHtml =
        HH.div_ [ HH.h3_ [ HH.text "Verified!" ] ]

    inputHtml =
        HH.div
            [ HP.class_ $ H.ClassName "input-div" ]
            [ HH.label_ [ HH.text "This is a required field" ]
            , HH.input
                [ HP.type_ HP.InputText
                , HE.onValueInput $ HE.input InputEntered
                , HP.value state.textValue
                , HP.id_ "myInput"
                , HP.required true
                ]
            , HH.button
                [ HE.onClick $ HE.input_ ContinueClicked ]
                [ HH.text "Continue" ]
             ]

eval
    :: forall eff
     . Query
    ~> H.ComponentDSL State Query Message (Aff (console :: CONSOLE, dom :: DOM | eff))
eval = case _ of
    InputEntered v next ->
        do H.modify (_{ textValue = v })
           pure next

    ContinueClicked next ->
        do maybeInput <- H.liftEff $
                getElementById DOM.readHTMLInputElement "myInput"

           pure next <*
           case maybeInput of
                Just input ->
                    do validityState <- H.liftEff $ DOM.validity input
                       when (fromMaybe false $ isValid validityState) $
                            H.modify (_ { verified = true })
                Nothing ->
                    H.liftEff $ log "myInput not found"

getElementById
    :: forall a eff
     . (Foreign -> F a)
    -> String
    -> Eff (dom :: DOM | eff) (Maybe a)
getElementById reader elementId =
    DOM.window
        >>= DOM.document
        <#> DOM.htmlDocumentToNonElementParentNode
        >>= DOM.getElementById (wrap elementId)
        <#> (_ >>= runReader reader)

isValid :: DOM.ValidityState -> Maybe Boolean
isValid =
    runReader (readProp "valid" >=> readBoolean)

runReader :: forall a b. (Foreign -> F b) -> a -> Maybe b
runReader r =
    hush <<< runExcept <<< r <<< toForeign

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Angular 2の入力検証を手動でトリガーする方法は?

分類Dev

Reactフォームはすべての入力でボタンonClickをトリガーします

分類Dev

MVPアプローチを使用して、コントロールが動的であるユーザーフォーム入力を検証します

分類Dev

Reactでフォームの送信イベントを手動でトリガーしても、必要な入力がチェックされません

分類Dev

入力値をプログラムで設定すると、フォームが検証をトリガーしない

分類Dev

入力iPhoneの問題に手動でフォーカスをトリガー

分類Dev

入力フィールドのAngularデータバインディングを手動でトリガーします(単体テストの目的でのみ)

分類Dev

デフォルトのコンストラクターなしでカスタムバリデーターを使用して手動で検証する

分類Dev

デフォルトのコンストラクターなしでカスタムバリデーターを使用して手動で検証する

分類Dev

インライン検証手法、フォームの最後の入力を検証する方法は?

分類Dev

VeeValidateは動的フォームからの入力を検証しません

分類Dev

スプリング検証を手動でトリガーする方法は?

分類Dev

jQuery検証で検証を手動でトリガーする方法は?

分類Dev

onClickまたはonChangeonチェックボックスでフォーム入力をトリガーします

分類Dev

React Hooksフォーム検証OnBlurは、特定のフィールドだけでなく、すべてのフィールドをトリガーします

分類Dev

ブラウザDevToolsを介してサードパーティサイトで入力フォームの検証をトリガーするにはどうすればよいですか?

分類Dev

AngularReactiveFormはプログラムで検証をトリガーします

分類Dev

Angular 5で事前入力されたデータを使用してフォームコントロールを検証する方法は?

分類Dev

Jquery検証は、フォームが生成されると、各入力のルールを動的に追加します

分類Dev

控えめな検証をMVCフォームに手動で追加します

分類Dev

フォームなしでlaravel5コントローラー内のデータベースに手動でデータを挿入します

分類Dev

ボタン(送信しない)をクリックするか、フォームに入力する際のYIIでのクライアント側の検証

分類Dev

手動でぼかしイベントを追跡せずに、フォーム入力をBackbone.jsのモデルにバインドできますか?

分類Dev

javascriptは、特定の順序で数字、アルファベット、特殊文字を使用してフォーム入力を検証しますか?

分類Dev

C#より良い練習は何ですか?プロパティを介して、またはクリック(追加)イベントでフォーム入力を検証する

分類Dev

Yii2:フォーム/モデル入力でXSS(クロスサイトスクリプティング)を検証する方法は?

分類Dev

HTML入力に対するブラウザのデフォルトのホバー効果をプログラムでトリガーします

分類Dev

手動でトリガーすると、Jqueryフォーム送信イベントが機能しません

分類Dev

Ant Designフォームでカスタム入力コントロールの検証が適切に行われないのはなぜですか?

Related 関連記事

  1. 1

    Angular 2の入力検証を手動でトリガーする方法は?

  2. 2

    Reactフォームはすべての入力でボタンonClickをトリガーします

  3. 3

    MVPアプローチを使用して、コントロールが動的であるユーザーフォーム入力を検証します

  4. 4

    Reactでフォームの送信イベントを手動でトリガーしても、必要な入力がチェックされません

  5. 5

    入力値をプログラムで設定すると、フォームが検証をトリガーしない

  6. 6

    入力iPhoneの問題に手動でフォーカスをトリガー

  7. 7

    入力フィールドのAngularデータバインディングを手動でトリガーします(単体テストの目的でのみ)

  8. 8

    デフォルトのコンストラクターなしでカスタムバリデーターを使用して手動で検証する

  9. 9

    デフォルトのコンストラクターなしでカスタムバリデーターを使用して手動で検証する

  10. 10

    インライン検証手法、フォームの最後の入力を検証する方法は?

  11. 11

    VeeValidateは動的フォームからの入力を検証しません

  12. 12

    スプリング検証を手動でトリガーする方法は?

  13. 13

    jQuery検証で検証を手動でトリガーする方法は?

  14. 14

    onClickまたはonChangeonチェックボックスでフォーム入力をトリガーします

  15. 15

    React Hooksフォーム検証OnBlurは、特定のフィールドだけでなく、すべてのフィールドをトリガーします

  16. 16

    ブラウザDevToolsを介してサードパーティサイトで入力フォームの検証をトリガーするにはどうすればよいですか?

  17. 17

    AngularReactiveFormはプログラムで検証をトリガーします

  18. 18

    Angular 5で事前入力されたデータを使用してフォームコントロールを検証する方法は?

  19. 19

    Jquery検証は、フォームが生成されると、各入力のルールを動的に追加します

  20. 20

    控えめな検証をMVCフォームに手動で追加します

  21. 21

    フォームなしでlaravel5コントローラー内のデータベースに手動でデータを挿入します

  22. 22

    ボタン(送信しない)をクリックするか、フォームに入力する際のYIIでのクライアント側の検証

  23. 23

    手動でぼかしイベントを追跡せずに、フォーム入力をBackbone.jsのモデルにバインドできますか?

  24. 24

    javascriptは、特定の順序で数字、アルファベット、特殊文字を使用してフォーム入力を検証しますか?

  25. 25

    C#より良い練習は何ですか?プロパティを介して、またはクリック(追加)イベントでフォーム入力を検証する

  26. 26

    Yii2:フォーム/モデル入力でXSS(クロスサイトスクリプティング)を検証する方法は?

  27. 27

    HTML入力に対するブラウザのデフォルトのホバー効果をプログラムでトリガーします

  28. 28

    手動でトリガーすると、Jqueryフォーム送信イベントが機能しません

  29. 29

    Ant Designフォームでカスタム入力コントロールの検証が適切に行われないのはなぜですか?

ホットタグ

アーカイブ