Showing posts with label form. Show all posts
Showing posts with label form. Show all posts

Thursday, November 14, 2013

Thẻ form trong HTML

Thẻ form là một trong những thẻ quan trọng nhất trong HTML, giữ vai trò tương tác giữa người dùng và trang web. Các thao tác trao đổi nội dung như đăng nhập, đăng ký, bình luận đều thông qua form và các thành phần khác liên quan.

Code mẫu

<form action="#" method="get">
Họ tên: <input type="text" name="hoten"><br />
Quê quán: <input type="text" name="quequan"><br />
<input type="submit" value="Submit">
</form>


Kết quả:

Họ tên:
Quê quán:

Trình duyệt hỗ trợ

Thẻ form được tất cả các trình duyệt thông dụng hỗ trợ, trong đó có Chrome, FireFox, Opera, Safari và IE.

Các thành phần trong form

Các thuộc tính

2 thuộc tính quan trọng hàng đầu trong form là action và method

Thuộc tính action

<form action="xuly.php" method="get">
Họ tên: <input type="text" name="hoten"><br />
Quê quán: <input type="text" name="quequan"><br />
<input type="submit" value="Submit">
</form>

Thuộc tính action dùng để xác định địa chỉ trang web mà những dữ liệu được nhập vào được gửi đến và xử lý, tùy vào ngôn ngữ lập trình web mà bạn có thể thấy đuôi file là php hoặc asp - Đoạn code ở form trên có nghĩa là thông tin về họ tên và quê quán được gửi tới file xuly.php

Thuộc tính method

<form action="xuly.php" method="post">
Họ tên: <input type="text" name="hoten"><br />
Quê quán: <input type="text" name="quequan"><br />
<input type="submit" value="Submit">
</form>


Thuộc tính method dùng để xác định cách thức dữ liệu được đẩy lên. Có 2 giá trị cho method:
  • get: dữ liệu sẽ được đưa lên và nhìn thấy được qua URL (và bạn sẽ thấy cặp tên=giá trị được gắn vào địa chỉ web), vì URL có chiều dài tối đa khoảng 3000 ký tự nên phương thức này không dành để gửi dữ liệu lớn. Ngoài ra vì dữ liệu đầu vào hiện trên URL nên phương thức này cũng không thích hợp với dữ liệu nhạy cảm - thí dụ như password. Tất nhiên ở phía ngược lại nó hợp với dữ liệu không nhạy cảm, chẳng hạn như các truy vấn tìm kiếm.
  • post: không giới hạn dung lượng dữ liệu, thích hợp với dữ liệu nhạy cảm, password chắc chắn phải dùng phương thức post.

Xử lý form

Thẻ textarea trong HTML

Thẻ textarea chuyên dụng trong Form, dùng để nhập văn bản. Thẻ input kiểu text cũng để nhập văn bản, nhưng thường là đoạn ngắn còn textarea được dùng để nhập cả đoạn văn bản dài.

Code mẫu:

<textarea rows="5" cols="40" placeholder="Gõ nội dung thông điệp vào đây">
</textarea>


Kết quả:

Trình duyệt hỗ trợ

Thẻ textarea được tất cả các trình duyệt phổ thông hỗ trợ, trong đó có Chrome, FireFox, Opera, Safari và IE.

Đặc điểm

  • Không giới hạn số ký tự nhập vào.
  • Kích thước của textarea được thay đổi thông qua thuộc tính rows và cols, nhưng cách tốt hơn để tác động đến kích thước là thông qua thuộc tính width và height trong CSS.

Các thuộc tính

#1. autofocus: khi vào trang thì con trỏ tập trung ngay lập tức tại textarea

Code:

<textarea rows="5" cols="40" autofocus>
</textarea>

Kết quả (nhấn phím F5 rồi kéo xuống đây - bạn sẽ thấy con trỏ chuột nhấp nháy trong ô textarea):



#2. cols - quy định chiều rộng tính theo số ký tự, rows - quy định số dòng

Code:

<textarea rows="5" cols="40">
</textarea>

Kết quả:



#3. disabled: vô hiệu hóa textarea

Code:

<textarea rows="5" cols="40" disabled>
</textarea>


Kết quả (bạn không thể gõ chữ vào texarea được nữa - vì nó đã bị vô hiệu hóa):



#4. form: quy định form mà textarea thuộc về.

Code:

<form action="#" id="yform">
Name: <input type="text" name="yname">
<input type="submit" value="Gửi">
</form>

<textarea name="comment" form="yform">Gõ vào đây...</textarea>

Kết quả (bạn có thể thấy textarea nằm ngoài thẻ form, nhưng nhờ thuộc tính form, trình duyệt vẫn biết rằng nó thuộc về form có id là yform):

Name:


#5. maxlength: số ký tự tối đa được phép nhập

Code:

<textarea rows="5" cols="40" maxlength="40">
</textarea>


Kết quả (bạn không thể nhập hơn 40 ký tự):



#6. name: tên của textarea - nó sẽ được dùng để định danh cho trường và là thông tin được gửi đi xử lý kèm văn bản được nhập.

Code:

<form action="xuly.php">
<textarea name="comment" rows="5" cols="40">Để lại bình luận của bạn.</textarea><br>
<input type="submit" value="Gửi">
</form>

Kết quả:


#7. placeholder: thông tin hướng dẫn, thường có màu xám và biến mất khi người dùng bắt đầu nhập dữ liệu



Code:

<textarea cols="40" placeholder="Văn bản màu xám này chính là placeholder" rows="5">
</textarea>

#8. readonly: quy định chỉ đọc văn bản trên textarea mà không cho nhập dữ liệu

Code:

<textarea rows="5" cols="40" readonly>
Bạn chỉ đọc được đoạn văn bản này mà không sửa hay thay đổi gì.
</textarea>


Kết quả:



#9. required: yêu cầu phải nhập văn bản mới được submit

Code:

<form action="#">
<textarea rows="5" cols="40" required>
</textarea><br >
<input type="submit" value="Submit">
</form>


Kết quả (bạn để trống textarea rồi nhấn Submit xem điều gì xẩy ra):


#10. wrap

    Wednesday, November 13, 2013

    Thẻ fieldset trong HTML

    Thẻ fieldset là thẻ chuyên dùng cho Form, nó có tác dụng nhóm các thành phần liên quan đến nhau trong Form.

    Code mẫu

    <form action="#">
    <fieldset>
    <legend>Thông tin cá nhân</legend>
    <label>Họ và tên: <input type="text" name="hoten"></label><br>
    <label>Quê quán<input type="text" name="quequan"></label>
    </fieldset>
    </form>

    Kết quả:

    Thông tin cá nhân

    Đặc điểm

    • Thẻ fieldset được hỗ trợ bởi tất cả các trình duyệt thông dụng, trong đó có Chrome, FireFox, Opera, Safari và IE.
    • Thẻ fieldset tạo đường viền màu xám xung quanh các thành phần mà nó nhóm lại.
    • Thẻ legend luôn đi kèm với fieldset, dùng để tạo tiêu đề cho nó. Trong thí dụ ở trên, đó chính là đoạn Thông tin cá nhân nằm trong legend. 

    Các thuộc tính mới

    • name: đặt tên cho fieldset
    • disabled: vô hiệu hóa fieldset
    • form: giúp bạn không cần lồng fieldset vào trong thẻ form nhưng vẫn chỉ định được nó thuộc về form nào.

    Monday, November 11, 2013

    Cách dùng thẻ label trong HTML

    Thẻ label dùng để định nghĩa nhãn cho các thẻ input trong HTML. Tác dụng của label là làm cho thao tác nhập liệu trở nên dễ dàng hơn.
    Code mẫu:

    <label for="hoten">Họ tên:</label><input type="text" name="hoten" id="hoten">

    Kết quả:


    Giờ bạn có thể nhấn vào chữ Họ tên để vào ô nhập liệu, hay nói cách khác, thẻ label làm tăng diện tích click chuột bắt đầu thao tác nhập. Nếu không có thẻ label, khi click vào chữ Họ tên sẽ không có điều gì xảy ra, giống như ví dụ dưới đây:

    Họ tên:

    Cú pháp của thẻ label

    Thẻ label yêu cầu thuộc tính for phải được điền giá trị, và giá trị trong thuộc tính id của input phải giống với giá trị trong thuộc tính for của label. Làm như thế để label biết được nó được dùng cho input nào.

    Mẹo

    Nếu bạn cho rằng cách dùng for và id lằng nhằng, thì bạn có thể không cần dùng nó mà vẫn cho kết quả tương tự, nhưng khi ấy bạn phải cho thẻ input nằm trong label, code mẫu:

    <label>Họ tên:<input type="text" name="hoten"></label>

    Kết quả:


    Các ví dụ khác

    Label  cho thẻ radio button




    Code mẫu:

    <form action="#">
    <label for="nam">Nam</label><input id="nam" name="gioi" type="radio" value="Nam" /
    <br />
    <label for="nu">Nữ</label><input id="nu" name="gioi" type="radio" value="Nữ" />
    <br />
    <input type="submit" value="Gửi" />
    </form>

    Sunday, November 10, 2013

    9 thẻ input thường dùng trong HTML

    Các thẻ input type chuyên dụng trong các form, dùng để nhập liệu, kiểu như: đăng ký, đăng nhập, liên hệ, gửi file...Hôm nay chúng ta sẽ xem xét các thẻ input phổ biến nhất.

    Các input đều giống nhau về cấu trúc, chỉ khác nhau về type. Chính type này quyết định kiểu của input. Có đến hơn 20 type khác nhau. Một số type input chỉ được hỗ trợ trong HTML5. Các type giới thiệu trong ngày hôm nay được tất cả các trình duyệt thông dụng hỗ trợ.

    Nhập text

    Ví dụ:

    Họ tên:

    Code mẫu:

    Họ tên: <input name="hoten" type="text" />

    Giá trị của thuộc tính name sẽ được dùng để lấy giá trị input, cả PHP và JavaScript đều căn cứ vào name để biết giá trị nằm trong input.

    Nhập password

    Ví dụ:

    Mật khẩu:

    Code mẫu:

    <input name="psw" type="password" />

    Vì là nhập password nên khi bạn gõ vào trường này nó sẽ hiện ra các dấu hoa thị *, để người khác không nhìn thấy mật khẩu.

    File đính kèm

    Ví dụ:

    Chọn ảnh của bạn:

    Code mẫu:

    <input type="file" name="anh">

    Button reset

    Tác dụng của nút nhấn reset là xóa các dữ liệu mà bạn nhập không đúng, giả dụ nhập tên và quê quán vào 2 trường dưới đây, rối nhấn reset xem điều gì xảy ra:

    Họ tên:
    Quê quán:
    Code mẫu:

    <form action="#">
    Họ tên: <input type="text" name="hoten"><br />
    Quê quán: <input type="text" name="que"><br />
    <input type="reset" value="Reset">
    </form>

    Button submit

    Tác dụng của nút nhấn submit là gửi dữ liệu, khi bạn nhập đầy đủ các trường, và nhấn submit thì dữ liệu từ các trường bạn nhập sẽ được gửi đến đâu đó để xử lý tiếp. Có thể nó sẽ được Validate bằng JavaScript để chuẩn hóa, sau đó gửi lên Server để ghi thông tin vào cơ sở dữ liệu bằng PHP (hoặc ngôn ngữ lập trình web khác).

    Ví dụ:
    Tên đăng nhập:
    Mật khẩu:

    Code mẫu:

    <form action="#">
    Tên đăng nhập: <input name="user" type="text" /><br />
    Mật khẩu: <input name="pass" type="text" /><br />
    <input type="submit" value="Submit" />
    </form>

    Ẩn input

    Họ tên:
    Code mẫu:

    <form action="#">
    Họ tên: <input type="text" name="hoten"><br>
    <input type="hidden" name="quocgia" value="Việt Nam">
    <input type="submit" value="Submit">
    </form>

    Bạn có thể thấy input có name là quocgia bị ẩn không hiện trong form. Tuy bị ẩn nhưng nếu chúng ta Submit nó giá trị "Việt Nam" vẫn được gửi đi.

    Radio button

    Dùng để chọn chỉ 1 trong nhiều lựa chọn, ví dụ:

    Nam
    Nữ
    Khác

    Code mẫu:

    <form action="#">
    <input name="gioitinh" type="radio" value="Nam" />Nam<br />
    <input name="gioitinh" type="radio" value="Nữ" />Nữ<br />
    <input name="gioitinh" type="radio" value="Khác" />Khác
    </form>

    Checkbox

    Dùng để chọn nhiều lựa chọn cùng lúc, có thể 1 hoặc nhiều, ví dụ:

    Bóng đá
    Bơi lội
    Điền kinh
    Cầu lông
    Võ thuật

    Code mẫu:

    <form action="#">
    <input name="thethao" type="checkbox" value="Bóng đá" />Bóng đá<br />
    <input name="thethao" type="checkbox" value="Bơi lội" />Bơi lội<br />
    <input name="thethao" type="checkbox" value="Điền kinh" />Điền kinh<br />
    <input name="thethao" type="checkbox" value="Cầu lông" />Cầu lông<br />
    <input name="thethao" type="checkbox" value="Võ thuật" />Võ thuật
    </form>

    Thông tin đầy đủ hơn về Checkbox và Radio button bạn có thể đọc để tham khảo thêm.

    Email

    Type cuối cùng tôi đề cập là email, sở dĩ như vậy vì type này chỉ được hỗ trợ trong HTML5 - tuy nhiên nói là vậy thôi, chứ chúng ta cũng không phải lo gì cả, vì input email đã được support tốt bới các trình duyệt. Code mẫu:

    <form action="#">
    Email: <input name="email" type="email" />
    <input type="submit">
    </form>

    Kết quả:

    Email:
    Nó validate email cho chúng ta rồi, nên bạn không cần viết JavaScript - trừ khi bạn muốn chuẩn hóa dữ liệu nhập vào cao hơn nữa.

    Friday, November 8, 2013

    Thực hành với thẻ select và option trong HTML

    Select và Option

    Thẻ select dùng để lựa chọn, ở khía cạnh nào đó nó giống với radio button, nhưng điểm khác biệt là select có kiểu dáng dạng drop-down menu (xổ xuống).
    Code mẫu:

    <select>
       <option value="0">Chọn giá nhà bạn muốn mua</option>
       <option value="34">Từ 300 triệu đến 400 triệu</option>
       <option value="46">Từ 401 triệu đến 600 triệu</option>
       <option value="68">Từ 601 triệu đến 800 triệu</option>
       <option value="812">Từ 801 triệu đến 1.2 tỷ đồng</option>
    </select>

    Kết quả:

    Thuộc tính name

    Đây là thành phần không thể thiếu của các thẻ nằm trong form, trong đó phải kể đến các thẻ input, textarea. Thẻ select cũng vậy, thuộc tính name cho phép JavaScript và các ngôn ngữ lập trình web như PHP lấy được dữ liệu mà người dùng nhập sau khi họ nhấn nút submit. Code mẫu:

    <select name="gianha">
       <option value="0">Chọn giá nhà bạn muốn mua</option>
       <option value="34">Từ 300 triệu đến 400 triệu</option>
       <option value="46">Từ 401 triệu đến 600 triệu</option>
       <option value="68">Từ 601 triệu đến 800 triệu</option>
       <option value="812">Từ 801 triệu đến 1.2 tỷ đồng</option>
    </select>

    Thuộc tính disabled

    Dùng để làm cả danh sách thả xuống hoặc một lựa chọn nào đó không khả dụng, ví dụ:



    Code mẫu:

    <select disabled name="gianha">
       <option value="0">Chọn giá nhà bạn muốn mua</option>
       <option value="34">Từ 300 triệu đến 400 triệu</option>
       <option value="46">Từ 401 triệu đến 600 triệu</option>
       <option value="68">Từ 601 triệu đến 800 triệu</option>
       <option value="812">Từ 801 triệu đến 1.2 tỷ đồng</option>
    </select>

    Giờ giả dụ các nhà có giá từ 300 - 400 triệu đã hết, bạn sẽ ngăn không cho người dùng chọn giá đó, các nhà có giá khác vẫn select được:



    <select name="gianha">
       <option value="0">Chọn giá nhà bạn muốn mua</option>
       <option disabled value="34">Từ 300 triệu đến 400 triệu</option>
       <option value="46">Từ 401 triệu đến 600 triệu</option>
       <option value="68">Từ 601 triệu đến 800 triệu</option>
       <option value="812">Từ 801 triệu đến 1.2 tỷ đồng</option>
    </select>

    Thuộc tính size

    Với size, bạn sẽ quy định xem có bao nhiêu lựa chọn được hiển thị ra ngoài. Như ở trên có 4 giá nhà, và hiển thị ra ngoài ngay cái nhìn đầu tiên chỉ là 1 (khi đã nhấn vào rồi thì sẽ hiện hết). Giờ nếu bạn có 9 lựa chọn và muốn hiển thị ra ngoài 4 lựa chọn. Ví dụ:



    Code mẫu:

    <select name="gianha" size="4">
       <option value="0">Chọn giá nhà bạn muốn mua</option>
       <option value="34">Từ 300 triệu đến 400 triệu</option>
       <option value="46">Từ 401 triệu đến 600 triệu</option>
       <option value="68">Từ 601 triệu đến 800 triệu</option>
       <option value="812">Từ 801 triệu đến 1.2 tỷ</option>
       <option value="812">Từ 1.2 tỷ đến 1.5 tỷ</option>
       <option value="812">Từ 1.5 tỷ triệu đến 2 tỷ</option>
       <option value="812">Từ 2 tỷ triệu đến 3 tỷ</option>
       <option value="812">Từ 3 tỷ triệu đến 5 tỷ</option>
    </select>

    Có một số chú ý:
    • Khi bạn sử dụng size lớn hơn 1, theo mặc định có ít nhất 4 lựa chọn sẽ hiện ra, tức là nếu bạn chọn size là 2, 3 hoặc 4 thì đều ra 4 lựa chọn hết. Từ 4 trở lên thì mới chính xác hoàn toàn, giả dụ để 5 thì có 5 lựa chọn, để 7 thì có 7 lựa chọn.
    • Nếu size lớn hơn 1 nhưng nhỏ hơn số khả năng lựa chọn thì sẽ xuất hiện thanh cuộn dọc để bạn kéo lên kéo xuống.

    Thuộc tính multiple

    Với multiple, bạn sẽ cho phép người dùng có nhiều lựa chọn cùng lúc thay vì chỉ một lựa chọn như mặc định:



    Giữ phím Ctrl và tick nhiều cái, với giả định là bạn có thể mua nhà từ giá thấp nhất đến gần cao nhất :)

    Code mẫu:

    <select multiple name="gianha">
       <option value="0">Chọn giá nhà bạn muốn mua</option>
       <option value="34">Từ 300 triệu đến 400 triệu</option>
       <option value="46">Từ 401 triệu đến 600 triệu</option>
       <option value="68">Từ 601 triệu đến 800 triệu</option>
       <option value="812">Từ 801 triệu đến 1.2 tỷ đồng</option>
    </select>

    Rõ ràng multiple làm cho select giống với checkbox hơn. Tuy nhiên cũng dễ thấy checkbox thì chuyên nghiệp hơn trong việc thiết kế ứng dụng đa lựa chọn.

    Nhóm các lựa chọn liên quan bằng optgroup

    Nếu bạn có một danh sách khá dài các chọn lựa, bạn có thể muốn nhóm các chọn lựa lại với nhau để người dùng dễ dàng quan sát và thao tác. Khi ấy bạn nên dùng thẻ optgroup. Code mẫu:

    <select name="gianha">
    <optgroup label="Dưới 500 triệu">
    <option value="499">499 triệu - 60m2</option>
    <option value="350">350 triệu - 40m2</option>

    <option value="250">250 triệu - 25m2</option>
    </optgroup>


    <optgroup label="Trên 500 triệu">
    <option value="700">700 triệu - 85m2</option>
    <option value="900">350 triệu - 100m2</option>

    <option value="1200">1.2 tỷ - 150m2</option>
    </optgroup>
    </select>

    Kết quả:



    Bạn có thể thấy các nhà có giá dưới 500 triệu được nhóm lại dưới nhãn được bôi đậm. Thẻ optgroup có 2 thuộc tính, ngoài thuộc tính label bạn đã thấy trong code ở trên, nó còn thuộc tính disabled dùng để vô hiệu hóa một nhóm lựa chọn, giả dụ, tất cả các nhà có giá dưới 500 triệu đã được bán hết, ta sẽ không cho người dùng có chọn lựa này, code mẫu:

    <select name="gianha">
    <optgroup label="Dưới 500 triệu" disabled>
    <option value="499">499 triệu - 60m2</option>
    <option value="350">350 triệu - 40m2</option>

    <option value="250">250 triệu - 25m2</option>
    </optgroup>
    <optgroup label="Trên 500 triệu">
    <option value="700">700 triệu - 85m2</option>
    <option value="900">350 triệu - 100m2</option>

    <option value="1200">1.2 tỷ - 150m2</option>
    </optgroup>
    </select>


    Kết quả:



    Như vậy là cả nhóm dưới 500 triệu đã không thể chọn lựa được.

    Thẻ radio button và checkbox trong HTML

    Thực ra chúng đều thuộc về nhóm thẻ input nhưng có thuộc tính type là radio button và checkbox. Nhóm thẻ input là không thể thiếu khi muốn làm Form nhập liệu và chúng thường xuyên kết hợp với Javascript để validate. Bên cạnh 5 type rất hay dùng gồm: text, password, submit, reset và email thì 2 type chuyên dụng để tạo các lựa chọn là Radio button và Checkbox bạn cũng cần nắm rõ.

    Radio button

    Type này được dùng để chọn một trong nhiều lựa chọn, chẳng hạn chọn giới tính, chọn quốc gia đang sinh sống. Code mẫu:

    <form>
    <input name="gioitinh" type="radio" value="Nam" />Nam<br />
    <input name="gioitinh" type="radio" value="Nữ" />Nữ<br />
    <input name="gioitinh" type="radio" value="Khác" />Khác
    </form>

    Kết quả:

    Nam
    Nữ
    Khác

    Nếu bạn không để name có cùng tên thì bạn sẽ chọn được 2 cái cùng lúc, do vậy cần lưu ý name khi dùng radio.

    Checkbox

    Radio buttons dùng để chọn chỉ một cái trong nhiều lựa chọn còn checkbox thì ngược lại, nó cho phép bạn không chọn lựa cái nào hoặc chọn nhiều cái (từ một cho đến tất cả), code mẫu:

    <form>
    <input type="checkbox" name="thethao" value="Bóng đá">Bóng đá<br>
    <input type="checkbox" name="thethao" value="Bơi lội">Bơi lội<br>
    <input type="checkbox" name="thethao" value="Điền kinh">Điền kinh<br>
    <input type="checkbox" name="thethao" value="Cầu lông">Cầu lông<br>
    <input type = "checkbox" name= "thethao" value="Võ thuật">Võ thuật
    </form>

    Kết quả:

    Bóng đá
    Bơi lội
    Điền kinh
    Cầu lông
    Võ thuật

    Thuộc tính checked

    Đây là thuộc tính được dùng để đánh dấu trước một lựa chọn nào đó, chẳng hạn một Form nhập liệu yêu cầu bạn nhập Quốc gia đang sinh sống, nhưng nó cũng xác định được địa chỉ IP của bạn xuất phát từ Việt Nam nên đã tick sẵn vào đây từ trước cho bạn. Điều này giúp bạn giảm thiểu các thao tác phải nhập. Ví dụ:

    Việt Nam
    Trung Quốc
    Nhật Bản
    Hàn Quốc

    Code mẫu:

    <form>
    <input checked="checked" name="gioitinh" type="radio" value="VN" />Việt Nam<br />
    <input name="gioitinh" type="radio" value="TQ" />Trung Quốc<br />
    <input name="gioitinh" type="radio" value="NB" />Nhật Bản<br />
    <input name="gioitinh" type="radio" value="HQ" />Hàn Quốc
    </form>

    Saturday, October 19, 2013

    Tạo Form đăng ký bằng Javascript và thẻ input


    Họ:
    Tên:
    Email:
    Số Điện Thoại:
    Số Lượng Mua:
    Ngày Nhận Hàng:
    Thanh Toán: Chuyển Khoản Trực Tiếp Khi Giao Hàng

    Làm form bằng HTML và chỉnh sửa lại giao diện cho đẹp với CSS không khó, bạn chỉ cần nhớ mấy cái input type là OK. Vấn đề nằm ở Validate, tức là chuẩn hóa dữ liệu nhập vào và một số yêu cầu khác nữa. HTML5 làm form cũng rất tốt, nhưng có hạn chế là chưa được hỗ trợ rộng rãi và thống nhất giữa các trình duyệt, do vậy chúng ta vẫn phải cậy nhờ khá nhiều vào Javascript. Về sau bạn sẽ biết ngoài việc bắt lỗi dữ liệu tại máy khách thì chúng ta còn phải kiểm tra dữ liệu một lần nữa tại Server cho chắc ăn bằng một ngôn ngữ lập trình web kiểu như PHP hoặc ASP.Net...Nhưng đấy là về sau! Hiện tại chúng ta chỉ quan tâm tới Javascript thôi nhé.

    Có vẻ chém gió hơi nhiều, giờ sẽ vào đề ngay. Chẳng hạn tôi có Form như đầu bài. Chúng ta phải bắt lỗi trong các trường hợp sau:
    • Người dùng không nhập dữ liệu
    • Người dùng không nhập đúng chuẩn email dạng aaa@bbb.ccc
    • Người dùng nhập chữ vào Số điện thoại hoặc nhập hơn 11 số
    • Người dùng nhập chữ vào Số lượng mua, hoặc con số nhỏ hơn hoặc bằng 0, hoặc lớn hơn hoặc bằng 100
    • Ngày nhận hàng không hợp chuẩn
    • Người dùng không chọn bất cứ hình thức thanh toán nào
    Thực tế là tôi đã viết code Javascript cho Form trên rồi, giờ bạn nhấn nút Đăng Ký Mua là biết liền, và thử xem nó có bắt lỗi đúng như yêu cầu không. Code mẫu:
    <script type="text/javascript">
    // JavaScript Document
        function validateForm() {
            //Họ phải được điền
            var ho = document.forms["myForm"]["ho"].value;
            if (ho == "") {
                alert("Họ không được để trống");
                return false;
            }
            //Tên phải được điền
            var ten = document.forms["myForm"]["ten"].value;
            if (ten == "") {
                alert("Tên không được để trống");
                return false;
            }
            //Email phải được điền chính xác
            var email=document.forms["myForm"]["email"].value;
            var aCong=email.indexOf("@");
            var dauCham = email.lastIndexOf(".");
            if (email == "") {
                alert("Email không được để trống");
                return false;
            }
            else if ((aCong<1) || (dauCham<aCong+2) || (dauCham+2>email.length)) {
                  alert("Email bạn điền không chính xác");
                  return false;
              }
              //Nhập số điện thoại
              var dienThoai = document.forms["myForm"]["dienThoai"].value;
              var kiemTraDT = isNaN(dienThoai);
              if (dienThoai == "") {
                  alert("Điện thoại không được để trống");
                  return false;
              }
              if (kiemTraDT == true) {
                  alert("Điện thoại phải để ở định dạng số");
                  return false;
              }
              //Nhập số lượng muốn mua
              var soLuong = document.forms["myForm"]["soLuong"].value;
              var kiemTraSL = isNaN(soLuong);
              if ((soLuong == "") || (soLuong <= 0)) {
                  alert("Số lượng không được để trống và phải lớn hơn 0");
                  return false;
              }
              if (soLuong > 100) {
                  alert("Số lượng mua không được lớn hơn 100");
                  return false;
              }
              if (kiemTraSL == true) {
                  alert("Số lượng mua phải để ở định dạng số");
                  return false;
              }
              //Chọn ngày nhận hàng
       var nm = document.forms["myForm"]["ngaymua"].value;
       if (nm == "") {
        alert("Ngày không được để trống");
        return false;
        }
        //Chọn kiểu thanh toán
              var ck = document.getElementById("ck");
              var tt = document.getElementById("tt");
        if ((ck.checked == false) && (tt.checked == false)) {
         alert("Bạn phải chọn một kiểu thanh toán");
         return false;
         }
    }
    </script>

    <br />
    <form action="#" method="post" name="myForm" onsubmit="return validateForm()">
    <table bgcolor="#DDDDDD" id="formdangky" style="width: 450px;">
    <tbody>
    <tr>
        <td class="tenhang" width="118">Họ:</td>
        <td width="320"><input name="ho" type="text" /></td>
      </tr>
    <tr>
        <td class="tenhang">Tên:</td>
        <td><input name="ten" type="text" /></td>
      </tr>
    <tr>
        <td class="tenhang">Email:</td>
        <td><input name="email" type="text" /></td>
      </tr>
    <tr>
        <td class="tenhang">Số Điện Thoại:</td>
        <td><input maxlength="11/" name="dienThoai" type="text" /></td>
      </tr>
    <tr>
        <td class="tenhang">Số Lượng Mua:</td>
        <td><input name="soLuong" type="text" /></td>
      </tr>
    <tr>
        <td class="tenhang">Ngày Nhận Hàng:</td>
        <td><input id="datepicker" name="ngaymua" type="text" /></td>
      </tr>
    <tr>
        <td class="tenhang">Thanh Toán:</td>
        <td><input id="ck" name="thanhToan" type="radio" value="chuyenKhoan" /> Chuyển Khoản
            <input id="tt" name="thanhToan" type="radio" value="trucTiep" /> Trực Tiếp Khi Giao Hàng
        </td>
      </tr>
    <tr>
        <td><input name="Submit" type="submit" value="Đăng Ký Mua" /></td>
        <td><input name="Reset" type="reset" value="Xóa" /></td>
      </tr>
    </tbody></table>
    </form>
    Bây giờ tôi sẽ giải thích code.

    Thẻ mở Form:

    <form name="myForm" action="#" onsubmit="return validateForm()" method="post">

    2 cái action="#" và method="post" được dùng cho việc gửi dữ liệu lên máy chủ server nên hiện bạn không cần phải quan tâm, chúng ta chỉ cần để ý đến tên của Form ở thuộc tính name="myForm" và nơi xử lý dữ liệu qua onsubmit="return validateForm()"

    validateForm() chính là tên hàm mà trong đó ta xây dựng code Javascript để bắt lỗi. Ta để onsubmit có nghĩa là, khi người dùng nhấn nút submit thì dữ liệu được chuyển đến hàm validateForm()

    Thẻ input

    Một thẻ input mẫu trong bài trên có dạng như này: <input name="ten" type="text" />

    Tôi sử dụng type là text, 6 trường đầu tiên tôi sử dụng type này, trường Thanh toán là type radio, nút Đăng Ký Mua là type submit, nút Xóa là type reset.

    Điều quan trọng trong thẻ input chính là name của nó. Chính thông qua name của Form và của Input mà Javascript lấy được dữ liệu nhập vào.

    Lấy dữ liệu từ input

    Đoạn code mẫu để lấy dữ liệu từ thẻ input: var ten = document.forms["myForm"]["ten"].value;

    Như đoạn code trên có nghĩa là bạn lấy giá trị của thẻ input có tên là "ten" trong Form có tên là "myForm" và gán giá trị lấy được này vào biến var ten

    Tương tự cho email: var email=document.forms["myForm"]["email"].value;

    Không được bỏ trống dữ liệu

    var ten = document.forms["myForm"]["ten"].value;
    if (ten == "") {
    alert("Tên không được để trống");
    return false;

    }

    Theo đó, sau khi lấy được dữ liệu từ thẻ input và gán vào biên ten, chương trình dùng hàm if để kiểm tra ten có rỗng hay không - if(ten==""). Nếu thỏa mãn điều kiện rỗng sẽ có hộp thông báo "Tên không được để trống" và ta dùng hàm alert để điều khiển tác vụ này, cuối cùng return false.

    Kiểm tra dữ liệu nhập vào có phải là số không

    var dienThoai = document.forms["myForm"]["dienThoai"].value;
    var kiemTraDT = isNaN(dienThoai);
    if (kiemTraDT == true) {
    alert("Điện thoại phải để ở định dạng số");
    return false;
    }


    Hàm dùng để kiểm tra số đó là isNaN - viết tắt của is Not a Number. Nếu isNaN trả về giá trị TRUE nghĩa là đó không phải là một số.

    Kiểm tra Email hợp chuẩn

    Có lẽ với đa số mọi người thì đây là code phức tạp nhất (với mình cũng thế). Địa chỉ email chính xác phải thỏa mãn điều kiện sau:
    • Phải có ký tự @
    • Trước @ phải có ít nhất 1 ký tự
    • Phải có ít nhất 1 dấu chấm trong email
    • Phải có ít nhất 1 ký tự đứng giữa @ và dấu chấm
    • Dấu chấm không được đứng ở vị trí cuối cùng
    var email=document.forms["myForm"]["email"].value;
    var aCong=email.indexOf("@");
    var dauCham = email.lastIndexOf(".");

    if (email == "") {
    alert("Email không được để trống");
    return false;
    }

    else if ((aCong<1) || (dauCham<aCong+2) || (dauCham+2>email.length)) {
    alert("Email bạn điền không chính xác");
    return false;
    }

    Chúng ta cần chú ý đến lệnh indexOf, nó sẽ xác định số ký tự đứng trước nó tính từ trái sang. Ví dụ, email ab@xy.com có giá trị email.indexOf("@") là 2 vì có 2 ký tự là a và b đứng trước @

    email.indexOf(".") có giá trị là 5 vì có 5 ký tự đứng trước dấu . là a, b, @, x, y

    Nếu không có ký tự cần tìm trong chuỗi, hàm indexOf sẽ trả về -1.

    Đến đây bạn tự hỏi email.lastIndexOf(".") có ý nghĩa gì. Hết sức chú ý chữ last. Lệnh này cũng là xác định số ký tự đứng trước dấu chấm nhưng là dấu chấm cuối cùng. Chẳng hạn email xyz.com@gmail.com, thế thì dấu chấm cuối cùng là dấu chấm sau chữ gmail chứ không phải sau chữ xyz. Giờ chúng ta cùng tìm hiểu ý nghĩa code.

    var aCong=email.indexOf("@");
    if (aCong<1)

    Chỉ có 2 trường hợp xảy ra khi aCong<1:
    • Không có @ trong địa chỉ email, lúc này email.indexOf("@") = -1
    • aCong = 0, nghĩa là không có ký tự nào đứng trước @, hay email nhập vào có dạng @klm.com - tức là không hợp chuẩn
    • Vậy là với câu lệnh trên ta đã ép dữ liệu phải có @, và trước @ phải có ký tự
    Sau @ phải có ít nhất 1 ký tự sau đó mới đến dấu chấm do đó, email hợp chuẩn thì số ký tự đứng trước dấu chấm luôn lớn hơn số ký tự đứng trước @ ít nhất 2 đơn vị - tức là dauCham >= aCong + 2, ngược lại điều này thì email đó không hợp lệ, nói cách khác là: dauCham < aCong + 2

    Lệnh trên chúng ta đã ép phải tồn tại dấu chấm trong email, ngoài ra nó cũng buộc giữa dấu chấm cuối cùng và email phải có ít nhất 1 ký tự.

    Tiếp đến ta xem xét câu lệnh ngăn không cho dấu chấm là ký tự cuối cùng trong email.

    var dauCham = email.lastIndexOf(".");
    dauCham+2>email.length
    • email.length xác định số ký tự của email
    • Sau dấu chấm cuối cùng phải có ít nhất 1 ký tự do vậy nếu dauCham + 2 > email.length nghĩa là email đó không hợp chuẩn.

    Friday, October 18, 2013

    Cách dùng thẻ input để làm Form trong HTML5

    Email:

    Làm Form trong HTML5 đơn giản hơn nhiều HTML thường, lý do nằm ở chỗ bạn không cần dùng Javascript để Validate (bắt lỗi dữ liệu) các trường nữa. Tất nhiên điều này không tuyệt đối, một số cái vẫn phải dùng Javascript, nhưng gì thì gì, chơi với HTML5, code mà bạn phải gõ sẽ ít hơn nhiều lần. Hiện trình duyệt Google Chrome hỗ trợ tốt nhất các thẻ input mới, do vậy tôi khuyên bạn nên dùng anh bạn này để xem các ví dụ trong bài viết.

    Tôi sẽ bắt đầu luôn với thẻ input mà bạn thường xuyên phải bắt lỗi, đó là email. Nếu HTML thường bạn sẽ phải viết code JS khá dài thì với HTML5, bạn chỉ cần ghi: <input type="email">. Giờ bạn thử gõ một đoạn không phải email chuẩn rồi nhấn Gửi xem điều gì xẩy ra. Thẻ email được hỗ trợ tốt trên đa số trình duyệt, ngoại trừ Safari.

    Email:
    Đoạn code mẫu cho form trên là:

    <form action="#">
    Email: <input name="email" type="email" />
     <input type="submit" />
    </form>

    Bạn cũng còn nhớ, một yêu cầu khác mà chúng ta thường phải làm với Form, đó là không cho phép người dùng bỏ trống dữ liệu. Code JS cho điều này rất đơn giản, nhưng HTML5 còn đơn giản hơn! Bạn chỉ cần thêm thuộc tính required vào, cụ thể: <input type="email" required>

    Email:
    Bạn để trống và nhấn nút Gửi (submit) xem sao.

    Như vậy, HTML5 không chỉ thêm các thẻ mới, nó còn thêm các thuộc tính mới nữa mà required ở trên là ví dụ.

    Thuộc tính mới tiếp theo cũng rất hay dùng đó là placeholder, đây là đoạn văn bản trong thẻ input để nhắc người dùng nên nhập cái gì, ví dụ dòng chữ nhạt màu "Bạn nhập họ tên vào đây" được tạo bằng placeholder:

    Họ tên:
    Code mẫu:

    <form action="#">
    Họ tên: <input name="name" placeholder="Bạn nhập họ tên vào đây" required="" type="text" />
    <input type="submit" />
    </form>

    Sau đây là các kiểu input mới khác trong HTML5...

    Thẻ color - chọn màu

    Chọn màu cho bạn:
    Code mẫu:

    <form action="#">
      Chọn màu cho bạn: <input type="color" name="mausac"><br>
      <input type="submit">
    </form>

    Hiện chỉ có Chrome và Opera hỗ trợ thẻ màu.

    Thẻ number - số má

    Nhập giá trị từ 1 đến 10:
    Code mẫu:

    <form action="#">
      Nhập giá trị từ 1 đến 10: <input type="number" name="quantity" min="1" max="10">
      <input type="submit">
    </form>

    Với thẻ number bạn buộc phải nhập số, thẻ number bổ sung thêm các thuộc tính giá trị nhỏ nhất min, giá trị lớn nhất max. Ngoài ra còn cả thuộc tính step - bước nhảy. Hiện thẻ number chưa được hỗ trợ trên FireFox.

    Thẻ day - ngày tháng năm

    Ngày sinh:
    Code mẫu:

    <form action="#">
      Ngày sinh: <input type="date" name="ngaysinh">
      <input type="submit">
    </form>

    Thẻ day sẽ giúp bạn nhanh chóng lấy ngày tháng năm cụ thể và dĩ nhiên bạn cũng không cần code để validate nữa, vì với thẻ này người dùng chỉ có thể nhập ngày tháng năm vào mà thôi.

    Thẻ URL - thêm địa chỉ website

    Địa chỉ web:
    Code mẫu:

    <form action="#">
      Địa chỉ web: <input type="url" name="page"><br>
      <input type="submit">
    </form>

    Thẻ này đa số các trình duyệt hỗ trợ, chỉ Safari là chưa. Yêu cầu nhập địa chỉ trang web phải có cả http://

    Sunday, August 25, 2013

    Xử lý form ngay tại trang trong PHP


    Thông thường khi làm việc với form, chúng ta lấy dữ liệu từ thẻ input,  texarea, select, radio button và checkbox rồi chuyển nó sang trang php khác để thực hiện các yêu cầu. Hôm nay tôi sẽ giới thiệu với các bạn cách xử lý form ngay tại trang - tức là không cần chuyển nó sang trang khác nữa.

    Câu hỏi đầu tiên có lẽ là, xử lý ngay tại trang có lợi ích gì không? Câu trả lời là như này, trước hết chuyển xử lý sang trang khác không phải lúc nào cũng là biện pháp hay, chẳng hạn với bài tập làm máy tính bỏ túi đơn giản, sau khi chuyển dữ liệu sang trang action.php để tính toán tôi đã phải bổ sung giao diện giống trang index vào trang action.php để hiển thị kết quả cho người dùng. Nếu tôi xử lý ngay tại trang index.php thì tôi không phải làm lại giao diện ở trang action.php nữa.

    Quay lại chính bài tập ngày xưa ấy, giờ tôi sẽ chuyển đổi code. Lúc này vì xử lý ngay tại trang, nên ở form tôi phải thay đổi một số thứ và gắn thêm vài đoạn code (Bạn nên xem lại code của cách làm ngày xưa để hiểu những thay đổi được tiến hành trong bài viết này):

    <form action="index.php" method="get">
        <input type="text" name="so_thu_nhat" value="<?php echo $so_thu_nhat ?>" size="10">
        <input type="text" name="toan_tu" value="<?php echo $toan_tu ?>" size="5">
        <input type="text" name="so_thu_hai" value="<?php echo $so_thu_hai ?>" size="10">
        =
        <input type="text" value="<?php echo $ketqua ?>" size="10">
        <input type="submit" value="Tính" name="action">
    </form>

    Bạn có thể nhận thấy ở thuộc tính action thay vì để action.php, tôi để index.php - tức là gọi lại chính trang đang nhập dữ liệu. Tiếp theo tôi phải bổ sung value bằng lệnh echo cho các thẻ input để khi người dùng nhấn tính các con số mà họ vừa nhập vào không bị mất hiển thị.

    Cuối cùng tôi lấy code từ trang action.php để đưa sang index.php, nhưng có một vấn đề là khi khởi động trang lần đầu tiên, các giá trị $so_thu_nhat, $toan_tu, $so_thu_hai, $ketqua không tồn tại nên trang sẽ báo lỗi. Để sửa lỗi này chúng ta để các giá trị trên là rỗng (rỗng và không tồn tại là khác nhau - một cái là rỗng nhưng nó vẫn tồn tại) khi khởi động trang lần đầu tiên.

    Câu hỏi tiếp theo lại là, làm sao biết được khi nào trang khởi động lần đầu tiên để mà gán giá trị rỗng $so_thu_nhat, $toan_tu, $so_thu_hai, $ketqua ???

    Bạn để ý thì sẽ thấy khi trang được bật lên lần đầu tiên thì lúc đó nút Tính chưa được nhấn - tức là chưa được submit. Chúng ta sử dụng chính dấu hiệu này để gán các giá trị rỗng, code như sau:

    <?php

    if (!isset($_GET['action']) || $_GET['action']=="") {
    $so_thu_nhat="";
    $so_thu_hai="";
    $toan_tu="";
    $ketqua="";
    }

    Chính cái $_GET['action'] sẽ lấy thông tin từ thuộc tính name của thẻ input có type là submit (nút nhấn). Khi nút chưa được nhấn thì có nghĩa là chẳng có giá trị nào cho $_GET['action'] cả, khi nó được nhấn thì $_GET['action'] sẽ bằng Tính.

    Đoạn code trên chính là cái chúng ta cần - nó được hiểu là nếu nút Tính chưa được nhấn thì gán các giá trị là rỗng cho các biến...

    Câu hỏi cuối cùng, nếu nút Tính được nhấn thì sao, đây là thời điểm mà chúng ta phải quay lại trang action.php để lấy lại đoạn code xử lý.

    Kết quả của tất cả các thao tác trên là đoạn code ngay dưới đây, bạn có thể copy nó và chạy thử trên local host:

    <?php

    if (!isset($_GET['action']) || $_GET['action']=="") {
    $so_thu_nhat="";
    $so_thu_hai="";
    $toan_tu="";
    $ketqua="";
    }
    else {
        $so_thu_nhat=$_GET['so_thu_nhat'];
        $so_thu_hai=$_GET['so_thu_hai'];
        $toan_tu=$_GET['toan_tu'];

        if (empty($so_thu_nhat) || empty($toan_tu) || empty($so_thu_hai)) {
            echo 'Canh bao: Ban nhap thieu du lieu !!!';
            exit();
        }

        if (!is_numeric($so_thu_nhat) || !is_numeric($so_thu_hai )) {
            echo 'Canh bao: Ban phai nhap so !!!';
            exit();
        }

        if ($toan_tu == '+') {
            $ketqua=$so_thu_nhat + $so_thu_hai;
        }
        else if ($toan_tu == '-') {
            $ketqua=$so_thu_nhat - $so_thu_hai;
        }
        else if ($toan_tu == '/') {
            $ketqua=$so_thu_nhat / $so_thu_hai;
        }
        else if ($toan_tu == '*') {
            $ketqua=$so_thu_nhat * $so_thu_hai;
        }
        else {
            echo 'Canh bao: Toan tu ban nhap vao khong chinh xac !!!';
            exit();
        }
    }
    ?>

    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title></title>
        </head>
        <body>

    <form action="index.php" method="get">
        <input type="text" name="so_thu_nhat" value="<?php echo $so_thu_nhat ?>" size="10">
        <input type="text" name="toan_tu" value="<?php echo $toan_tu ?>" size="5">
        <input type="text" name="so_thu_hai" value="<?php echo $so_thu_hai ?>" size="10">
        =
        <input type="text" value="<?php echo $ketqua ?>" size="10">
        <input type="submit" value="Tính" name="action">
    </form>

        </body>
    </html>