- vừa được xem lúc

[JavaScript] Bài 5 - Document & Event

0 0 8

Người đăng: Semi Art

Theo Viblo Asia

Trong bài viết này, chúng ta sẽ cùng nói về một object dựng sẵn, hỗ trợ các thao tác chỉnh sửa cấu trúc văn bản HTML và các thuộc tính CSS. Đồng thời, chúng ta cũng sẽ tìm hiểu cách để khiến một thành phần trong trang web có thể tương tác với người dùng. Hãy bắt đầu với object document.

Object document

Do document đã được khởi tạo sẵn, chúng ta sẽ không cần phải quan tâm đến việc nó đã được tạo ra như thế nào; Và mục đích của chúng ta ở đây chỉ đơn giản là khám phá cách sử dụng để chỉnh sửa cấu trúc văn bản HTML và các thuộc tính CSS. Trước khi thảo luận, bạn có thể xem lướt qua danh sách liệt kê các thành phần được đóng gói trong document trong liên kết tham khảo sau: Tài liệu về object document.

Nói riêng về tác vụ chỉnh sửa cấu trúc văn bản HTML, object document cung cấp cho chúng ta một vài khả năng được liệt kê dưới đây:

  1. Tìm kiếm và chỉnh sửa các phần tử HTML nhất định.
  2. Tạo ra các phần tử mới và thay đổi cấu trúc của văn bản HTML.
  3. Gắn các cảm biến sự kiện (các hành động) vào các thành phần tương tác với người dùng.

Song song với việc tìm hiểu về object document, chúng ta sẽ áp dụng một vài tính năng của document để tạo ra một danh sách dạng sổ xuống dropdown; Vì vậy nên mình đã chuẩn bị code HTML và CSS ở đây, và chúng ta có thể bắt đầu ngay với phần thảo luận về code JavaScript.

dropdown.html

<!doctype html>
<html lang="en"> <head> <meta charset="utf-8"> <title>Một cái dropdown kỳ lạ :D</title> <link rel="stylesheet" href="dropdown.css"> </head> <body> <div class="dropdown"> <button id="btn-show" class="dropdown-btn primary"> Show List &#9662; </button> <button id="btn-hide" class="dropdown-btn secondary"> Hide List &#9652; </button> <div id="the-list" class="dropdown-list shown"> <a href="#">The rose is red</a> <a href="#">The sky is sunny</a> <a href="#">The river is blue</a> <a href="#">The grass is green</a> </div> </div><!-- .dropdown --> <script src="dropdown.js"></script> </body>
</html>

dropdown.css

.dropdown { font-family: Arial, sans-serif; font-size: 16px; display: inline-block; position: relative;
} .dropdown-btn { font-size: 14px; font-weight: bold; letter-spacing: 1px; padding: 15px 30px; color: White; border: none; cursor: pointer;
} .dropdown-btn.primary { background: RoyalBlue;
} .dropdown-btn.primary:hover { background: DodgerBlue;
} .dropdown-btn.secondary { background: DarkGray;
} .dropdown-btn.secondary:hover { background: LightGray;
} .dropdown-list { position: absolute; top: 108%; overflow: hidden; transition: max-height 0.5s linear;
} .dropdown-list.shown { max-height: 420px;
} .dropdown-list.hidden { max-height: 0;
} .dropdown-list > a { display: block; min-width: 245px; max-width: 335px; padding: 15px 25px; color: White; background: RoyalBlue; border-bottom: 1px solid DodgerBlue; text-decoration: none;
} .dropdown-list > a:hover { background: DodgerBlue;
}

Và đây là kết quả mà chúng ta dự kiến với dropdown hoạt động tốt.

Xem kết quả hiển thị

Bạn có thể nhận thấy là dropdown này có hơi kỳ lạ một chút. Thông thường thì một dropdown chỉ có 1 nút nhấn nhưng dropdown mà chúng ta đang xây dựng ở đây lại có 2 nút nhấn. Chúng ta sẽ nói về điểm kỳ lạ này ở phần cuối bài. Mà bạn đừng nhìn vào code JS trên CodePen nhé. Chúng ta sẽ tiến hành viết code xử lý từ đầu; Công việc này khá đơn giản và sẽ không tốn nhiều thời gian đâu. 😄

1. Tìm kiếm & Chỉnh sửa các phần tử

Object document thực ra là một bản mô phỏng của phần tử gốc của văn bản HTML được tạo ra bởi các thẻ <html>. Tất cả các phần tử xếp chồng bên trong cũng được mô phỏng lại bởi các object tương ứng và đóng gói bên trong document với cấu trúc xếp chồng giống với cấu trúc của văn bản HTML. Hãy thử lấy ra 2 phần tử con của <html><head><body>.

dropdown.js

var head = document.head;
console.log(head);
// một object mô phỏng phần tử <head> var body = document.body;
console.log(body);
// một object mô phỏng phần tử <body>

Các object như head, body, và các phần tử khác, được tạo ra từ một class cơ sở được lập tài liệu trong liên kết tham khảo sau: object Element.

Xuất phát từ một phần tử bất ký, chúng ta có thể truy xuất tới phần tử cha, anh chị em, và con cháu như thế này.

dropdown.js

var body = document.body;
// xuất phát từ <body> var html = body.parentElement;
// phần tử cha là <html> var head = body.previousSiblingElement;
// anh chị là <head> var dropdown = body.firstElementChild;
// con đầu là <div class="dropdown"> var script = body.lastElementChild;
// con út là <script>

Việc di chuyển giữa các phần tử xếp chồng bằng cách truy xuất bằng các biến tham chiếu như trên sẽ hơi bất tiện một chút nếu như chúng ta muốn chọn tới một phần tử được xếp chồng khá sâu trong kiến trúc HTML. Vì vậy nên có một cách làm khác đó là thực hiện tìm kiếm bằng các hàm đóng gói trong document. Dưới đây là cách tìm kiếm một phần tử bằng id.

dropdown.js

var theList = document.getElementById('the-list');
console.log(theList);
// phần tử khởi tạo danh sách trong `dropdown`

Bây giờ thì chúng ta đã biết cách tìm kiếm các phần tử đặc định. Hãy thử thay đổi nội dung văn bản của một phần tử nào đó. Từ tài liệu về object Element thì chúng ta có tên biến mô phỏng nội dung bên trong các phần tử là textContent.

dropdown.js

var theList = document.getElementById('the-list');
var firstItem = theList.firstElementChild; console.log( firstItem.textContent );
// 'The rose is red' firstItem.textContent = 'The flower is dancing';
// Thay thế nội dung mới vào `textContent`

Việc truy xuất và chỉnh sửa giá trị của các thuộc tính HTML cũng có thể được thực hiện với cách thức tương tự như nội dung văn bản. Chúng ta chỉ cần tìm tên các biến liên quan được liệt kê trong tài liệu về object Element hoặc console.log phần tử mà chúng ta đang làm việc để xem tên của các biến được đóng gói. Trong ví dụ dưới đây, biến className được sử dụng để tham chiếu tới thuộc tính class của #the-list.

dropdown.js

var theList = document.getElementById('the-list'); console.log( theList.className );
// 'dropdown-list shown' theList.className = 'dropdown-list hidden';
// thay đổi class để ẩn danh sách

Bây giờ thì chúng ta đã biết cách để ẩn đi danh sách sổ xuống của dropdown. Bằng việc thay đổi qua lại giữa 2 class CSS .shown.hidden, chúng ta có thể thay đổi trạng thái hiển thị của danh sách sổ xuống #the-list. Tiếp theo chúng ta cần tìm hiểu cách thức để gắn các thao tác xử lý này vào các nút nhấn để dropdown có thể hoạt động.

3. Xử lý các sự kiện để tương tác với người dùng

Khi một click chuột được thực hiện trên một nút nhấn, trình duyệt web sẽ phát động một sự kiện event và kích hoạt các hàm xử lý biến sự kiện (nếu có). Để gắn một thao tác xử lý sự kiện vào một phần tử, cách đơn giản nhất là lưu thao tác đó vào biến onclick của phần tử đó.

dropdown.js

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Actions */ function showList(event) { var theList = document.getElementById('the-list'); theList.className = 'dropdown-list shown';
} function hideList(event) { var theList = document.getElementById('the-list'); theList.className = 'dropdown-list hidden';
} /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Main */ var btnShow = document.getElementById('btn-show');
btnShow.onclick = showList; var btnHide = document.getElementById('btn-hide');
btnHide.onclick = hideList;

Các phần tử HTML có thể tiếp nhận nhiều kiểu sự kiện khác nhau như:

  • Các sự kiện tạo ra bởi thao tác sử dụng chuột máy tính.
  • Các sự kiện tạo ra bởi thao tác sử dụng bàn phím.
  • Các sự kiện tạo ra bởi đáp ứng của trình duyệt web.
  • Các sự kiện tự định nghĩa của người viết code.

Bạn có thể tự làm các ví dụ dùng thử các kiểu sự kiện khác được liệt kê trong liên kết tham khảo sau: Các kiểu sự kiện của object mô phỏng HTML.

Nói về biến event được khai báo nhưng chưa được sử dụng tới trong các hàm showListhideList ví dụ ở trên; Khi một sự kiện được phát động, trình duyệt web sẽ tạo ra một object để mô tả sự kiện này và truyền vào các hàm xử lý sự kiện. Object event này cung cấp nhiều thông tin hữu dụng trong một vài tình huống. Bạn có thể console.log để biết thêm về nó hoặc sử dụng liên kết thao khảo sau: Object Event.

Trường hợp ứng dụng phổ biến nhất của object event là để xác định phần tử đích target trực tiếp nhận sự kiện; Hoặc để xác định phím được nhấn khi làm việc với các sự kiện tạo ra bởi thao tác người dùng sử dụng bàn phím.

4. Khởi tạo các phần tử mới & Chỉnh sửa cấu trúc văn bản HTML

Có thể bạn cũng để ý và thấy rằng danh sách của dropdown trong kết quả hiển thị có nhiều hơn một vài phần tử so với code HTML. Các phần tử này được tạo ra bằng cách sử dụng JavaScript. Hãy cùng viết một hàm thực hiện công việc này. Chúng ta sẽ sử dụng tên hàm là addNewItem nhận vào nội dung văn bản của phần tử mới qua biến text. Công việc thực hiện bên trong addNewItem bao gồm 2 thao tác là:

  • Tạo ra một object mô phỏng phần tử mới với nội dung được truyền vào qua text.
  • Gắn object mới được tạo ra vào văn bản HTML, đứng sau phần tử cuối cùng mà danh sách dropdown đang có.

dropdown.js

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Actions */ /* ... */ function addNewItem(text) { var newItem = createItem(text); showItem(newItem);
} function createItem(text) { var newItem = document.createElement('a'); newItem.textContent = text; newItem.href = '#'; return newItem;
} function showItem(item) { var theList = document.getElementById('the-list'); theList.appendChild(item);
} /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Main */ /* ... */ addNewItem('The emptiness ...');
addNewItem('The grace ...');
addNewItem('The gratitude ...');

Ở đây chúng ta sẽ thảo luận về 2 thao tác bên trong hàm addNewItem. Thao tác đầu tiên là tạo ra một object mô phỏng phần tử mới của dropdown bằng cách gọi hàm createItem được định nghĩa bên dưới và lưu object mới vào biến newItem.

Nội dung text được truyền vào addNewItem tiếp tục được sử dụng để truyền vào createItem để chèn vào trong object mô tả phần tử mới. Lúc này bên trong hàm createItem thì một object mới mô tả một phần tử <a href="#"> được tạo ra bằng cách gọi hàm createElement đóng gói trong document. Hàm createElement như trong tài liệu tham khảo yêu cầu đầu vào là một string mô tả tên của thẻ muốn tạo ra. Các thao tác gắn nội dung chữ cho phần tử <a> và chỉnh sửa thuộc tính href đều được thực hiện bằng việc sử dụng các biến liên quan. Sau đó object mô tả phần tử mới được trả về vị trí hàm được gọi ở addNewItem.

Thao tác thứ hai bên trong addNewItem là hiển thị phần tử mới trong văn bản HTML được thực hiện bằng cách gọi hàm hỗ trợ showItem được định nghĩa bên dưới. Phần tử mới được truyền vào showItem. Lúc này câu lệnh đầu tiên bên trong hàm showItem sẽ truy xuất object phần tử mô phỏng container của danh sách sổ xuống #the-list và lưu vào biến theList. Sau đó chúng ta đã gọi hàm appendChild đóng gói trong Element #the-list để gắn phần tử mới vào vị trí cuối cùng trong danh sách.

Như vậy là chúng ta đã biết cách thực hiện các thao tác: chỉnh sửa một phần tử, bổ sung thêm một phần tử mới, và có thể bạn cũng muốn tìm hiểu thêm cách để xóa một phần tử nữa. Để thực hiện thao tác này thì đầu tiên bạn sẽ cần truy xuất được chính xác phần tử muốn xóa; Sau đó gọi hàm removeChild của Element #the-list. Nghe chừng cũng rất đơn giản phải không? 😄 Vậy bạn hãy dành thời gian tự viết code thử nghiệm nhé. 😄

Các liên kết tham khảo:

Nói về điểm kỳ lạ của dropdown này

Phần chính của bài viết về documentevent của chúng ta đã hoàn thành rồi. Ở đây chúng ta sẽ thảo luận một chút về điểm kỳ lạ của dropdown mà chúng ta đã xây dựng.

Thông thường thì một dropdown sẽ chỉ có một nút nhấn duy nhất để đảm nhiệm cả 2 tác vụ: hiển thị & ẩn danh sách. Điều đó có nghĩa là chúng ta chỉ có thể có một hàm duy nhất để xử lý sự kiện click chuột của người dùng. Như vậy thì logic hoạt động của hàm xử lý lúc này cần phải có khả năng thay đổi để đáp ứng dựa trên trạng thái hiện tại của danh sách #the-list đang ẩn hay đang hiện. Với tất cả các công cụ đã được gặp từ bài viết đầu tiên, chúng ta thực sự không có cách nào để viết được một hàm xử lý như vậy. Đó là lý do mà chúng ta đã phải cân nhắc việc xây dựng một dropdown kỳ lạ với 2 nút nhấn.

Khả năng thay đổi cách thức hoạt động hoạt động của một hàm có thể trở nên khả thi với một chút sự giúp đỡ từ một bộ công cụ mới: một kiểu có tên gọi là boolean & một cú pháp điều kiện cho phép chúng ta thay đổi cách thức hoạt động của một đoạn code.

Trong bài viết tiếp theo, chúng ta sẽ nói về bộ công cụ mới này và sử dụng nó để bình thường hóa dropdown mà chúng ta đang có ở đây với một nút nhấn đơn. Hãy nghỉ giải lao một chút. Hẹn gặp lại bạn trong bài viết tiếp theo.

(Sắp đăng tải) [JavaScript] Bài 6 - Boolean & If ... Else ...

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 525

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 433

- vừa được xem lúc

Một số phương thức với object trong Javascript

Trong Javascript có hỗ trợ các loại dữ liệu cơ bản là giống với hầu hết những ngôn ngữ lập trình khác. Bài viết này mình sẽ giới thiệu về Object và một số phương thức thường dùng với nó.

0 0 153

- vừa được xem lúc

Tìm hiểu về thư viện axios

Giới thiệu. Axios là gì? Axios là một thư viện HTTP Client dựa trên Promise.

0 0 145

- vừa được xem lúc

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 110

- vừa được xem lúc

Bài toán đọc số thành chữ (phần 2) - Hoàn chỉnh chương trình dưới 100 dòng code

Tiếp tục bài viết còn dang dở ở phần trước Phân tích bài toán đọc số thành chữ (phần 1) - Phân tích đề và những mảnh ghép đầu tiên. Bạn nào chưa đọc thì có thể xem ở link trên trước nhé.

0 0 245