class ImputSomethingWithConfirm extends React.Component { constructor(props) { super(props); this.state = { input_state:false }; } onfocus(e){ let result = confirm(`変更しようとしています。 よろしければ「OK」を押してください。 変更を意図していない場合(間違いの場合) 「キャンセル」→「完了」を押してください。`); if( result ) { this.setState({input_state:true}); } else { this.setState({input_state:false}); } } onblur(e){ this.setState({input_state:false}); } render(){ return ( <div> {this.state.input_state ? <div> <p className="input_label">{this.props.name_of_button}(入力OK)</p>:<input type="text" className="input" name={this.props.nog} onChange={this.props.onClick} onBlur={(e)=>this.onblur(e)}/><p className="input_label">{this.props.name_of_unit}</p> </div> : <div> <p className="input_label">{this.props.name_of_button}(入力NG)</p>:<input type="text" className="input" name={this.props.nog} onChange={this.props.onClick} onFocus={(e)=>this.onfocus(e)}/><p className="input_label">{this.props.name_of_unit}</p> </div> } </div> ) } }
React.jsで入力ボックスコンポーネントなんですが、onFocus時にconfirm関数で、入力値を変更しようとしていることをユーザに知らせる(確認を促す)ものを作りたいです。
とりあえず作ってみたのが↑です。
最初はstate.input_stateがfalseなのでonFocus時にconfirm関数により注意ダイアログが出る入力ボックス(入力NGの方)を表示。ダイアログでOKを押すとstate.input_stateがtrueにセットされ、ダイアログが出ない(入力可能な)入力ボックス(入力OKの方)が表示される。
入力後onBlur時にstate.input_stateをfalseにして、次のonFocus時には注意ダイアログが出るようにする。
という感じです。これでスマホのchromeだとおおむね期待通りの動きなのですが、safariで動かしてみると、
入力しようとする(onFocus)→ダイアログ出現→ダイアログで「OK」を押す→ダイアログ消える、しかし表示されるのは注意ダイアログが出る入力ボックス(入力NGの方)→入力しようとする→ダイアログ出現→以下ループ
となり、いつまでたっても入力できません。
原因がわかりません。当たり前なのだと思いますが、簡単なコードで、safariでもconfirmのダイアログでOKを押したらtrueが返されるのは確認しました。
あとブラウザの仕様が原因、ということだとconfirmを使わない別の方法を考える、ということになるでしょうか?何かこういう感じの既成コンポーネントとかありますでしょうか?

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/31 07:16
2019/08/31 07:30