Hướng dẫn tạo mục lục bài viết bằng Javascript

Mục lục bài viết (Table of Contents – TOC) mang lại nhiều lợi ích quan trọng cho cả người dùng và SEO của website.

 · 6 phút đọc.

Mục lục bài viết (Table of Contents – TOC) mang lại nhiều lợi ích quan trọng cho cả người dùng và SEO của website.

Mục lục bài viết (Table of Contents – TOC) mang lại nhiều lợi ích quan trọng cho cả người dùng và SEO của website.

Giới thiệu về nền tảng thiết kế website Astro

Astro là một nền tảng thiết kế website tĩnh (static site generator) hiện đại, được tối ưu hóa cho hiệu suất và trải nghiệm người dùng. Được xây dựng với mục tiêu tạo ra các website nhanh chóng, dễ bảo trì và thân thiện với SEO, Astro đã trở thành lựa chọn hàng đầu cho nhiều nhà phát triển và doanh nghiệp.

Astro nổi bật với khả năng kết hợp các framework khác nhau như React, Vue, Svelte, SolidJS… trong cùng một dự án. Điều này giúp bạn tận dụng tối đa sức mạnh của từng framework mà không phải lo lắng về hiệu suất. Ngoài ra, một trong những tính năng quan trọng của Astro là Partial Hydration — chỉ tải Javascript cần thiết trên trang, giúp giảm thiểu tài nguyên không cần thiết và tăng tốc độ tải trang.

Astro cũng hỗ trợ Markdown và MDX để quản lý nội dung, rất hữu ích cho các website tĩnh, blog hoặc tài liệu kỹ thuật. Với khả năng này, bạn có thể dễ dàng tạo nội dung và tận dụng Javascript để nâng cao trải nghiệm người dùng, chẳng hạn như thêm mục lục tự động cho bài viết dài.

Tầm quan trọng của việc có mục lục bài viết trên Website

Việc có một mục lục bài viết (Table of Contents – TOC) mang lại nhiều lợi ích quan trọng cho cả người dùng và SEO của website. Khi bài viết trở nên dài và phức tạp, mục lục sẽ giúp người đọc:

– Dễ dàng điều hướng: Mục lục cung cấp một cái nhìn tổng quan về nội dung, giúp người đọc nắm bắt nhanh các phần quan trọng mà không cần cuộn qua toàn bộ bài viết.

– Cải thiện trải nghiệm người dùng (UX): Người dùng sẽ cảm thấy dễ dàng hơn khi tìm kiếm thông tin cụ thể trong bài viết, dẫn đến thời gian ở lại trang lâu hơn.

– Tăng cường SEO: Công cụ tìm kiếm như Google đánh giá cao các website có cấu trúc rõ ràng và mục lục giúp tăng khả năng bài viết xuất hiện trong Google Sitelinks, làm tăng cơ hội tiếp cận người dùng.

Ngoài ra, mục lục còn giúp bài viết của bạn trông chuyên nghiệp hơn, đặc biệt là trong các blog kỹ thuật, tài liệu hướng dẫn hoặc các trang cung cấp thông tin chi tiết.

Tạo mục lục bài viết bằng Javascript

Để tạo mục lục bài viết bằng Javascript, bạn cần quan tâm đến 2 tệp chính: table.astro chứa Javascript tạo mục lục, và single.astro đặt vị trí mục lục. Tùy vào cấu trúc thư mục, mà 2 tệp này được định nghĩa, định dạng khác nhau, bạn cần tạo tệp table.astro và xác định vị trí của tệp single.astro để tiến hành điều chỉnh.

Tạo file Javascript để sinh mục lục

Đầu tiên, bạn cần tạo một tệp Javascript để tự động sinh ra mục lục dựa trên các thẻ tiêu đề (<h2>, <h3>, <h4>…) trong bài viết.

Tạo một tệp mới có tên table.astro và đặt chúng trong thư mục ~/components/article với đoạn code sau:

<script type="module">
	function generateTOC() {
		const index = document.getElementById('index');
		const headings = document.querySelectorAll('h2, h3, h4');

		const tocList = document.createElement('ul');
		let currentParent = null;

		headings.forEach(heading => {
			const listItem = document.createElement('li');
			const anchor = document.createElement('a');
			anchor.href = `#${heading.id}`;
			anchor.textContent = heading.textContent;
			listItem.appendChild(anchor);

			switch (heading.tagName.toLowerCase()) {
				case 'h2':
					break;
				case 'h3':
					listItem.style.fontStyle = 'italic';
					break;
				case 'h4':
					break;
			}

			if (heading.tagName.toLowerCase() === 'h3' || heading.tagName.toLowerCase() === 'h4') {
				if (currentParent) {
					const subList = currentParent.querySelector('ul') || document.createElement('ul');
					subList.appendChild(listItem);
					currentParent.appendChild(subList);
				}
			} else {
				tocList.appendChild(listItem);
				currentParent = listItem;
			}
		});

		index.appendChild(tocList);

	}

	window.onload = generateTOC;
</script>

Bước 2: Đặt mục lục vào trong bài viết

Tiếp theo, trong tệp cấu hình bài viết, bạn chèn phần tử để hiển thị mục mục. Cụ thể, trong tệp single.astro, hãy thêm đoạn code sau:

---
import Table from '~/components/article/table.astro';
---

<section>
	<Table/>
</section>

Phần tử <Table> này sẽ là nơi hiển thị toàn bộ mục lục mà chúng ta sẽ tạo ra bằng Javascript. Bạn có thể đặt phần tử này ở đầu bài viết hoặc trong một sidebar tùy thuộc vào thiết kế website của bạn.

Vị trí ~/components/article/table.astro cần điều chỉnh, xác định đúng vị trí để đoạn code có thể triển khai được trên bài viết.

Tinh chỉnh mục lục bài viết bằng Javascript

Nếu website có các thẻ heading phụ, dùng để hiển thị các thành phần không liên quan đến bài viết, thì phần mục lục sẽ hiển thị nhiều hơn các mục này. Để ẩn các mục thừa ấy, bạn cần tinh chỉnh lại đoạn code trên.

Trước tiên, cần xác định với mỗi bài viết, sẽ có bao nhiêu heading thừa, không cần tạo mục mục, ví dụ như Giới thiệu tác giả, Giới thiệu bài mới, Dịch vụ hay các thành phần khác.

Đặt giả định rằng mỗi bài viết sẽ có khoảng 20 heading thừa, không cần đưa vào mục lục, thì đoạn code sẽ được điều chỉnh lại như sau:

<script type="module">
	function generateTOC() {
		const index = document.getElementById('index');
		const headings = document.querySelectorAll('h2, h3, h4');

		const tocList = document.createElement('ul');
		let currentParent = null;

		headings.forEach(heading => {
			const listItem = document.createElement('li');
			const anchor = document.createElement('a');
			anchor.href = `#${heading.id}`;
			anchor.textContent = heading.textContent;
			listItem.appendChild(anchor);

			switch (heading.tagName.toLowerCase()) {
				case 'h2':
					break;
				case 'h3':
					listItem.style.fontStyle = 'italic';
					break;
				case 'h4':
					break;
			}

			if (heading.tagName.toLowerCase() === 'h3' || heading.tagName.toLowerCase() === 'h4') {
				if (currentParent) {
					const subList = currentParent.querySelector('ul') || document.createElement('ul');
					subList.appendChild(listItem);
					currentParent.appendChild(subList);
				}
			} else {
				tocList.appendChild(listItem);
				currentParent = listItem;
			}
		});

		index.appendChild(tocList);

		hideLastTOCItems(tocList, 20);
	}

	function hideLastTOCItems(tocList, count) {
		const items = tocList.querySelectorAll('li');
		const totalItems = items.length;

		const itemsToHide = Math.min(count, totalItems);

		for (let i = totalItems – itemsToHide; i < totalItems; i++) {
			items[i].style.display = 'none';
		}
	}

	window.onload = generateTOC;
</script>

Trong đoạn code này, hideLastTOCItems(tocList, 20) giúp ẩn 20 mục lục cuối cùng. Bạn có thể thay đổi số lượng mục lục bị ẩn hoặc loại bỏ hoàn toàn chức năng này nếu không cần.

Nếu đoạn code không hoạt động, hoặc không thể sử dụng, có thể chúng đã được điều chỉnh. Truy cập vào đây để tiếp cận đoạn code tạo mục lục bài viết mới nhất.

Như vậy, với đoạn code Javascript nêu trên, website của bạn đã có thêm mục lục bài viết, giúp nội dung hiển thị trực quan, tối ưu SEO và thân thiện với người đọc hơn rất nhiều.

nhavantuonglai

Share:
Quay lại.

Có thể bạn chưa đọc

Xem tất cả »

Liên lạc trao đổi

Liên lạc thông qua Instagram

Thông qua Instagram, bạn có thể trao đổi trực tiếp và tức thời, cũng như cập nhật những thông tin mới nhất từ nhavantuonglai.

Tức thời

Bạn có thể gửi và nhận tin nhắn nhanh chóng, trực tiếp, giúp những vấn đề cá nhân của bạn được giải quyết tức thời và hiệu quả hơn.

Thân thiện

Vì tính chất là kênh liên lạc nhanh, nên bạn có thể bỏ qua những nghi thức giao tiếp thông thường, chỉ cần lịch sự và tôn trọng thì sẽ nhận được sự phản hồi đầy thân thiện, thoải mái từ tác giả.

Trao đổi trên email

Thông qua email cá nhân, bạn có thể trao đổi thỏa thuận hợp tác, kết nối chuyên sâu và mang tính chuyên nghiệp.

Tin cậy

Trong một số trường hợp, email được dùng như một tài liệu pháp lý, chính vì vậy mà bạn có thể an tâm và tin cậy khi trao đổi với tác giả thông qua email.

Chuyên nghiệp

Cấu trúc của email đặt tính chuyên nghiệp lên hàng đầu, nên những thông tin, nội dung được viết trong email từ tác giả sẽ luôn đảm bảo điều này ở mức cao nhất.