アカウント名:
パスワード:
フォームを送信しようとしたときにチェックするというのは、form の submit をフックするということですかね。それだと「JavaScriptでフォーム内容を取得し、Ajaxで送信する」タイプのページはどうなるんでしょう。ちょっと考えてみたのですが
A) form の submit 時のみチェックして警告を出す →ajaxではmaxlengthを超えたデータが送信されてしまう
B) http request 発行時に警告を出すC) JavaScriptでフォーム内容取得時に警告を出す →どちらも、そこで処理中断されることを想定していない、既存のページでは、警告を出したあとのエラー復帰ができないケースがありそう。
ってことで、JavaScriptでの処理を従来通り正常に進行させるためには、フォーム送信時ではなく、入力(ペースト)段階で「maxlengthを超えたら、そのフォームにフォーカスしたままになり、maxlength以下に収めるまで他の操作をできなくする」ようにするしかないような気がします。
maxlengthはHTMLの文字数の定義が曖昧 [github.com]&変更 [github.com]された事等が原因で、ブラウザ上の通常入力ですらアテに出来ない [github.com]物です。その為、本来ならば既存コードはフォームのmaxlengthを信用せずに対策済みなはずです。まぁ、現実は違ったりで結局不具合が起きる可能性が有りますが。しかし、今回の変更で死ぬシステムは元々運よく死んでなかっただけなので。
例えば、エイプリルフールネタになった吉野家 [it.srad.jp]ですが、maxlength=10な入力エリアに「𠮷野家」をコピペし続けた場合、IE/旧Edge:𠮷野家𠮷野家𠮷野家𠮷(10文字/14文字)新Edge/Firefox/Chrome:𠮷野家𠮷野家𠮷(7文字/10文字)と、挙動の差異が有ったりします。# Chromeの古いバージョンはIE/旧Edge側の挙動をします。# Firefoxは、BugzillaのBug 670837 - maxlength shouldn't count one non-BMP character as two characters [mozilla.org]がまとまってる?
> A) form の submit 時のみチェックして警告を出す> →ajaxではmaxlengthを超えたデータが送信されてしまう
そもそもこれは既存でも起こそうと思えば起こせるので、APIなりでチェックするのが正しいのでは?(開発者ツールでチェック外すとか。)
APIでチェックするのは勿論必須なのだけど、送信前に長さチェック出来ればできたほうが利用者にとってはありがたい。ネットワーク介さずに済む分速いからね。さらに言えば入力出来ないほうがその時点で気付けていい。
フォーカスを取るのはブラクラの基本中の基本だから、それは絶対にやっちゃダメ。
maxlengthを設定しなきゃいいだけでしょ。受け入れ態勢が整ってるなら何メガになっても問題ない。
そういう行儀悪いことをしたいんなら、わざわざそうしたい理由をちゃんとbugzillaで説明して納得させないと。「ボクの考えは説明しないし開発者の想定していない使い方をするけど、全部誰かが事前に汲み取って完璧にボクが納得するように対応し続けてくれないとヤダ」というのはただの駄々っ子。
自分でサイトを作る場合の話ではなく、既存のサイトでそういうことしてるのは結構見かける、という話です。(これは元コメに書き忘れてました。すみません)
あとは、「フォーム内容をJavaScriptで取得してAjax送信する」のが「行儀が悪い」こととは思えません。環境依存は強くなりますが、今時JavaSriptオフだと動かないサイトなんてそこら中にあるし。
「行儀の悪い」っていうのは,「フォーム内容をJavaScriptで取得してAjax送信する」ではなく,「maxlengthを超えたら、そのフォームにフォーカスしたままになり、maxlength以下に収めるまで他の操作をできなくする」というあなたの思いついた仕様案ではないだろうか?
maxlength指定なんかは、ユーザーにそれ以上は入らんよって通知する程度の目的であって、それをチェック処理の一部と捉えるのが致命的な誤り。maxlength指定したところ、それを無視したデータが送れるのは当たり前なんだから、クライアントは信用せずに、サーバー側でちゃんとやれよっていうWEBシステムの常識の話でしかない。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
クラックを法規制強化で止められると思ってる奴は頭がおかしい -- あるアレゲ人
フォーム送信時のチェックはやめて (スコア:1)
フォームを送信しようとしたときにチェックするというのは、form の submit をフックするということですかね。それだと「JavaScriptでフォーム内容を取得し、Ajaxで送信する」タイプのページはどうなるんでしょう。ちょっと考えてみたのですが
A) form の submit 時のみチェックして警告を出す
→ajaxではmaxlengthを超えたデータが送信されてしまう
B) http request 発行時に警告を出す
C) JavaScriptでフォーム内容取得時に警告を出す
→どちらも、そこで処理中断されることを想定していない、既存のページでは、警告を出したあとのエラー復帰ができないケースがありそう。
ってことで、JavaScriptでの処理を従来通り正常に進行させるためには、フォーム送信時ではなく、入力(ペースト)段階で
「maxlengthを超えたら、そのフォームにフォーカスしたままになり、maxlength以下に収めるまで他の操作をできなくする」
ようにするしかないような気がします。
Re:フォーム送信時のチェックはやめて (スコア:1)
maxlengthはHTMLの文字数の定義が曖昧 [github.com]&変更 [github.com]された事等が原因で、ブラウザ上の通常入力ですらアテに出来ない [github.com]物です。
その為、本来ならば既存コードはフォームのmaxlengthを信用せずに対策済みなはずです。
まぁ、現実は違ったりで結局不具合が起きる可能性が有りますが。
しかし、今回の変更で死ぬシステムは元々運よく死んでなかっただけなので。
例えば、エイプリルフールネタになった吉野家 [it.srad.jp]ですが、maxlength=10な入力エリアに「𠮷野家」をコピペし続けた場合、
IE/旧Edge:𠮷野家𠮷野家𠮷野家𠮷(10文字/14文字)
新Edge/Firefox/Chrome:𠮷野家𠮷野家𠮷(7文字/10文字)
と、挙動の差異が有ったりします。
# Chromeの古いバージョンはIE/旧Edge側の挙動をします。
# Firefoxは、BugzillaのBug 670837 - maxlength shouldn't count one non-BMP character as two characters [mozilla.org]がまとまってる?
Re: (スコア:0)
> A) form の submit 時のみチェックして警告を出す
> →ajaxではmaxlengthを超えたデータが送信されてしまう
そもそもこれは既存でも起こそうと思えば起こせるので、APIなりでチェックするのが正しいのでは?
(開発者ツールでチェック外すとか。)
Re: (スコア:0)
APIでチェックするのは勿論必須なのだけど、送信前に長さチェック出来ればできたほうが利用者にとってはありがたい。
ネットワーク介さずに済む分速いからね。
さらに言えば入力出来ないほうがその時点で気付けていい。
Re: (スコア:0)
フォーカスを取るのはブラクラの基本中の基本だから、それは絶対にやっちゃダメ。
maxlengthを設定しなきゃいいだけでしょ。受け入れ態勢が整ってるなら何メガになっても問題ない。
Re: (スコア:0)
そういう行儀悪いことをしたいんなら、わざわざそうしたい理由をちゃんとbugzillaで説明して納得させないと。
「ボクの考えは説明しないし開発者の想定していない使い方をするけど、全部誰かが事前に汲み取って完璧にボクが納得するように対応し続けてくれないとヤダ」というのはただの駄々っ子。
Re:フォーム送信時のチェックはやめて (スコア:1)
自分でサイトを作る場合の話ではなく、既存のサイトでそういうことしてるのは結構見かける、という話です。(これは元コメに書き忘れてました。すみません)
あとは、「フォーム内容をJavaScriptで取得してAjax送信する」のが「行儀が悪い」こととは思えません。環境依存は強くなりますが、今時JavaSriptオフだと動かないサイトなんてそこら中にあるし。
Re: (スコア:0)
「行儀の悪い」っていうのは,「フォーム内容をJavaScriptで取得してAjax送信する」ではなく,「maxlengthを超えたら、そのフォームにフォーカスしたままになり、maxlength以下に収めるまで他の操作をできなくする」というあなたの思いついた仕様案ではないだろうか?
Re: (スコア:0)
maxlength指定なんかは、ユーザーにそれ以上は入らんよって通知する程度の目的であって、それをチェック処理の一部と捉えるのが致命的な誤り。
maxlength指定したところ、それを無視したデータが送れるのは当たり前なんだから、クライアントは信用せずに、サーバー側でちゃんとやれよっていうWEBシステムの常識の話でしかない。