Apa tujuan dari tag formulir html

107

Saya tidak mengerti tujuan dari tag formulir di html.

Saya dapat dengan mudah menggunakan jenis input apa pun dengan sempurna tanpa menggunakan tag formulir. Tampaknya berlebihan untuk membungkusnya di sekitar input.

Selain itu, jika saya menggunakan ajax untuk memanggil halaman sisi server, saya cukup menggunakan jQuery untuk itu. Satu-satunya pengecualian adalah saya perhatikan bahwa Anda harus membungkus skrip unggahan di sekitar tag formulir karena beberapa alasan.

Jadi mengapa formulir masih banyak digunakan untuk hal-hal sederhana seperti input teks? Sepertinya hal yang sangat kuno dan tidak perlu dilakukan.

Saya hanya tidak melihat manfaat atau kebutuhannya. Mungkin aku melewatkan sesuatu.

D-Marc
sumber
Bagaimana Anda menentukan tindakan dan metode untuk formulir Anda tanpa tag html <form>?
Darian
3
Jika saya melakukannya di jQuery, saya akan menggunakan fungsi click () pada tombol dan di dalamnya saya akan menggunakan fungsi ajax (). Jauh lebih sederhana dan lebih mudah untuk membaca kode menurut saya. Dan saya dapat dengan mudah menyegarkan halaman dengan javascript sederhana
D-Marc
24
Saya terkejut bahwa pertanyaan ini mendapatkan suara negatif. Saya benar-benar baru saja mencari di Google ini.
dwjohnston
2
@dwjohnston Anda pasti baru di sini ...
Stefano Borini
3
Pertanyaan bagus! Alasan lain saya tidak suka menggunakan formulir termasuk fakta bahwa itu membatasi struktur halaman Anda (karena Anda tidak dapat memiliki formulir di dalam formulir), beberapa kebiasaan serialisasi seperti fakta bahwa kotak centang akan diabaikan jika tidak dicentang (artinya sering kali saya berakhir menyiapkan data pengiriman secara manual), dan karena HTML pada dasarnya adalah konten dan struktur halaman, sedangkan JS adalah dinamisme. Elemen formulir sedikit tumpang tindih pada pekerjaan JS, dan saya ingin halaman saya terstruktur.
3snoW

Jawaban:

93

Apa yang Anda lewatkan adalah pemahaman tentang markup semantik , dan DOM.

Secara realistis, Anda dapat melakukan apa saja yang Anda inginkan dengan markup HTML5, dan sebagian besar browser akan menguraikannya. Terakhir kali saya memeriksa, WebKit / Blink bahkan mengizinkan pseudo-elemen di dalam <input>elemen , yang jelas merupakan pelanggaran spesifikasi - Gecko tidak terlalu banyak. Namun, melakukan apa pun yang Anda suka dengan markup Anda pasti akan membatalkannya sejauh menyangkut semantik.

Mengapa kita menempatkan <input>elemen di dalam <form>elemen? Untuk alasan yang sama kami menempatkan <li>tag di dalam <ul>dan <ol>elemen - itu tempatnya. Ini benar secara semantik , dan membantu untuk menentukan markup. Pengurai, pembaca layar, dan berbagai perangkat lunak dapat lebih memahami markup Anda saat markup itu benar secara semantik - bila markup memiliki makna, bukan hanya struktur.

The <form>Elemen juga memungkinkan Anda untuk menentukan methoddan actionatribut yang memberitahu browser apa yang harus dilakukan ketika formulir dikirimkan. AJAX bukanlah alat cakupan 100%, dan sebagai pengembang web Anda harus mempraktikkan degradasi yang anggun - formulir harus dapat dikirim, dan data ditransfer, bahkan ketika JS dimatikan.

Akhirnya, semua formulir terdaftar dengan benar di DOM. Kita bisa mengintip ini dengan JavaScript. Jika Anda membuka konsol Anda di halaman ini, dan ketik:

document.forms

Anda akan mendapatkan koleksi bagus dari semua formulir di halaman. Bilah pencarian, kotak komentar, kotak jawaban - semua formulir yang sesuai. Antarmuka ini dapat berguna untuk mengakses informasi, dan berinteraksi dengan elemen-elemen ini. Misalnya, formulir dapat dibuat berseri dengan sangat mudah.

Berikut beberapa bahan bacaan:

Catatan: <input>elemen dapat digunakan di luar formulir, tetapi jika niat Anda adalah mengirimkan data dengan cara apa pun, Anda harus menggunakan formulir.


Ini adalah bagian dari jawaban di mana saya membalik pertanyaan itu.

Bagaimana saya membuat hidup saya lebih sulit dengan menghindari formulir?

Pertama dan terpenting - elemen wadah. Siapa yang butuh mereka, kan ?!

Tentu saja elemen kecil <input>dan Anda <button>bersarang di dalam semacam elemen kontainer? Mereka tidak bisa hanya mengambang di tengah-tengah hal lainnya. Jadi jika bukan a <form>, lalu apa? A <div>? A <span>?

Elemen-elemen ini harus berada di suatu tempat, dan kecuali markup Anda kacau balau, elemen penampung hanya bisa menjadi bentuk.

Tidak? Oh.

Pada titik ini, suara di kepala saya sangat ingin tahu tentang bagaimana Anda membuat penangan acara untuk semua situasi AJAX yang berbeda ini. Harus ada banyak, jika Anda perlu mengurangi markup Anda untuk menghemat byte. Kemudian Anda harus membuat fungsi kustom untuk setiap acara AJAX yang sesuai dengan setiap 'set' elemen - yang harus Anda targetkan secara individual atau dengan kelas, bukan? Tidak ada cara untuk benar-benar mengelompokkan elemen-elemen ini secara umum, karena kami telah menetapkan bahwa mereka hanya berkeliaran di sekitar markup, melakukan apa pun sampai dibutuhkan.

Jadi, Anda membuat kode khusus untuk beberapa penangan.

$('#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>

Ini adalah bagian saat Anda mengatakan sesuatu seperti:

'Saya benar-benar menggunakan fungsi yang dapat digunakan kembali. Berhenti melebih-lebihkan. '

Cukup adil, tetapi Anda masih perlu membuat kumpulan elemen unik ini, atau kumpulan kelas target, bukan? Anda masih harus mengelompokkan elemen-elemen ini.

Pinjamkan saya mata Anda (atau telinga, jika Anda menggunakan pembaca layar dan membutuhkan bantuan - untungnya kita bisa menambahkan beberapa ARIA ke semua markup semantik ini , bukan?), Dan lihatlah kekuatan bentuk generik.

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>

Kita dapat menggunakan ini dengan bentuk umum apa pun, mempertahankan degradasi anggun kita, dan membiarkan formulir tersebut sepenuhnya menjelaskan bagaimana seharusnya fungsinya. Kami dapat mengembangkan fungsionalitas dasar ini sambil mempertahankan gaya umum - lebih modular, lebih sedikit sakit kepala. JavaScript hanya mengkhawatirkan hal-hal sendiri, seperti menyembunyikan elemen yang sesuai, atau menangani tanggapan apa pun yang kita dapatkan.

Dan sekarang Anda berkata:

'Tapi saya membungkus bentuk semu saya dalam <div>elemen yang memiliki ID spesifik - saya kemudian dapat menargetkan input secara longgar dengan .find, dan .serializemereka, dan ...'

Oh, apa itu? Anda benar-benar membungkus <input>elemen Anda dalam wadah?

Jadi mengapa belum berbentuk bentuk?

Oka
sumber
3
Itu poin yang bagus dengan mengintip semua bentuk. Saya dapat melihat mengapa hal itu dipandang sebagai keuntungan. Selain itu, mengapa Anda mengatakan bahwa input harus digunakan di dalam formulir? Tampaknya tidak memberikan keuntungan nyata. Hanya kode tambahan. Saya tidak pernah membaca apa pun secara online yang mengatakan bahwa menempatkan masukan di luar formulir adalah salah secara semantik, jadi menurut saya tidak adil untuk membandingkannya dengan uls dan ols. Dan secara realistis, saya tidak ingin ada orang yang menggunakan situs web saya jika javascriptnya dimatikan. Ditambah itu mungkin hanya akan mencapai 1% dari pengguna online.
D-Marc
2
Kedengarannya kurang seperti Anda mencari jawaban tentang mengapa kami menggunakan <form>elemen, dan lebih seperti Anda mencoba untuk menegaskan pilihan markup Anda sendiri. Ini bagus, seperti yang saya katakan, Anda bebas melakukan apa pun yang Anda suka dengan markup Anda, tetapi saya telah menjelaskan alasan utama mengapa kami pengembang menggunakan formulir.
Oka
2
Poin bagus dibuat. Saya sangat menghargai kenyataan bahwa Anda meluangkan waktu untuk lebih menguraikan jawaban Anda dan memberikan contoh kode yang sebenarnya. Saya akan mencoba bentuk lain dan melihat apakah saya lebih suka melakukannya seperti itu. Sekali lagi terima kasih atas bantuannya. Namun, bukankah menurut Anda tidak ada gunanya membungkus formulir di sekitar satu kotak teks?
D-Marc
Tergantung konteksnya. Sebuah masukan yang tidak pernah langsung terkirim , seperti kotak telusur yang melakukan polling titik akhir API secara eksklusif melalui AJAX pada acara selain submit, dapat menghilangkan pembungkusan dalam formulir karena tidak akan memiliki fungsionalitas apa pun tanpa JavaScript. Bukan markup yang tidak valid untuk memiliki di <input>luar a <form>, hanya mungkin semantik yang buruk. Jika ada cara agar data dapat dikirimkan tanpa AJAX, dengan submitacara yang tepat , formulir mungkin yang terbaik. Sekali lagi, elemen tersebut membutuhkan sebuah wadah, dan <form>elemen adalah level blok secara default, jadi mereka bertindak seperti a <div>.
Oka
7

Tag formulir masih diperlukan jika Anda ingin mengirimkan formulir tanpa AJAX (yang mungkin berguna pada tahap awal pengembangan). Tetapi meskipun mungkin menggunakan javascript untuk mengirimkan data tanpa tag formulir, beberapa manfaat masih muncul:

  1. Menggunakan tag formulir dapat membantu orang membaca dan memahami kode Anda dalam beberapa kasus, dengan menunjukkan kepada mereka maksud Anda.
  2. Metode 'kirim' tersedia di formulir. Jika Anda memiliki formulir dengan masukan [type = submit], dan tidak dinonaktifkan, maka ketika seseorang menekan 'enter' saat mengisi salah satu masukan formulir lainnya, formulir tersebut akan dikirim. Anda masih dapat melakukannya dengan mendengarkan event 'keydown' pada elemen input, tetapi ini adalah sedikit ui yang Anda dapatkan secara gratis dengan tag formulir.
  3. Ada beberapa hal lain yang hanya berfungsi dengan tag formulir, atau lebih mudah dengan tag formulir. Pengembang pada akhirnya akan mengalami kasus ini, dan memutuskan lebih mudah untuk selalu menggunakannya di mana saja dan menghindari masalah. Sungguh, pertanyaan sebenarnya adalah, mengapa tidak menggunakan tag formulir?
Michael Hewson
sumber
Juga, hal-hal seperti jQuery .serialize()hanya berfungsi pada elemen formulir.
EJTH
0

Elemen HTML mewakili bagian dokumen yang berisi kontrol interaktif untuk mengirimkan informasi ke server web.

Kita semua sudah familiar dengan formulir di halaman web html. Untuk berbagai alasan, orang atau perusahaan menanyakan alamat email, nama, dan URL situs kami. Membeli produk di Internet saat ini sebagian besar sangat mudah dan dengan munculnya perangkat keamanan, metode yang digunakan untuk mengirimkan detail Anda dan uang yang diperoleh dengan susah payah biasanya dilakukan melalui formulir.

Info lebih lanjut

link satu

menghubungkan dua

Rohit Azad Malik
sumber
Ya, tetapi Anda tidak perlu membungkus input teks seperti alamat email atau kata sandi dalam formulir untuk mengirimkan data. Saya dapat dengan mudah melakukannya dengan ajax. Formulir tidak memberikan keamanan tambahan. Namun, saya dapat melakukannya dengan php jika saya mengenkripsi datanya.
D-Marc
0

Saya memiliki skenario di mana satu halaman web memiliki 3 formulir, yang semuanya memiliki bidang email terpisah (dengan ID berbeda). Saya membungkusnya secara terpisah <div>pada awalnya. Pengisian otomatis iOS di Safari berperilaku aneh sampai saya membungkus semuanya dalam <form>tag. Salah satu formulir hanya memiliki satu kolom input, untuk berlangganan buletin. Ketika pengguna mengisi input itu secara otomatis, halaman web digulir ke kolom input berikutnya yang terletak di bagian halaman yang berbeda.

Jadi, terima kasih Oka untuk posting yang panjang. Tag dengan makna semantik harus digunakan jika memungkinkan, karena Anda tidak pernah tahu browser / perangkat mana yang tidak menangani solusi lain dengan baik.

Nikola Stojanovic
sumber