- ベストアンサー
formで特定のinputを送信しないようにしたい
複数のinputを送信時に値をフォーマットに従ってまとめて送信するとき そのもととなった複数のinputは送信しないようにしたいです (郵便番号など入力欄を二つにわけるが送信時は一つにまとめるなど) nameを付けないという方法も考えましたが radioを含む場合に不都合なのでこの方法はとりたくありません また送信時にinputを削除するという方法も ajaxで元のページにとどまることも考えうるので この方法もとりたくありません 理想はinputに特定の属性値を与えると form送信時に送信しないようになる とかだったのですがその方法は見つけられませんでした クライアントサイドでの処理が難しそうなら サーバーサイドでの処理にしますが できれば避けたいと思っています よろしくお願いします
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
できないです。 そもそもCGI側に渡すための物ですから (郵便番号など入力欄を二つにわけるが送信時は一つにまとめるなど) 入力ページから送信された物は一旦CGI側で、 $postcode="120-1135"; とかになって、 <input type="hiidden" name="zip-code" value="120-1135"> ・・・・・ <th>郵便番号</th><td class="zip-code">120-1135</td> とtableか、 <input type="text" name="zip-a" value="120" readonly>-<input type="text" name="zip-b" value="1135" readonly> とかの再フォーになっているはず。 <input type="text" name="zip-a" value="120">-<input type="text" name="zip-b" value="1135"> で修正を受け付けても良い。 >クライアントサイドでの処理が難しそうならサーバーサイドでの処理にしますができれば避けたいと思っています これ、根本的に間違っています。 javascriptなどはユーザー側に制約されるので、可能な限り楽な方法--CGI側で処理すべきです。そのほうが楽です。
その他の回答 (3)
- Ogre7077
- ベストアンサー率65% (170/258)
そもそもサーバー側の正しいあり方として 「関係のないデータは無視する」のはずなので、 無関係なデータを送信しても、なんの問題もないとは思うのですが。 サーバー側で何とかするならば 処理に関係ない入力欄の name を notdata_ で始まる命名とする サーバー側で notdata_ で始まる引数は処理しない汎用ルールを追加 例) 郵便区番号: notdata_postalcode3 クライアント側で何とかするならば // フォームをDOM上で生成して値を設定して送信して即廃棄する方法 // 通常通り画面遷移して、元のフォームも汚さない 元のフォーム.addEventListener('submit', function(event){ var data = フォームの値を読み取る(元のフォーム); var form = document.createElement('form'); form.action = 元のフォーム.action; form.method = 元のフォーム.method; for (var name in data) { var hidn = form.appendChild(document.createElement('input')); hidn.type = 'hidden'; hidn.name = name; hidn.value = data[name]; // TODO:複数選択可能なリスト入力に対応 } form.submit(); }, false);
お礼
回答ありがとうございます サーバー側は配列で渡された入力値を foreachで回してキー値によって処理を変える というような処理をしているため 要らないデータがあると処理に支障を 来たす可能性があるため避けたかったのです しかし結論としてはNo.4様に述べた様にしたため そもそもこういうことはしなくていいことになりました ありがとうございました
- yambejp
- ベストアンサー率51% (3827/7415)
特定のformをsubmitする際に、処理を奪って 別のformを強制でつくり必要なデータを移したうえでそのformをsubmitする ・・・とか、やりようはありますが、結局disabledを利用するのと たいして変わりません。 おそらく命題自体に無理があるので「できない」というのが回答でしょう
- yambejp
- ベストアンサー率51% (3827/7415)
>クライアントサイドでの処理が難しそうなら >サーバーサイドでの処理にしますが >できれば避けたいと思っています 難しくはないですが、結局クライアントで処理したものは サーバー側でチェックするのでサーバーサイドの処理は必須ですよ 送りたくないだけであればsubmitするときに該当するinputにdisabledを つけてやればいいでしょう。 ただしブラウザの戻るボタン対策を考えるとonload時にdisabledをクリア してやる必要があるかもしれません いずれにしても本質的には解決しませんし、この手の処理はやらない方がいいと思います
お礼
回答ありがとうございます jqueryMobile上のフォームで ajaxで送信することにもなるので やはり提案いただいた方法も 要素を削除するのと同様、避けたい方法です 申し訳ありません
補足
サーバサイドで処理するのを避けたいのは 送る先のプログラムが様々なところで 共通で使うものなので イレギュラーな処理をなるべく 入れたくないという理由です 様々な場所で共通で使うプログラムに入れるほど このイレギュラー処理が汎用性があるのか という疑問ゆえにクライアントサイドで 処理するのが望ましいと考えいています
お礼
回答ありがとうございます よくよく考えると入力されDBに保存された値から 逆算してフォームに自動入力しなきゃいけないことなどもあって 入力値とフォームの値が一致しないのは不都合の方が多く DBには複数のフォームの入力値は そのまま別々に保存して出力等の処理で合成処理をする形を とるようにするのが一番良いと結論しました 今回の用途としてはCMSの投稿記事のタイトルを 必ず特定のフォーマットで入力させたいというもので DBにパーツ毎に別々に置いておくということはできないものだったのですが タイトルを特定のフォーマットに従わせることには汎用性があると判断し タイトルの元になる複数の情報を別個にDBに置き 投稿時、編集時にその値を利用してタイトルを生成して DBの記事タイトルとして保存するという処理を 共通処理に追加することにしました