[解決済み] htmlのformタグは何のためにあるのか
質問事項
htmlのformタグの用途がわかりません。
フォームタグを使わなくても、どんな入力タイプでも完璧に使えるんです。わざわざformタグで囲むのは冗長な気がします。
さらに、ajaxを使ってサーバーサイドのページを呼び出す場合は、単純にjQueryを使えばいいんです。唯一の例外は、アップロードスクリプトを何らかの理由でformタグに巻き付けなければならないことに気づいたことです。
では、なぜテキスト入力のような単純なものに、いまだにフォームが広く使われているのでしょうか。とても古臭く、不必要なことのように思えます。
メリットも必要性も感じられないんです。何か見落としているのかもしれません。
解決方法は?
あなたに欠けているのは、以下の理解です。 セマンティックマークアップ そしてDOM。
現実的には、HTML5マークアップでやりたいことはほとんどできますし、ほとんどのブラウザがそれを解析してくれます。前回確認したところでは、WebKit / Blink では
の中にある擬似要素です。
<input>
要素
これは明らかな仕様違反ですが、Gecko はそれほどでもありません。しかし、マークアップで好きなことをしても、セマンティクスに関する限り、間違いなく無効です。
なぜ
<input>
の中にある
<form>
要素ですか?同じ理由で、私たちは
<li>
タグの中に
<ul>
と
<ol>
要素に属しています。それは
セマンティックに
マークアップを定義するのに役立ちます。パーサー、スクリーンリーダー、およびさまざまなソフトウェアは、意味的に正しいマークアップ、つまりマークアップが構造だけでなく意味を持つ場合に、マークアップをよりよく理解することができます。
その
<form>
要素で定義することもできます。
method
と
action
属性は、フォームが送信されたときに何をすべきかをブラウザに伝えるものです。AJAXは100%カバーできるツールではないので、ウェブ開発者としては、JSがオフのときでもフォームを送信し、データを転送できるようにする、グレースフルデグラデーションを実践すべきです。
最後に、フォームがすべてDOMに正しく登録されていることを確認します。これをJavaScriptで覗き見ることができます。このページでコンソールを開き、次のように入力してみてください。
document.forms
ページ上のすべてのフォームの素敵なコレクションを得ることができます。検索バー、コメントボックス、回答ボックスなど、すべて適切なフォームです。このインターフェイスは、情報にアクセスしたり、これらの要素と対話したりするのに便利です。たとえば、フォームは シリアライズ を非常に簡単に実行できます。
ここで、読み物をご紹介します。
注
<input>
要素はフォーム以外でも使用できますが、何らかの形でデータを送信することを意図しているのであれば、フォームを使用すべきです。
これは、質問をひっくり返して答える部分です。
フォームを避けることで、どのように私の人生を難しくしているのでしょうか?
まず第一に、コンテナ要素です。誰がそんなもの必要だと言うのでしょう?
確かに、あなたの小さな
<input>
と
<button>
要素がネストしている
内部
何らかのコンテナ要素?他のものの真ん中で浮いているわけではないのです。ですから、もし
<form>
では、何でしょう?A
<div>
? A
<span>
?
これらの要素 ある マークアップがめちゃくちゃでない限り、コンテナ要素は単にフォームにすることができます。
ない?ああ。
この時点で、私の頭の中の声は、これらの様々なAJAXの状況に対して、どのようにイベントハンドラを作成しているのか、非常に興味を持っています。バイトを節約するためにマークアップを削減する必要があるのなら、たくさんあるに違いありません。それから、要素の各「セット」に対応する各AJAXイベント用のカスタム関数を作成する必要があります。これらの要素は、必要とされるまでマークアップの周りをただ歩き回り、何でもするということを確立しているので、本当に一般的にグループ化する方法はありません。
そこで、いくつかのハンドラをカスタムコードするのです。
$('#searchButton').on('click', function (e) {
e.preventDefault();
var search = $('#mySearch');
$.ajax({
url: 'http://example.com/text',
type: 'GET',
dataType: 'text',
data: 'query=' + search.val(),
success: function (data) {
console.log(data);
}
});
});
$('#login').on('click', function (e) {
e.preventDefault();
var user = $('#username'),
pass = $('#password'),
rem = $('#remember');
$.ajax({
url: 'http://example.com/login',
type: 'POST',
data: user.add(pass, rem).serialize(),
dataType: 'text',
success: function (data) {
console.log(data);
}
});
});
<!-- No containers, extra markup is silly. -->
<input type="text" id="mySearch" value="query" />
<button id="searchButton">Search</button>
<input type="text" id="username" name="username" value="user" />
<input type="password" id="password" name="password" value="pass" />
<input type="checkbox" id="remember" name="remember" checked /> stay logged in
<button id="login">Login</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
というようなことを言う部分です。
「私は再利用可能な関数を完全に使っているけどね。大げさに言うのはやめてくれ'
でも、このユニークな要素のセット、つまりターゲットクラスのセットを作る必要がありますよね?そのためには グループ をどうにかして、その要素に対応させる。
あなたの目を貸してください(スクリーンリーダーを使っていて助けが必要な場合は、耳を貸してください)。 ARIA に、この セマンティック のマークアップを行い、一般的なフォームの力を見よ。
function genericAjaxForm (e) {
e.preventDefault();
var form = $(this);
return $.ajax({
url: form.attr('action'),
type: form.attr('method'),
dataType: form.data('type'),
data: form.serialize()
});
}
$('#login-form').on('submit', function (e) {
genericAjaxForm.call(this, e).done(function (data) {
console.log(data);
});
});
<form action="http://example.com/login" method="POST" data-type="text" id="login-form">
<input type="text" name="username" value="user" />
<input type="password" name="password" value="mypass" />
<label>
<input type="checkbox" name="remember" /> Remember me
</label>
<button type="submit">Login</button>
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
これを任意の一般的なフォームで使用し、優雅な劣化を維持し、フォームの 完全に は、それがどのように機能すべきかを記述します。この基本機能を拡張するために ジェネリック のスタイルで、よりモジュール化され、頭痛の種を減らすことができます。JavaScriptは、適切な要素を隠したり、受け取ったレスポンスを処理したりと、それ自身のことを心配するだけです。
と、今度はおっしゃいますね。
「しかし、私は擬似フォームを
<div>
要素に特定の ID を指定することで、入力に緩やかなターゲットを設定することができます。
.find
と
.serialize
それら、そして......」。
え、何それ?実際にラップしているのは
<input>
要素をコンテナに入れるのですか?
では、なぜまだ形になっていないのでしょうか?
関連
-
Vueの要素ツリーコントロールに破線を追加する説明
-
vueのプロジェクトでモックを使用する方法を知っていますか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] Webフォームのフィールド/入力タグでブラウザのオートコンプリートを無効にするにはどうすればよいですか?
-
[解決済み] HTMLのid属性に有効な値は何ですか?
-
[解決済み】なぜHTMLは "chucknorris "を色と見なすのか?
-
[解決済み】JavaScript版sleep()とは?)
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vueがechartsのtooltipにクリックイベントを追加するケーススタディ
-
Vue Element-uiは、アイコンを追加するためのツリーコントロールノードを詳細に実装しています。
-
Vueの要素ツリーコントロールに破線を追加する説明
-
Vue+ElementUIによる大規模なフォームの処理例
-
vue ディレクティブ v-html と v-text
-
Vueのフィルタの説明
-
[解決済み】最大呼び出しスタックサイズ超過エラー
-
[解決済み] TypeError: $.ajax(...) is not a function?
-
[解決済み】JavaScriptでインラインIF文の書き方は?
-
JavaScriptのgetElementById()メソッド入門