質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

3697閲覧

バリデーション前にセルの値を変更する方法

koh1

総合スコア12

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/09/21 12:22

javascriptのライブラリ「handsontable」を使用しています。
https://handsontable.com/

ユーザーが数値入力用のセル(validator:/^[0-9]+$/)に全角数字を入力したとき、バリデーション前に半角に直したいと思っています。

beforeValidate, beforeChange などがあるようなので、試してみましたが上記のように動作しません。

値を半角に変更し、バリデーションエラーにしない方法はあるのでしょうか。

以下、試した内容です。

  • beforeValidateを試したコード(セルの値が変わらず、バリデーションエラーになる)
beforeValidate:(val, row, prop, source) => { if (source == 'custom.beforeValidate') return; var conv = new MyConverter(val); table.setDataAtCell(0, 0, conv.toHankakuString(), 'custom.beforeValidate'); }
  • beforeChangeを試したコード(セルの値は変わるがバリデーションエラーになる)
beforeChange:(changes, source) => { $.each(changes, (idx, chg)=>{ var conv = new MyConvert(chg[3]); chg[3] = conv.toHankakuString(); }); },

初歩的なことかもしれませんが、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun68ykt

2018/09/21 12:26

こんにちは。MyConverter のソースコードもご質問に載せて頂くとよろしいかもしれません。
m.ts10806

2018/09/21 13:15

バリデーションの意味なくなりますけどそれでいいのでしょうか。
spookybird

2018/09/21 13:25

全角数字は自動で半角数字になおしたい、でも数字以外ははじきたい、という意図かなと推察します
koh1

2018/09/21 14:54

意図としては、spookybirdさんの言われる通り、 「数字を半角にしたい」&「数字であるチェックは行いたい」ということです。年齢の入力欄などを想定しています。
koh1

2018/09/21 14:54

MyConverterあたりは実際の記述と異りまして、単純に半角にしている処理とお考え下さい。
guest

回答2

0

ベストアンサー

beforeValidatereturnした値でバリデーションチェックかけるらしいですよ。

https://github.com/handsontable/handsontable/issues/3181#issuecomment-179361152

ただしここでreturnしたからといって、セルの値が実際に変更されることにはならないっぽいです。
あくまでバリデーションかけるためだけの変更です。

なので、table.setDataAtCellとやってるところはそのまま残しといて、ついでにreturnしとけばOKだと思います。
たぶん。

使ったことなくてドキュメント読んでるだけなので間違ってたらすみません。

投稿2018/09/21 13:23

spookybird

総合スコア1803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koh1

2018/09/21 14:55

ご回答ありがとうございます。 ご指摘の通り、バリデーションさせる値はbeforeValidate内でreturnが必要でした。 ただ、値の変更については、beforeValidate内のtable.setDataAtCellではできませんでしたので、beforeChange内でも値の変更処理が必要なようです。 beforeValidateとbeforeChangeの2か所で変換処理が必要になってしまいます。 一旦はこれで対応しようと思いますが、もう少しシンプルな方法はないものでしょうか。
spookybird

2018/09/22 01:10

ないと思いますよー。
koh1

2018/09/22 01:41

ありがとうございます。
guest

0

バリデーションの前に変換をするということは何もチェックしないということですから
inputイベントを監視して、常に全角→半角処理をし、変換前と変換後が違う場合は
強制的に書き換えることになるでしょう。

投稿2018/09/21 12:29

yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koh1

2018/09/21 14:56

ご回答ありがとうございます。 inputイベント監視についても、検討してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問