Menghasilkan respons dari pengontrol
Setelah pengontrol selesai memproses permintaan, biasanya diperlukan untuk menghasilkan respons. Saat kita membuat pengontrol tingkat rendah dengan langsung mengimplementasikan antarmuka IController, kita harus bertanggung jawab atas setiap aspek pemrosesan permintaan, termasuk menghasilkan respons ke klien.
Misalnya, untuk mengirim respons HTML, Anda perlu membuat dan menyusun data HTML, lalu mengirimkannya ke klien menggunakan metode Response.Write(). Demikian pula, untuk mengalihkan browser pengguna ke URL yang berbeda, Anda perlu memanggil metode Response.Redirect() dan meneruskannya ke URL yang diperlukan. Kedua pendekatan ditunjukkan dalam kode di bawah ini, yang menunjukkan ekstensi ke kelas BasicController yang kita buat di artikel sebelumnya menggunakan implementasi antarmuka IController:
Menggunakan System.Web.Mvc; menggunakan System.Web.Routing; namespace ControllersAndActions.Controllers ( BasicController kelas publik: IController ( public void Execute(RequestContext requestContext) ( string controller = (string)requestContext.RouteData.Values["controller"]; string action = (string)requestContext.RouteData.Values["action "]; if (action.ToLower() == "redirect") ( requestContext.HttpContext.Response.Redirect("/Derived/Index"); ) else ( requestContext.HttpContext.Response.Write(string.Format("Controller : (0), Metode tindakan: (1)", pengontrol, tindakan)); ) ) ) )
Pendekatan yang sama dapat diterapkan jika controller diwarisi dari kelas Controller. Kelas HttpResponseBase yang dikembalikan saat membaca properti requestContext.HttpContext.Response dalam metode Execute() tersedia melalui properti Controller.Response, seperti yang ditunjukkan dalam contoh berikut, yang memperluas kelas DerivedController, juga dibuat sebelumnya dengan mewarisi dari kelas Kelas pengontrol:
Menggunakan Sistem; menggunakan System.Web; menggunakan System.Web.Mvc; namespace ControllersAndActions.Controllers ( public class DerivedController: Controller ( public ActionResult Index() ( // ... ) public void ProduceOutput() ( if (Server.MachineName == "ProfessorWeb") Response.Redirect("/Basic/Index" ); else Response.Write("Controller: Derived, Metode Tindakan: ProduceOutput"); ) ) )
Metode ProduceOutput() menggunakan nilai properti Server.MachineName untuk memutuskan respons mana yang akan dikirim ke klien. ("ProfessorWeb" adalah nama mesin pengembangan saya.)
Meskipun pendekatan menghasilkan respons terhadap pengguna ini berhasil, ada beberapa masalah dengannya:
Kelas pengontrol harus berisi informasi tentang HTML atau struktur URL, yang membuat kelas lebih sulit untuk dibaca dan dipelihara.
Kontroler yang menghasilkan respons langsung ke output sulit untuk diuji unit. Anda perlu membuat implementasi tiruan dari objek Response dan kemudian dapat memproses output dari controller untuk menentukan apa itu. Ini mungkin berarti, misalnya, kebutuhan untuk menerapkan penguraian kata kunci dari markup HTML, yang merupakan proses yang panjang dan membosankan.
Penanganan detail halus dari setiap respons ini rumit dan rawan kesalahan. Beberapa programmer menyukai kontrol absolut yang disediakan dengan membangun pengontrol tingkat rendah, tetapi ini biasanya menjadi rumit dengan sangat cepat.
Untungnya, Kerangka MVC memiliki alat praktis yang menyelesaikan semua masalah yang disebutkan - hasil tindakan. Bagian berikut menjelaskan konsep hasil tindakan dan menunjukkan berbagai cara penggunaannya untuk membangkitkan tanggapan dari pengontrol.
Hasil tindakan
Hasil tindakan dalam Kerangka MVC digunakan untuk memisahkan pernyataan maksud dari eksekusi maksud (maaf untuk tautologinya). Konsepnya tampak sederhana setelah Anda memahaminya, tetapi perlu waktu untuk memahami karena beberapa tipuan.
Alih-alih berurusan langsung dengan objek Respon, metode tindakan mengembalikan objek kelas yang diturunkan dari Hasil Tindakan, yang menjelaskan seperti apa seharusnya respons dari pengontrol, seperti merender tampilan atau mengalihkan ke URL atau metode tindakan lain. Namun (ini adalah tipuan yang sangat) jawabannya tidak dihasilkan secara langsung. Sebagai gantinya, objek ActionResult dibuat yang diproses oleh Kerangka Kerja MVC untuk mendapatkan hasil setelah metode tindakan dipanggil.
Sistem Hasil Tindakan adalah contoh pola desain Perintah. Templat ini mewakili skenario tempat Anda menyimpan dan meneruskan objek yang menjelaskan operasi yang akan dilakukan.
Ketika Kerangka MVC menerima objek ActionResult dari metode tindakan, itu memanggil ExecuteResult() metode Yang didefinisikan dalam kelas objek ini. Implementasi hasil tindakan kemudian beroperasi pada objek Response untuk menghasilkan output yang sesuai dengan maksud Anda. Untuk mendemonstrasikan ini dalam tindakan, mari buat folder Infrastruktur dan tambahkan file kelas baru bernama CustomRedirectResult.cs ke dalamnya dengan implementasi ActionResult kustom yang ditunjukkan pada contoh di bawah ini:
Menggunakan System.Web.Mvc; namespace ControllersAndActions.Infrastructure ( public class CustomRedirectResult: ActionResult ( public string Url ( get; set; ) public override void ExecuteResult(ControllerContext context) ( string fullUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext); context.HttpContext.Redirect (Url lengkap); ) ) )
Kelas ini didasarkan pada cara kerja kelas System.Web.Mvc.RedirectResult. Salah satu manfaat dari Kerangka MVC open source berkaitan dengan kemampuan untuk mengeksplorasi cara kerja apa pun. Kelas CustomRedirectResult jauh lebih sederhana daripada yang setara dengan MVC, tetapi cukup untuk tujuan artikel ini.
Saat membuat instance dari kelas RedirectResult, kami meneruskan URL ke mana pengguna harus diarahkan. Metode ExecuteResult(), yang akan dieksekusi oleh Kerangka MVC setelah menyelesaikan metode tindakan, menerima Objek respons untuk meminta melalui objek ControllerContext yang disediakan oleh kerangka kerja dan memanggil metode RedirectPermanent() atau metode Redirect() (ini persis seperti yang dilakukan di dalam implementasi IController tingkat rendah dalam contoh sebelumnya di artikel).
Penggunaan kelas CustomRedirectResult diilustrasikan pada contoh di bawah ini, yang menunjukkan perubahan yang telah dilakukan pada pengontrol Derived:
// ... menggunakan ControllersAndActions.Infrastructure; namespace ControllersAndActions.Controllers ( public class DerivedController: Controller ( public ActionResult Index() ( // ... ) public ActionResult ProduceOutput() ( jika (Server.MachineName == "MyMachineName") mengembalikan CustomRedirectResult baru ( Url = "/Basic/ Index" ); else ( Response.Write("Controller: Derived, Metode Tindakan: ProduceOutput"); return null; ) ) ) )
Perhatikan bahwa kami telah dipaksa untuk mengubah hasil dari metode tindakan untuk mengembalikan ActionResult. Kami mengembalikan null jika kami tidak ingin Kerangka MVC melakukan apa pun saat metode tindakan kami telah selesai, yang akan dilakukan jika instance CustomRedirectResult tidak dikembalikan.
Pengontrol dan Tindakan Pengujian Unit
Banyak bagian dari Kerangka MVC dirancang untuk membuat pengujian unit lebih mudah, dan ini terutama berlaku untuk tindakan dan pengontrol. Ada beberapa alasan untuk dukungan ini:
Anda dapat menguji tindakan dan pengontrol di luar server web. Objek konteks diakses melalui kelas dasarnya (seperti HttpRequestBase), yang mudah ditiru.
Anda tidak perlu mengurai markup HTML untuk menguji hasil metode tindakan. Anda dapat memeriksa objek ActionResult yang dikembalikan untuk memastikan Anda mendapatkan hasil yang diharapkan.
Emulasi permintaan klien tidak diperlukan. Sistem pengikatan model Kerangka MVC memungkinkan Anda untuk menulis metode tindakan yang menerima input dalam parameternya. Untuk menguji metode tindakan, Anda hanya perlu memanggilnya secara langsung dan memberikan nilai parameter yang sesuai.
Artikel selanjutnya tentang menghasilkan data dari pengontrol akan menunjukkan kepada Anda cara membuat pengujian unit untuk berbagai jenis hasil tindakan.
Jangan lupa bahwa pengujian unit hanyalah sebagian dari gambarannya. Perilaku kompleks dalam aplikasi terjadi ketika metode tindakan dipanggil secara berurutan. Pengujian unit paling baik dikombinasikan dengan pendekatan pengujian lainnya.
Sekarang setelah Anda mengetahui cara kerja hasil tindakan pengalihan kustom, Anda dapat beralih ke yang setara, yang disediakan oleh kerangka kerja MVC, yang kuat dan diuji secara ekstensif oleh Microsoft. Perubahan yang diperlukan untuk pengontrol Derived diberikan di bawah ini:
// ... public ActionResult ProduceOutput() ( mengembalikan new RedirectResult("/Basic/Index"); ) // ...
Dihapus dari metode tindakan operator bersyarat, yang berarti setelah menjalankan aplikasi dan membuka URL seperti /Derived/ProduceOutput , browser akan diarahkan ke URL seperti /Basic/Index. Untuk menyederhanakan kode metode tindakan, kelas Controller menyertakan metode praktis untuk menghasilkan berbagai macam objek ActionResult. Jadi, misalnya, kita bisa mendapatkan efek yang sama seperti pada contoh di atas dengan mengembalikan hasil dari metode Redirect():
// ... public ActionResult ProduceOutput() ( return Redirect("/Basic/Index"); ) // ...
Tidak ada yang rumit tentang sistem hasil tindakan, tetapi pada akhirnya membantu untuk mendapatkan kode yang lebih sederhana, lebih bersih, dan lebih konsisten yang mudah dibaca dan diuji unit. Misalnya, dalam kasus pengalihan, Anda cukup memeriksa apakah metode tindakan mengembalikan instance RedirectResult yang properti Urlnya berisi target yang diharapkan.
Kerangka MVC mendefinisikan banyak jenis hasil tindakan bawaan, yang dijelaskan dalam tabel di bawah ini:
Jenis | Keterangan | Metode Helper dari Controller Class |
---|---|---|
Lihat hasil | Membuat template tampilan yang ditentukan atau standar |
Melihat() |
Hasil Tampilan Sebagian | Membuat template tampilan parsial yang ditentukan atau standar |
Tampilan Sebagian() |
RedirectToRouteResult | Mengeluarkan HTTP 301 atau 302 redirect ke metode tindakan atau entri rute yang ditentukan, menghasilkan URL sesuai dengan konfigurasi perutean |
RedirectToAction() RedirectToActionPermanent() RedirectToRoute() RedirectToRoutePermanent() |
RedirectResult | Mengeluarkan HTTP 301 atau 302 redirect ke URL yang diberikan |
pengalihan() PengalihanPermanen() |
Hasil Konten | Mengembalikan data teks yang tidak diformat ke browser, secara opsional mengatur header tipe konten |
isi() |
FileHasil | Melewati data biner (seperti file pada disk atau array byte dalam memori) langsung ke browser |
Mengajukan() |
JsonHasil | Membuat serial objek .NET menjadi format JSON dan mengirimkannya sebagai tanggapan. Tanggapan semacam ini lebih sering dihasilkan saat menggunakan Alat web API dan AJAX |
json() |
Hasil JavaScript | Mengirim sepotong kode sumber JavaScript untuk dieksekusi oleh browser |
JavaScript() |
HttpHasil Tidak Sah | Menyetel kode status respons HTTP ke 401 (artinya "tidak diotorisasi"), yang menyebabkan mekanisme otentikasi saat ini (Otentikasi Formulir atau Otentikasi Windows) untuk meminta pengunjung masuk |
Bukan |
HttpNotFoundResult | Mengembalikan kesalahan HTTP dengan kode 404 - tidak ditemukan(tidak ditemukan) |
HttpTidakDitemukan() |
HttpStatusCodeHasil | Mengembalikan kode HTTP yang ditentukan |
Bukan |
Hasil Kosong | Tidak melakukan apapun |
Bukan |
Semua tipe ini diturunkan dari kelas ActionResult, dan banyak di antaranya memiliki metode pembantu yang praktis di kelas Controller. Kami akan mendemonstrasikan penggunaan jenis hasil ini di artikel berikutnya.
Katakanlah kita perlu mendapatkan data dari situs, yang pengumpulannya secara manual tidak praktis atau tidak mungkin karena volumenya. Dalam kasus seperti itu, kami dapat mengotomatiskan proses menggunakan alat yang dijelaskan di bawah ini.
permintaan perpustakaan
Pustaka Python untuk membuat permintaan ke server dan memproses tanggapan. Dasar dari skrip parsing dan senjata utama kami. Menggunakan perpustakaan ini, kami mendapatkan konten halaman dalam bentuk html untuk parsing lebih lanjut.
respon permintaan impor = permintaan . get ("https://ya.ru" ) # get-request print (respons .text ) # konten halaman cetak payload = ( "key1" : "value1" , "key2" : "value2" ) response = request . get("http://httpbin.org/get", params = payload ) # permintaan dengan parameter headers = ( "user-agent" : "my-app/0.0.1" ) response = request . dapatkan(url , tajuk = tajuk ) # permintaan dengan header html tertentu
API
Antarmuka pemrograman aplikasi - antarmuka pemrograman aplikasi yang disediakan oleh pemilik aplikasi web kepada pengembang lain. Kurangnya API yang dapat memenuhi kebutuhan kita adalah hal pertama yang harus dipastikan sebelum terburu-buru menganalisis sumber halaman dan menulis parser untuk itu. Banyak situs populer memiliki API dan dokumentasi mereka sendiri yang menjelaskan cara menggunakannya. Kami dapat menggunakan api dengan cara ini - kami membentuk permintaan http sesuai dengan dokumentasi, dan kami mendapatkan respons menggunakan permintaan.
BS4
Beautifulsoup4 adalah perpustakaan untuk mem-parsing dokumen html dan xml. Memungkinkan Anda mengakses langsung konten tag apa pun dalam html.
from bs4 import BeautifulSoup soup = BeautifulSoup (raw_html , "html.parser" ) print (sup . find ("p" , class_ = "some-class" ) .text ) # print isi tag "p" dengan class "some-class"
Selenium WebDriver
Data di situs dapat dihasilkan secara dinamis menggunakan javascript. Dalam hal ini, permintaan + bs4 tidak akan dapat mengurai data ini. Faktanya adalah bahwa bs4 mem-parsing kode sumber halaman tanpa menjalankan js. Untuk mengeksekusi kode js dan mendapatkan halaman yang identik dengan yang kita lihat di browser, Anda dapat menggunakan driver web Selenium - ini adalah satu set driver untuk browser yang berbeda, disertakan dengan perpustakaan untuk bekerja dengan driver ini.
Dan bagaimana jika ada otorisasi?
session = request.Session() data = ("login_username":"login", "login_password":"password") url = "http://site.com/login.php" response = session.post(url, data =data)
Tetapi bagaimana jika situs tersebut melarang banyak permintaan?
- Setel penundaan antara permintaan:
response = request.get(url, timeout=(10, 0.01)) # batas waktu koneksi, batas waktu baca (dalam detik)
- Berpura-pura menjadi browser menggunakan driver web Selenium atau dengan meneruskan konten header agen pengguna, membuat permintaan:
user_agent = ("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) " "Gecko/20100101 Firefox/50.0") request = request.get(url, headers=("User-Agent":user_agent))
- Gunakan proxy:
Terjemahan: Vlad Merzhevich
Semua orang tahu tentang formulir web, bukan? Tempel tagnya
Browser yang tidak mendukung atribut placeholder abaikan saja. Tidak ada kerusakan atau kerusakan.
Tanya Profesor Markup
T. Dapatkah saya menggunakan markup HTML untuk atribut placeholder? Saya ingin menyisipkan gambar atau mungkin mengubah warna.
A. Atribut placeholder hanya boleh berisi teks, tanpa kode HTML. Namun, ada ekstensi CSS khusus yang memungkinkan Anda mengatur gaya teks di beberapa browser.
Bidang dengan fokus otomatis
YAITU | Firefox | safari | Chrome | Opera | iPhone | Android |
- | - | 4.0+ | 3.0+ | 10.0+ | - | - |
Situs dapat menggunakan JavaScript untuk secara otomatis mendapatkan fokus pada bidang formulir pertama. Misalnya, di halaman utama Google.com autofocus ada di bidang untuk memasuki pencarian kata kunci. Meskipun ini nyaman bagi kebanyakan orang, ini dapat mengganggu pengguna tingkat lanjut dan orang-orang dengan kebutuhan khusus. Jika Anda menekan spasi sambil menunggu halaman digulir, tidak akan ada pengguliran karena fokusnya ada pada bidang input formulir (akan ada spasi yang diketik di bidang alih-alih menggulir). Jika Anda memindahkan fokus ke bidang input lain saat halaman sedang dimuat, skrip fokus otomatis situs dapat "membantu" memindahkan fokus kembali ke bidang input asli, mengganggu pengetikan Anda dan menyebabkan Anda mengetik di tempat yang salah.
Karena fokus otomatis bekerja melalui JavaScript, mungkin ada kerumitan untuk menangani ekstrem ini dan beberapa opsi bagi orang-orang yang tidak ingin halaman web "mencuri" fokus mereka.
Untuk mengatasi masalah ini, HTML5 memperkenalkan atribut fokus otomatis pada semua elemen formulir. Atribut fokus otomatis melakukan persis seperti apa bunyinya: segera setelah halaman dimuat, ia memindahkan fokus ke bidang yang ditentukan. Tetapi karena ini hanya markup dan bukan skrip, perilakunya akan konsisten di semua situs. Selain itu, produsen browser (atau pembuat ekstensi) dapat menawarkan kepada pengguna cara untuk menonaktifkan fokus otomatis.
Ini adalah bagaimana Anda dapat mengatur bidang formulir fokus otomatis.
Browser yang tidak mendukung atribut fokus otomatis akan mengabaikannya.
Apa? Maksud Anda, Anda ingin fokus otomatis berfungsi di mana saja, tidak hanya di browser HTML5 yang mewah? Anda dapat meninggalkan skrip saat ini dengan fokus otomatis, cukup buat dua perubahan kecil:
- tambahkan atribut fokus otomatis ke kode HTML;
- periksa apakah browser mendukung atribut fokus otomatis, dan jika tidak, jalankan skrip Anda sendiri.
Fokus otomatis dengan alternatif
Tetapkan fokus sedini mungkin
Banyak halaman web menunggu window.onload menyala dan mengatur fokus. Tetapi acara window.onload tidak akan aktif sampai semua gambar dimuat. Jika halaman Anda memiliki banyak gambar, skrip naif tersebut berpotensi mengubah fokus setelah pengguna mulai berinteraksi dengan bagian lain halaman Anda. Itu sebabnya pengguna tingkat lanjut benci skrip autofokus.
Misalnya, di bagian sebelumnya, skrip fokus otomatis ditempatkan tepat setelah bidang formulir yang dirujuk. dia solusi optimal, tetapi mungkin menyakiti perasaan Anda untuk menempatkan blok kode JavaScript di tengah halaman (atau lebih biasa, sistem Anda mungkin tidak begitu fleksibel). Jika Anda tidak dapat menyisipkan skrip di tengah halaman, Anda harus menyetel fokus melalui peristiwa khusus seperti $(document).ready() di jQuery alih-alih window.onload .
Fokus otomatis melalui jQuery
Acara khusus jQuery diaktifkan segera setelah DOM tersedia - yaitu, menunggu teks halaman dimuat, tetapi tidak menunggu semua gambar dimuat. Ini bukan pendekatan yang optimal - jika halamannya terlalu besar atau koneksi jaringan lambat, pengguna mungkin masih berinteraksi dengan halaman sebelum skrip dengan fokus dijalankan. Tapi itu masih jauh lebih baik daripada menunggu event window.onload diaktifkan.
Jika Anda setuju dan bersedia memasukkan skrip dengan satu pernyataan ke dalam kode halaman Anda, ini adalah kompromi yang tidak terlalu mengganggu dibandingkan opsi pertama dan lebih baik daripada opsi kedua. Anda dapat menggunakan acara khusus jQuery untuk mengatur acara Anda sendiri, misalnya autofocus_ready. Kemudian Anda dapat memanggil acara ini secara manual, tepat setelah bidang fokus otomatis tersedia. Terima kasih kepada E. M. Shtenberg karena telah mengajari saya teknik ini.
Fokus otomatis dengan acara khusus alternatif
Solusi ini optimal, seperti pendekatan pertama. Fokus akan disetel ke bidang formulir sesegera mungkin secara teknis saat teks halaman masih dimuat. Bagian dari logika aplikasi (fokus pada bidang formulir) telah dipindahkan dari badan halaman ke bagian
. Contoh ini didasarkan pada jQuery, tetapi konsep acara khusus tidak unik untuk jQuery. Pustaka JavaScript lain seperti YUI dan Dojo menawarkan fungsionalitas serupa.Mari kita rangkum.
- Mendapatkan fokus yang tepat itu penting.
- Jika memungkinkan, minta browser menggunakan atribut fokus otomatis pada bidang di mana Anda ingin fokus.
- Jika Anda menggunakan kode alt untuk browser lama, tentukan dukungan untuk atribut fokus otomatis sehingga skrip hanya berjalan di browser lama.
- Tetapkan fokus sedini mungkin. Tempel skrip fokus ke dalam kode segera setelah bidang formulir. Jika itu tidak mengganggu Anda, sematkan pustaka JavaScript yang mendukung acara khusus dan aktifkan acara dalam kode tepat setelah bidang formulir. Jika tidak memungkinkan, gunakan event seperti $(document).ready() dari jQuery.
- Dalam situasi apa pun, tunggu window.onload untuk mengatur fokus.
Alamat email
Selama lebih dari sepuluh tahun, formulir hanya berisi beberapa jenis bidang. Yang paling umum adalah sebagai berikut.
Semua jenis bidang ini masih berfungsi di HTML5. Jika Anda "meningkatkan ke HTML5" (mungkin dengan mengubah !DOCTYPE ), Anda tidak perlu membuat satu perubahan pun pada formulir Anda. Hore untuk kompatibilitas mundur!
Namun, HTML5 mendefinisikan 13 jenis bidang baru dan tidak ada alasan untuk tidak mulai menggunakannya.
Yang pertama dari jenis alamat baru ini Surel. Terlihat seperti ini.
Saya akan menulis kalimat yang dimulai "di browser yang tidak mendukung type="email"..." tetapi berhenti. Mengapa? Karena tidak yakin apakah browser tidak mendukung type="email" . Semua browser "support" type="email" . Mereka mungkin tidak melakukan sesuatu yang istimewa, tetapi browser yang tidak mengenali type="email" akan memperlakukannya sebagai type="text" dan menjadikannya sebagai bidang teks biasa.
Saya akan menekankan betapa pentingnya ini. Ada jutaan formulir di Internet yang meminta alamat email dan semuanya menggunakan . Anda melihat bidang teks, masukkan alamat email Anda ke dalamnya dan hanya itu. Dan inilah HTML5, yang mendefinisikan type="email" . Apakah browser menjadi gila? Tidak. Setiap browser di bumi memperlakukan atribut type yang tidak diketahui sebagai type="text" - bahkan IE6. Jadi Anda dapat "memperbarui" formulir Anda dengan type="email" sekarang.
Apa yang terjadi jika, katakanlah, browser mendukung type="email" ? Yah, itu bisa berarti apa saja. Spesifikasi HTML5 tidak memerlukan antarmuka pengguna tertentu untuk jenis bidang baru. Opera mengisi bidang formulir dengan ikon kecil. Browser HTML5 lainnya seperti Safari dan Chrome dirender sebagai bidang teks - sama seperti type="text" - sehingga pengguna Anda tidak akan melihat perbedaannya (sampai mereka melihat kode sumbernya).
Dan kemudian ada iPhone.
IPhone tidak memiliki keyboard fisik. Semua "mengetik" dilakukan dengan mengetuk keyboard di layar yang muncul pada waktu yang tepat, seperti saat Anda menavigasi ke bidang formulir di halaman web. Apple melakukan sesuatu yang rumit di browser iPhone. Ini mengenali beberapa bidang HTML5 baru dan secara dinamis mengubah keyboard di layar untuk mengoptimalkan input.
Misalnya, alamat email adalah teks, bukan? Tentu, tapi itu jenis teks khusus. Misalnya, hampir semua alamat email berisi simbol @ dan setidaknya satu titik (.), tetapi tidak mungkin berisi spasi. Jadi saat Anda menggunakan iPhone dan menavigasi ke suatu elemen , Anda akan mendapatkan keyboard di layar yang berisi kurang dari ruang normal, serta tombol karakter khusus. dan @.
Biarkan saya meringkas. Tidak ada kerugian untuk segera menerjemahkan semua bidang Anda dengan alamat email di ketik="email" . Hampir tidak ada yang akan menyadarinya, kecuali pengguna iPhone, yang mungkin juga tidak. Tetapi mereka yang memperhatikan akan tersenyum lembut dan terima kasih telah membuat pekerjaan mereka sedikit lebih mudah.
Alamat web
Alamat web - yang oleh para kutu buku standar disebut URL, dengan pengecualian beberapa orang yang menyebut-nyebut URI - adalah jenis teks khusus lainnya. Sintaks alamat web dibatasi oleh standar Internet yang relevan. Jika seseorang meminta Anda memasukkan alamat web ke dalam formulir, mereka mengharapkan sesuatu seperti "http://www.google.com/", bukan "125 Farwood Road". Garis miring adalah umum - bahkan dalam halaman rumah Google memiliki tiga. Periode juga umum, tetapi spasi dilarang. Dan setiap alamat web memiliki akhiran domain seperti ".com" atau ".org".
Dan jadi... (tolong drumroll)... . Di iPhone, tampilannya seperti ini.
IPhone telah mengubah keyboard virtualnya seperti yang dilakukan untuk alamat email, tetapi sekarang telah mengoptimalkannya untuk mengetik alamat web. Spasi telah sepenuhnya digantikan oleh tiga tombol virtual: garis miring, titik, dan ".com" (Anda dapat menahan tombol ".com" untuk memilih akhiran yang berbeda seperti ".org" atau ".net").
Peramban yang tidak mendukung HTML5 akan memperlakukan type="url" seolah-olah itu type="text" , jadi tidak ada ruginya menggunakan jenis ini untuk semua bidang di mana Anda perlu memasukkan alamat web.
Angka sebagai penghitung
Langkah selanjutnya: angka. Meminta nomor lebih kompleks daripada meminta email atau alamat web. Pertama-tama, angka lebih rumit dari yang Anda pikirkan. Pilih nomor dengan cepat. -satu? Tidak, maksud saya angka antara 1 dan 10,7 ? Tidak, tidak, tidak sedikit pun, tolol. ? Sekarang Anda baru saja memilih bilangan irasional.
Saya ingin menunjukkan bahwa Anda tidak sering ditanya "hanya angka". Kemungkinan besar mereka akan meminta nomor dalam kisaran tertentu. Anda mungkin hanya menginginkan jenis angka tertentu dalam rentang itu - mungkin bilangan bulat, tetapi bukan pecahan atau desimal atau sesuatu yang lebih eksotis seperti kelipatan 10. HTML5 mencakup semua itu.
Pilih nomor, hampir semua
min="0"
maks="10"
langkah="2"
nilai="6">
Mari kita lihat satu atribut.
- type="number" artinya adalah bidang numerik.
- min="0" menentukan nilai minimum yang diizinkan untuk bidang ini.
- max="10" adalah nilai maksimum yang diizinkan.
- langkah="2" dikombinasikan dengan nilai minimum mendefinisikan angka yang valid dalam rentang: 0, 2, 4, dan seterusnya, hingga nilai maksimum.
- nilai = "6" nilai default. Seharusnya terlihat familier, atribut yang sama selalu digunakan untuk menentukan nilai bidang formulir. Saya menyebutkannya di sini sebagai titik awal bahwa HTML5 didasarkan pada versi sebelumnya HTML. Anda tidak perlu belajar kembali untuk melakukan apa yang telah Anda lakukan sebelumnya.
Ini adalah kode bidang numerik. Perlu diingat bahwa semua atribut ini opsional. Jika Anda memiliki minimum tetapi tidak maksimum, Anda dapat menentukan atribut min, tetapi bukan atribut max. Nilai langkah default adalah 1, dan Anda dapat menghilangkan atribut langkah hingga nilai langkah yang berbeda diperlukan. Jika tidak ada nilai default, maka atribut value bisa berupa string kosong atau bahkan dihilangkan sama sekali.
Tapi HTML5 tidak berhenti di situ. Untuk rendah yang sama Harga rendah kebebasan Anda mendapatkan metode kenyamanan JavaScript ini.
- input.stepUp(n) menaikkan nilai bidang sebesar n.
- input.stepDown(n) menurunkan nilai bidang sebesar n.
- input.valueAsNumber mengembalikan nilai saat ini sebagai float (properti input.value selalu berupa string).
Masalah tampilan? Nah, antarmuka yang benar untuk memanipulasi angka di browser diterapkan secara berbeda. Di iPhone, di mana mengetik sulit, browser kembali mengoptimalkan keyboard virtual untuk mengetik angka.
Pada Opera versi desktop, bidang type="number" muncul sebagai penghitung dengan sedikit panah atas dan bawah yang dapat Anda klik untuk mengubah nilainya.
Opera menghormati atribut min , max , dan step, jadi Anda akan selalu mendapatkan nilai numerik yang masuk akal. Jika Anda meningkatkan nilainya secara maksimal, panah atas di penghitung berubah menjadi abu-abu.
Seperti semua bidang masukan lain yang telah saya bahas dalam bab ini, browser yang tidak mendukung type="number" akan memperlakukannya sebagai type="text" . Nilai default akan ditampilkan di bidang (seperti yang disimpan dalam atribut nilai), tetapi atribut lain seperti min dan maks akan diabaikan. Anda bebas mengimplementasikannya sendiri, atau menggunakan kerangka kerja JavaScript yang sudah menerapkan manajemen penghitung. Cek dulu caranya di sini.
if(!.inputtypes.number)(
// tidak ada dukungan asli untuk field type=number
// mungkin mencoba Dojo atau kerangka kerja JavaScript lainnya
}
Nomor penggeser
Penghitung bukan satu-satunya cara untuk mewakili input angka. Anda mungkin juga pernah melihat slider yang terlihat seperti ini.
Sekarang Anda juga dapat memiliki slider pada formulir. Kode terlihat aneh mirip dengan bidang penghitung.
min="0"
maks="10"
langkah="2"
nilai="6">
Semua atribut yang tersedia sama dengan type="number" - min , max , step , value - dan artinya sama. Bedanya hanya di antarmuka pengguna. Alih-alih bidang input, browser diharapkan menampilkan type="range" sebagai penggeser. Pada saat menulis versi terbaru Safari, Chrome, dan Opera telah bekerja dengan ini. Sayangnya, iPhone ditampilkan sebagai bidang teks sederhana, bahkan tidak mengoptimalkan keyboard di layar untuk memasukkan angka. Semua browser lain hanya memperlakukan bidang tersebut sebagai type="text" , jadi tidak ada alasan untuk segera mulai menggunakan jenis itu.
HTML 4 tidak menyertakan pemilih tanggal melalui kalender. Kerangka kerja JavaScript memungkinkan Anda untuk menyiasatinya (Dojo , jQuery UI , YUI , Perpustakaan Penutupan), tetapi tentu saja masing-masing solusi ini memerlukan kerangka kerja untuk "disematkan" untuk kalender yang disematkan.
HTML5 akhirnya mendefinisikan cara untuk mengaktifkan pemilih tanggal bawaan tanpa skrip apa pun. Sebenarnya ada enam di antaranya: tanggal, bulan, minggu, waktu, tanggal + waktu, dan tanggal + waktu dengan zona waktu.
Sejauh ini, dukungan... langka.
Jenis | Opera | Peramban lain |
---|---|---|
ketik = "tanggal" | 9.0+ | - |
jenis = "bulan" | 9.0+ | - |
ketik = "minggu" | 9.0+ | - |
ketik = "waktu" | 9.0+ | - |
ketik = "waktu tanggal" | 9.0+ | - |
ketik = "tanggal waktu lokal" | 9.0+ | - |
Beginilah tampilan Opera :
Jika Anda membutuhkan waktu beserta tanggalnya, Opera juga mendukung :
Jika Anda membutuhkan satu bulan ditambah satu tahun (misalnya tanggal kedaluwarsa kartu kredit), Opera dapat menampilkan :
Kurang umum, tetapi tersedia, adalah pilihan minggu dalam setahun melalui :
Last but not least adalah waktu :
Pemilih tanggal dengan alternatif
...
Kemungkinan browser lain pada akhirnya akan mendukung jenis ini. Seperti type="email" dan jenis lainnya, bidang formulir ini akan ditampilkan sebagai teks biasa di browser yang tidak mengenali type="date" dan variannya. Jika Anda mau, Anda bisa menggunakan daripada membuat pengguna Opera senang dan menunggu browser lain menyusul. Lebih realistis untuk digunakan , tetapi periksa apakah browser memiliki dukungan pemilih tanggal bawaan, dan aktifkan solusi alternatif sebagai skrip pilihan Anda (Dojo , jQuery UI , YUI , Closure Library atau opsi lainnya).
Jendela pencarian
Jadi cari. Bukan hanya pencarian dari Google atau Yahoo (yah, itu juga). Pikirkan kotak pencarian apa pun, di halaman mana pun, di situs mana pun. Amazon memiliki kotak pencarian, Yandex memiliki kotak pencarian, sebagian besar blog juga memilikinya. Bagaimana mereka dibuat? , sama seperti bidang teks lainnya di web. Mari kita perbaiki ini.
Cari generasi baru
Di beberapa browser, Anda tidak akan melihat perbedaan dari bidang teks biasa. Tetapi jika Anda menggunakan Safari di Mac OS X, tampilannya akan seperti ini.
Menemukan perbedaan? Bidang input memiliki sudut membulat! Aku tahu, aku tahu, kamu hampir tidak bisa menahan perasaanmu. Tapi tunggu, bukan itu saja! Saat Anda mulai mengetik di bidang type="search", Safari akan memasukkan tombol "x" kecil dengan sisi kanan jendela. Mengklik "x" akan menghapus konten bidang. Google Chrome, yang memiliki teknologi yang sama di bawah tenda, berperilaku dengan cara yang sama. Kedua trik kecil ini terlihat dan berperilaku mirip dengan pencarian asli di iTunes dan aplikasi klien Mac OS X lainnya.
Apple.com menggunakan untuk menelusuri situs Anda, untuk membantu situs menyampaikan perasaan "mencintai". Tapi tidak ada yang khusus untuk Mac di sini. Ini hanya kode sehingga setiap browser di platform apa pun dapat memilih cara menampilkan sesuai dengan konvensi platform. Seperti semua jenis baru lainnya, browser yang tidak mengenali type="search" akan memperlakukannya sebagai type="text" , jadi sama sekali tidak ada alasan untuk tidak mulai menggunakan type="search" untuk semua kotak pencarian Anda hari ini. .
Profesor Markup mengatakan
Secara default, Safari tidak berlaku untuk kebanyakan gaya. Jika Anda ingin memaksa Safari memperlakukan bidang pencarian sebagai bidang teks biasa (untuk menerapkan gaya Anda sendiri), tambahkan aturan ini ke lembar gaya Anda.
memasukkan(
-penampilan webkit: bidang teks;
}
Terima kasih kepada John Lane karena telah mengajari saya trik ini.
Pemilihan warna
HTML5 juga mendefinisikan bidang , yang memungkinkan Anda memilih warna dan mengembalikannya dalam notasi heksadesimal. Tidak ada browser yang mendukung pemilihan warna, yang memalukan karena saya selalu menyukai palet Mac OS. Mungkin suatu hari.
Catatan. Penerjemah. Opera 11 mendukung fitur ini.
Validasi formulir
Dalam bab ini, saya telah berbicara tentang elemen formulir baru dan fitur baru seperti fokus otomatis, tetapi saya mungkin belum menyebutkan bagian paling menarik dari formulir HTML5: pemeriksaan otomatis memasukan data. Mari kita lihat masalah umum memasukkan alamat email dalam formulir. Anda mungkin memiliki validasi sisi klien melalui JavaScript diikuti dengan validasi sisi server melalui PHP, Python, atau bahasa sisi server lainnya. HTML5 tidak akan pernah menggantikan validasi sisi server, tetapi mungkin suatu hari nanti akan menggantikan validasi sisi klien.
Ada dua masalah besar dengan validasi alamat email JavaScript:
- Beberapa pengunjung Anda (mungkin sekitar 10%) tidak mengaktifkan JavaScript.
- Anda akan menerima alamat yang salah.
Serius, Anda akan mendapatkan alamat yang salah. Menentukan bahwa satu set karakter acak adalah alamat email yang valid sangat sulit. Semakin keras Anda melihat, semakin sulit. Apakah saya sudah mengatakan bahwa itu sangat, sangat sulit? Bukankah lebih mudah untuk menggantung sakit kepala ini di browser Anda?
Opera memeriksa jenis = "email"
Berikut adalah screenshot dari Opera 11, meskipun fungsinya telah ada sejak Opera 9. Kode tersebut mencakup pengaturan atribut type ke email. Saat pengguna Opera mencoba mengirimkan formulir dengan , browser secara otomatis memeriksa alamat email meskipun skrip dinonaktifkan.
HTML5 juga menawarkan validasi alamat web dengan bidang dan angka dengan . Validasi angka menghormati nilai atribut min dan max, jadi browser tidak akan mengizinkan Anda mengirimkan formulir jika Anda memasukkan angka yang terlalu besar.
Tidak ada kode untuk mengaktifkan validasi formulir di HTML5, ini dilakukan secara default. Untuk menonaktifkan validasi, gunakan atribut novalidate.
Jangan uji aku
Browser secara perlahan mengaktifkan dukungan validasi formulir di HTML5. Firefox 4 akan mendapat dukungan penuh. Sayangnya, Safari dan Chrome hanya mengimplementasikannya sebagian: mereka memvalidasi elemen formulir, tetapi tidak menampilkan pesan yang terlihat saat bidang formulir gagal divalidasi. Dengan kata lain, jika Anda memasukkan tanggal yang tidak valid (atau salah eja) di type="date" , Safari dan Chrome tidak akan mengirimkan formulir, tetapi tidak akan memberi tahu Anda alasannya. Mereka akan menetapkan fokus ke bidang yang berisi nilai yang tidak valid, tetapi tidak akan menampilkan pesan kesalahan seperti Opera atau Firefox 4.
Bidang yang harus diisi
YAITU | Firefox | safari | Chrome | Opera | iPhone | Android |
- | 4.0+ | - | - | 9.0+ | - | - |
Validasi formulir dalam HTML5 tidak terbatas pada jenis masing-masing bidang. Anda juga dapat menentukan bahwa bidang tertentu diperlukan, bidang tersebut harus memiliki nilai sebelum Anda dapat mengirimkan formulir.
Kode untuk bidang wajib diisi sesederhana mungkin.
Browser dapat mengubah tampilan default bidang wajib. Berikut adalah contoh tampilannya di Mozilla Firefox 4.0.
Juga, jika Anda mencoba mengirimkan formulir tanpa mengisi nilai yang diperlukan, Firefox akan menampilkan bilah informasi yang mengatakan bahwa bidang tersebut wajib diisi dan tidak boleh dibiarkan kosong.
Objek yang dijelaskan adalah alat yang sangat berguna dan kuat. Objek ini memiliki beberapa metode, deskripsinya diberikan di bawah ini:
Koleksi:
Metode:
Properti:
Respon.Koleksi kue
Koleksi Cookies menetapkan nilai untuk cookie. Jika cookie yang ditentukan tidak ada, cookie akan dibuat. Jika cookie ada, cookie akan mengambil nilai baru dan yang lama akan dimusnahkan.
Response.Cookies(cookie) [(key) | . atribut ] = nilai
Pilihan:
- Kue kering- Nama kue
- kunci- Parameter opsional. Jika ditentukan, maka cookie adalah direktori (bersarang) dan kuncinya adalah kumpulan nilai.
- atribut- Informasi tertentu tentang cookie itu sendiri. Parameter ini dapat berupa salah satu dari berikut ini:
- arti- Menunjukkan nilai yang akan diberikan kunci yang diberikan atau atribut.
Nama | Keterangan |
Domain | Rekam saja. Jika ditentukan, cookie hanya dikirim berdasarkan permintaan dari domain tersebut. |
Kedaluwarsa | Rekam saja. Tanggal cookie kedaluwarsa. Tanggal ini harus ditetapkan agar cookie dapat ditulis ke klien HDD setelah akhir sesi. Jika atribut ini tidak disetel, maka tanggal kedaluwarsa cookie diterima tanggal sekarang. Cookie akan kedaluwarsa segera setelah sesi berakhir. |
memiliki kunci | Hanya membaca. Menunjukkan apakah cookie berisi kunci yang diberikan. |
Jalur | Rekam saja. Jika ditentukan, cookie hanya diteruskan berdasarkan permintaan dari jalur tersebut. Jika parameter tidak disetel, maka jalur ke aplikasi akan digunakan. |
aman | Rekam saja. Menunjukkan apakah cookie akan dilindungi atau tidak. |
Komentar:
Jika cookie dengan kunci dibuat seperti yang ditunjukkan pada skrip berikut,
<% Response.Cookies("mycookie")("type1") = "сахар" Response.Cookies("mycookie")("type2") = "печенье" %>
maka header berikut akan dikirim:
Set-Cookie:MYCOOKIE=TYPE1=gula&TYPE2=cookies
Jika Anda menetapkan nilai ke mycookie tanpa menggunakan kunci, maka tindakan ini akan menghancurkan kunci tipe1 dan tipe2. Sebagai contoh:<% Response.Cookies("myCookie") = "шоколадный зефир" %>
Pada contoh sebelumnya, kunci type1 dan type2 akan dimusnahkan dan nilainya akan hilang. Mycookie sekarang akan berisi nilai cokelat marshmallow.
Anda juga dapat memeriksa keberadaan kunci tertentu dengan cara berikut:
<% = Response.Cookies("myCookie").HasKeys %>
Jika TRUE ditampilkan, maka kunci seperti itu ada, dalam kasus FALSE - tidak.
Tanggapan.Metode Tulis
Respon.Tulis variabel_atau_nilai
Pilihan:
- variabel_atau_nilai- Data yang akan ditampilkan pada layar browser melalui HTML. Parameter ini dapat berupa jenis apa pun yang didukung oleh VisualBasic Scripting Edition. Artinya, data dapat berupa: tanggal, string, karakter, nilai numerik. Nilai parameter ini tidak boleh berisi kombinasi %>. Sebagai gantinya, Anda dapat menggunakan kombinasi yang setara %\>. Server web akan menerjemahkan urutan ini ke urutan yang diperlukan saat skrip dijalankan.
Contoh berikut menunjukkan cara kerja metode Response.write untuk mencetak pesan ke klien.
Saya hanya akan memberitahu Anda:<%Response.write "Привет всем!!!"%>Dan namamu<%Response.write(Request.Form("name"))%>
Contoh berikut menambahkan tag HTML ke halaman web. Karena metode ini tidak dapat berisi kombinasi %>, kami menggunakan urutan %\>. Jadi contoh skrip:
<% Response.write "
respon risiko | Deskripsi/contoh | Cocok untuk…. jenis risiko (ini adalah saran dan tidak lengkap) |
Ancaman | ||
Menghindari | Risiko dihindari dengan mengubah proyek dalam beberapa cara untuk menghindari risiko. |
Beberapa risiko politik mis. opini publik yang merugikan. Beberapa risiko teknis/operasional/infrastruktur mis. masalah pemeliharaan. Risiko hukum dan peraturan, mis. kontrol peraturan, persyaratan lisensi. |
Transfer | Beberapa risiko strategis/komersial mis. pencurian, kebangkrutan dapat diasuransikan. Lihat risiko bisnis untuk contoh lainnya. |
|
Mengurangi | Tindakan diambil untuk mengurangi kemungkinan terjadinya risiko atau dampak yang akan ditimbulkannya. |
Respons risiko yang paling sering digunakan. Dapat diterapkan secara luas - Teknis/Operasional/Infrastruktur mis. kelalaian, kegagalan kinerja, ruang lingkup 'merayap', harapan yang tidak jelas. Faktor organisasi/manajemen/manusia mis. bentrokan kepribadian, kepemimpinan yang buruk, dan pemilihan staf yang buruk. |
Beberapa risiko politik, hukum dan peraturan, dan ekonomi/keuangan mungkin perlu diterima dengan suatu tempat, mis. perang dan kekacauan, fluktuasi nilai tukar. |
||
Kemungkinan | Di sini sebuah rencana dibuat untuk merespons jika risiko itu terwujud. | ekonomi/keuangan/pasar Bisa dibilang semua risiko dapat dan harus memiliki rencana darurat. |
Peluang | ||
Bagikan | Peluang dibagikan dengan mitra atau pemasok untuk memaksimalkan manfaat melalui penggunaan sumber daya/teknologi bersama, dll. | Teknis/operasional/infrastruktur mis. teknologi baru, desain yang lebih baik. |
Mengeksploitasi | Sebuah proyek dapat disesuaikan untuk mengambil keuntungan dari perubahan teknologi atau pasar baru. | Ekonomi/keuangan/pasar mis. pasar baru dan pasar berkembang, perubahan positif dalam nilai tukar atau suku bunga. |
Meningkatkan | Tindakan diambil untuk meningkatkan kemungkinan terjadinya peluang atau dampak positif yang dapat ditimbulkannya. | Peluang strategis/komersial seperti kemitraan baru, penanaman modal baru, promotor baru. |
Menolak | Di sini tidak ada tindakan yang diambil dan kesempatan untuk mendapatkan keuntungan dari kesempatan itu ditolak. dapat diterapkan jika ada kesempatan. | politik atau lingkungan mis. jaringan transportasi baru, perubahan pemerintahan yang membawa perubahan positif dalam kebijakan/peluang untuk melobi, dll. |
Rencana darurat harus mengidentifikasi tindakan yang akan diambil jika risiko terjadi. Tindakan kontinjensi sering kali memiliki biaya terkait dan anggaran harus disisihkan dalam kasus bisnis untuk menutupi ini.
50 Risiko Bisnis Teratas dan cara mengelolanya!
20 Risiko Proyek Umum - contoh Daftar Risiko
Daftar Periksa 30 Risiko Konstruksi
Respons Risiko - referensi
Office of Government Commerce (2002), Mengelola Proyek yang Berhasil dengan PRINCE2, London: TSO.The Projects Group plc, 2006, Tinjauan Manajemen Risiko, Sutton: The Projects Group plc.