Form (mẫu đơn điền) là công cụ để trang web của bạn gửi thông tin đến server.
Chúng tôi không cho các trang web trong Khan Academy tương tác với server
vì lí do an ninh,
nên chúng tôi không dạy về form ở đây.
Nhưng giờ bạn đang học JS để làm việc với trang web,
nên tôi có thể cho bạn xem cách dùng JS để xử lí element trong form
mà không cần gửi tới server.
Tôi đã viết một số element trong form này đây để cho biết name (tên) của người dùng,
và language (ngôn ngữ) họ dùng.
Tôi muốn trang web này chào người dùng theo ngôn ngữ đó
khi click vào nút này.
Việc đầu tiên là lưu element của nút vào một biến,
ta sẽ viết document.getElementById("button").
Tiếp theo là định nghĩa một hàm event listener,
`var onButtonClick = function() {`
rồi ở trong này, ta sẽ hiện ra một dòng message,
viết là `document.getElementById("message")`,
và message đó sẽ là một 'div'.
có nội dung là textContent += "You clicked me! Thank you so much!".
Div để cám ơn.
Cuối cùng ta sẽ thêm một event listener cho button
để khi click vào thì sẽ gọi hàm kia.
vậy nên là `("click", onButtonClick)`.
Bạn hãy dừng video lại và thử xem có hoạt động đúng không.
Giờ ta sẽ thay đổi nội dung dòng chữ tuỳ theo nội dung trong form.
Ta cần lấy được dữ liệu mà người dùng nhập vào trong form kia.
Hãy tạo một variable cho nó,
viết là `var name = document.getElementById`,
và element đó có id,
nên ta nhập id vào đây.
Giờ ta tạo một string mới để chào người dùng, rồi thêm cái "name" vào sau,
viết là `var greeting = "Heyaz ,"`, để chào,
` + name`.
Okay, giờ ta có một string, kèm theo dữ liệu trong biến kia.
Ta sửa cái textContent này thành greeting.
Xem nào, có vẻ được rồi.
Ta nhận vào input của name, tạo một string để chào,
và đưa string đó vào trong div message.
Bạn hãy dừng video lại thử xem có được không.
Không được, phải không?
bạn có thấy "Heyaz [object Object]", hay là
Giả sử tên bạn không phải là 'Object'
- nếu tên bạn thế thì cũng không sao cả -
thì tức là chương trình có lỗi rồi.
Ta muốn hiện ra đúng cái tên ta nhập vào cơ mà,
nhưng lại chỉ thấy chữ "object".
Thế tức là cái biến 'name' đang trỏ tới một object (đối tượng),
chữ không phải trỏ tới string của tên.
Có khi tự bạn cũng đã thấy được nguyên do lỗi này rồi.
Ta gán cả đối tượng element vào biến 'name,'
mà đối tượng element đó thì lại là một đối tượng to,
có nhiều thông tin về element ở trong:
có các thuộc tính, các hàm.
Để biết được nội dung người dùng nhập vào là gì, ta phải truy cập tới một thuộc tính riêng
trong element: là 'value'.
Tôi sẽ gõ thêm '.value' vào, thế là sửa được rồi.
Bạn hãy dừng video lại mà thử xem.
Được rồi đúng không?
Vừa rồi là một lỗi khác thường gặp khi lập trình, bạn nên cẩn thận.
Tôi sẽ cho bạn xem một lỗi thường gặp nữa.
Tôi kéo dòng này ra ngoài hàm.
Bạn dừng video lại mà thử xem,
bạn sẽ thấy
một string rỗng ở chỗ tên.
Bạn có biết tại sao không?
Lí do nằm ở trong thứ tự các dòng code được chạy.
Trong code này, trình duyệt hiện trang web lên,
chạy các code JS từng dòng một.
Đầu tiên, gán button vào một biến.
Sau đó, lưu giá trị của input vào một biến nữa.
Giá trị này được lưu vào lúc trang web hiện ra,
tức là chưa có giá trị gì cả.
Sau đó mới định nghĩa hàm và event listener.
Khi gọi hàm listener, cái 'name' vẫn mang giá trị của string
khi trang web hiện lên,
chứ listener không biết được giá trị sau khi người dùng nhập vào là gì.
Đấy là lí do dòng code này
phải đặt ở trong hàm event listener,
thì nó mới biết được giá trị của input khi event xảy ra.
Ta sẽ thêm code nữa để lấy giá trị của 'language',
để bạn hiểu rõ hơn.
Ở trong listener, tôi sẽ lưu giá trị của 'language' trong một biến 'lang'.
Vào lề xấu quá. Ugh, look at this indenting,
Sắp đặt lại các hàng này nào...
Okay...
[gõ]
bạn thấy rằng tôi đang đặt tên biến ở đây giống như tên id ở trên,
đấy là tôi thích thế, còn bạn đặt tên thế nào cũng được.
Giờ tôi sẽ hiện ra một message khác tuỳ theo language mà người dùng chọn.
Để ý rằng 'value' không phải là dòng chữ hiện ra ở trong menu drop-down,
mà là thuộc tính value ở trong HTML.
Vậy nên 'lang' sẽ có thể có các giá trị là "en", "es", hoặc là "plt".
Thế nên
thì câu chào sẽ là "Hola, ".
Ta sẽ tạo biến greeting ở đây.
Đặt 'greeting' là "Hola ," cộng thêm tên.
Còn nếu lang là "plt", tức là Pig Latin,
thì câu chào sẽ là "Ello-hay, " cộng thêm tên,
rồi thêm dòng 'else' cho tiếng Anh.
Ta chuyển cái này vào đây.
Được rồi.
Nếu bạn muốn tự thách đố mình thì
hãy thử đổi cả tên ra tiếng Pig Latin nữa,
Để toàn bộ câu chào đều là Pig Latin.
Thế là chuẩn luôn.
Giờ hãy dừng video lại, nhập tên bạn vào,
chọn một ngôn ngữ khác mà thử xem.
Hay không?
Có rất nhiều thứ để làm với form input với JS,
word game, number game, viết truyện,...
Và nếu bạn có sử dụng server ngoài Khan Academy,
bạn có thể dùng JS để xử lí input trong form
trước khi gửi tới server.
Còn có nhiều event khác trong form để listen nữa,
ví dụ như là 'keypress' hay 'focus'.
Bạn hãy nhớ để ý đọc 'value' của input,
và đọc value đó sau lúc event xảy ra.
Bạn sẽ được thực hành ngay trong bài sau,