Tìm hiểu về JavaScript


JavaScript là một ngôn ngữ lập trình của HTML và WEB. Nó là nhẹ và được sử dụng phổ biến nhất như là một phần của các trang web, mà sự thi hành của chúng cho phép Client-Side script tương tác với người sử dụng và tạo các trang web động. Nó là một ngôn ngữ chương trình thông dịch với các khả năng hướng đối tượng.

JavaScript là gì?

JavaScript được biết đến đầu tiên với tên Mocha, và sau đó là LiveScript, nhưng Hãng Netscape thay đổi tên của nó thành JavaScript, bởi vì sự phổ biến như là một hiện tượng của Java lúc bấy giờ. Giống Java, JavaScript có cú pháp tương tự C, nhưng nó gần với Self hơn Java. .js là phần mở rộng thường được dùng cho tập tin mã nguồn JavaScript.

Lúc đầu, các lập trình viên đã không coi JavaScript là quan trọng, bởi vì nó không được xem như là một ngôn ngữ phát triển nghiêm túc như các ngôn ngữ phía máy chủ là Java, Ruby hay Python. JavaScript giống như phần kem phết trên bề mặt chiếc bánh vậy, nó chỉ chịu trách nhiệm về phần trải nghiệm người dùng. Nhưng ngôn ngữ này tiếp tục phát triển và ngày càng trở nên phổ biến, nó thường được đề xuất là ngôn ngữ lập trình nên học đầu tiên dành cho người mới bắt đầu. Nếu bạn sử dụng một framework JavaScript có tên là Node.js, thì giờ đây bạn có thể thực sự sử dụng JavaScript như là một ngôn ngữ phía máy chủ (server-side).

Tại sao JavaScript được sử dụng rộng rãi?

JavaScript là ngôn ngữ kịch bản phía máy khách (client-side) duy nhất. Do đó, nó được sử dụng trên hầu hết các trang web mà bạn nhìn thấy trên internet. Đây là một trong những lý do tại sao Codecademy cung cấp JavaScript là ngôn ngữ đầu tiên cho các học viên tìm hiểu. Không giống như các ngôn ngữ cổ điển đang được giảng dạy ở môn khoa học máy tính tại các trường đại học, JavaScript chắc chắn sẽ được sử dụng trong công việc nếu bạn là một nhà phát triển web.

Ngoài ra, kể từ khi JavaScript chạy trong một trình duyệt, bạn không cần phải tải một phần mềm nào đó về để sử dụng nó. Tất cả bạn cần chỉ là một trình soạn thảo văn bản (như TextWrangler hay TextEdit) và một trình duyệt web. Đây là một lợi ích rõ ràng cho các lập trình viên mới vào nghề.

Mặc cho những tiện ích của nó mang lại, các lập trình viên không coi JavaScript là ngôn ngữ tinh tế nhất - cú pháp của nó có vẻ lộn xộn. CoffeeScript là một nỗ lực để thay đổi điều này - nó làm cho JavaScript trông giống như Ruby hay Python bằng cách loại bỏ các dấu ngoặc xoắn, dấu chấm phẩy, bổ sung thêm khoảng trắng và căn lề thụt đầu dòng. Những thay đổi này làm cho code dễ đọc hơn, cho dù bạn đang xem lại phần code cũ của mình và cố gắng nhớ ra nó dùng để làm gì, hay đang làm việc chung trên một dự án với các lập trình viên khác.

JavaScript có thể làm được những gì

Đầu tiên, như chúng ta đã nói ở trên, JavaScript có thể được sử dụng để xây dựng toàn bộ một trang web nếu sử dụng với Node.js và MongoDB (một cơ sở dữ liệu). Node.js là bất đồng bộ, điều đó làm cho nó có tính dễ mở rộng và rất phù hợp cho tất cả các dữ liệu lớn ở ngoài kia. Ví dụ, một nhà phát triển đã nhận thấy việc gửi 600 email với Node.js chỉ mất 3 giây, trong khi đó phải mất 30 giây với PHP. MongoDB là một cơ sở dữ liệu hướng tài liệu (document-oriented) được xây dựng phục vụ cho khả năng mở rộng nhưng các chức năng nó cung cấp vẫn tốt nhất cho cả hai thế giới.

JavaScript hiện nay là một trong những cách ưa thích để phát triển ứng dụng web. Đó là ngôn ngữ được sử dụng nhiều nhất trên Github. Rất nhiều các trang web được xây dựng với Node, bao gồm cả các trang web lớn như Klout, Storify và Yammer. Việc có thể sử dụng cùng một ngôn ngữ trên cả phần front-end và back-end làm cho cuộc sống của các nhà phát triển phần mềm trở nên dễ dàng hơn.

Riêng bản thân nó, JavaScript chịu trách nhiệm về các hiệu ứng động như các cửa sổ pop-up và với AJAX, những trang web có thể hiển thị dữ liệu mới mà không cần phải refresh lại trang. Bạn có thể xem một ví dụ của AJAX trong thực tế ở đây - bạn thấy thế nào khi nhấp chuột vào một hình ảnh trên trang đó, thì địa chỉ URL thay đổi và nó hiển thị dữ liệu mới tương ứng mà không cần phải refresh lại toàn bộ trang. AJAX là cụm từ viết tắt của Asynchronous JavaScript And Xml, vì vậy nó không thể được sử dụng ngoài JavaScript.

JavaScript có phải là ngôn ngữ của tương lai?

HTML5 được cho là sự kết thúc của Flash, nhưng nếu HTML5 là công cụ tổ chức, thì JavaScript soán vị trí của phần tử Flash. Những video hoặc hình ảnh trực quan trước đây thường phải chạy trong một plugin thì bây giờ được phục vụ với JavaScript, chạy trong trình duyệt của bạn, vì vậy bạn không cần phải tải về một plugin của bên thứ ba để xem nó, và các nhà phát triển biết rằng người dùng sẽ có cùng trải nghiệm.

Kể từ khi Javascript bắt đầu như là ngôn ngữ trông giống Java nhưng không có khả năng thực hiện cùng một tác vụ, thì nó đã tạo ra một chút ngạc nhiên cho những ai đặt cược vào sự phát triển ngày càng lớn mạnh của nó. JavaScript cũng không phải là ngôn ngữ dễ viết nhất - các nhà phát triển nói rằng Ruby hay Python được viết theo cách mà bạn mong muốn, bởi vậy cú pháp của chúng trông tự nhiên hơn. Nhưng một ngôn ngữ chỉ tốt nhất khi có các công cụ đi kèm với nó, và nhờ sự bổ sung như Node.js, jQuery (thư viện), JSON (JavaScript Object Notation) và MongoDB, JavaScript sẽ có một tương lai tươi sáng.


Khai báo biến trong javascript

Để khai báo một biến ta sử dụng từ khóa var [tenbien]let [tenbien]

var username;
var _username;
var __username;
var username90;
var 90baonguyen; => Sai
  • Tên biến phải là các chữ không dấu viết hoa hoặc viết thường, các chữ số từ 0-9 và dấu gạch dưới (_).
  • Tên biến bắt đầu phải là chữ hoặc dấu gạch dưới (_), nếu bắt đầu bằng số là sai
  • Tên biến có thể đặt dài hay ngắn tùy vào lập trình viên.
var username, _username, __username, username90;

Ngoài cách khai báo như trên ta còn có cách khai báo nhiều biến cùng một lúc bằng cách viết chúng liên tiếp với nhau và cách nhau bởi dấu phẩy.

Gán kiểu giá trị cho biến

/* Biến website đang kiểu String */
var website = 'baonguyen.com';

/* Biến danhsach đang kiểu Int và biến bang là Array, biến data là Object */
var danhsach = 12,
^bang = ['table 1', 'table 2'],
^data = {
	^^id: 1,
	^^ten: 'Nguyen',
	^^tuoi: 30
^};

Trong Javascript rất hạn chế về kiểu dữ liệu nhưng bù lại cơ chế xử lý kiểu dữ liệu của nó rất linh hoạt giúp lập trình viên có thể chuyển đổi một cách dễ dàng, bởi mọi kiểu dữ liệu đều có thể quy về đối tượng và mỗi đối tượng ta có thể bổ sung các phương thức xử lý riêng.

Giống như php, để xác định biến có kiểu dữ liệu là gì thì ta dựa vào giá trị mà nó đang có, có nghĩa khi bạn gán một con số không có dấu chấm động thì nó sẽ là kiểu INT, nếu gán một chuỗi thì là kiểu String.

Dấu chấm phẩy là tùy ý

var website = 'baonguyen.com'
var danhsach = 12

Các lệnh đơn giản trong JavaScript nói chung được theo sau bởi một ký tự dấu chấm phảy, mà khi chúng có trong C, C++, và Java. Tuy nhiên, JavaScript cho phép bạn bỏ quên dấu chấm phảy này nếu mỗi lệnh của bạn được đặt trên một dòng riêng rẽ. Ví dụ, code sau có thể được viết mà không sử dụng dấu chấm phảy:

var WebSite = 'baonguyen.com'; var website = 12

Nhưng khi được định dạng trong một dòng đơn, bạn phải sử dụng các dấu chấm phảy:

JavaScript là ngôn ngữ phân biệt kiểu chữ (case-sensitive). Nghĩa là các từ khóa ngôn ngữ, biến, tên hàm, và bất kỳ định danh nào khác phải luôn luôn được soạn đúng.

Khi nào nên sử dụng let để khai báo biến

Với phạm vi hoạt động hẹp let thường dùng để khai báo các biến mang tính chất tạm thời, nghĩa là nó chỉ sống trong một phạm vi hoạt động của khối đó thôi, không sử dụng qua vị trí khác.

Như vậy biến data sau khi kết thúc lệnh if nó vẫn tồn tại => dư thừa không cần thiết.

Quay lại bài toán ta sử dụng từ khóa let như sau:

Đoạn code này chạy bình thường, tuy nhiến nếu bạn cố ý document.write(data) như ví dụ trên thì sẽ xuất hiện lỗi biến data không tồn tại vì biến data chỉ tồn tại bên trong lệnh if.

Phạm vi biến trong JavaScript

Phạm vi của một biến là vùng chương trình trong đó nó được định nghĩa. Biến JavaScript chỉ có hai phạm vi sau:

Biến Global − Một biến Global có phạm vi chung, nghĩa là nó có thể được định nghĩa bất cứ đâu trong JavaScript code.

Biến Local − Một biến Local sẽ chỉ nhìn thấy trong một hàm, nơi nó được định nghĩa. Các tham số hàm luôn luôn là nội bộ cho hàm đó.

Trong thân của một hàm, một biến Local có quyền ưu tiên cao hơn biến Global với cùng một tên. Nếu bạn khai báo một biến Local hoặc tham số hàm với cùng tên với biến Global, bạn ẩn biến Global đó một cách hiệu quả. Bạn xem ví dụ sau:


Function trong JavaScript

Trong Javascript để tạo một function thì thông thường chúng ta sử dụng hai cách sau:

Arrow function

Với phiển bản ES6 trở lên thì bạn có thêm một cách đó là sử dụng dấu mũi tên => rất phức tạp, chi tiết thế nào thì chúng ta cùng tìm hiểu nhé. Bạn có thẻ coi như đây là một tính năng mới của Javascript.

Map

Ví dụ đầu tiên ta sử dụng kết hợp hàm map của array trong Javascript, hàm này giống như vòng lặp vậy, nó có một tham số truyền vào và đó là một callback function, hàm callback function này sẽ có hai tham số truyền vào đại diện cho value và key của mỗi phần tử trong mảng.

Hãy mở console.log để xem kết quả

Khắc phục nhược điểm với this trong closure function

Nếu bạn đã từng đọc qua bài viết hàm bind trong javascript thì từ version ES5 trở về trước sẽ có nhược điểm với đối tượng this đó là phạm vi hoạt động, và trong ES5 có sử dụng hàm bind để khắc phục. Vấn đề này được khắc phục hoàn toàn trong ES6 bằng cách sử dụng hàm arrow function.

Với ES6 trở lên thì viết như sau:

Toán tử toán học trong JavaScript

Thông thường chúng ta sử dụng toán tử toán học như cộng, trừ, nhận, chia, ... để thực xử lý thay đổi giá trị các biến trong javascript. Sau đây là bảng danh sách các toán tử hay dùng.

Toán tửMô tảCode
% (Phép chia lấy phần dư)Kết quả là phần dư của phép chia.
++ (Tăng lên 1)Tăng giá trị integer lên 1
+= (Phép cộng và gán)Nó cộng giá trị toán hạng phải với toán hạng trái và gán kết quả cho toán hạng trái
Toán tử điều kiện (? :)Toán tử điều kiện đầu tiên tính toán một biểu thức để xem nó là true hoặc false và sau đó thực thi một trong hai lệnh đã cung cấp phụ thuộc vào kết quả của sự tính toán. Nếu điều kiện là true ? Thì giá trị X : Nếu không thì giá trị Y
Toán tử typeof

Toán tử typeof là một toán tử một ngôi mà được đặt trước toán hạng đơn của nó, mà có thể là bất cứ kiểu nào. Giá trị của nó là một chuỗi chỉ dẫn kiểu dữ liệu của toán hạng. Dưới đây là danh sách các giá trị trả về cho toán tử typeof.

KiểuChuỗi trả về
Number"number"
String"string"
Boolean"boolean"
Object"object"
Hàm"function"
Undefined"undefined"
Null"object"
Toán tử quan hệToán tử quan hệ dùng để thể hiện mối quan hệ giữa hai toán tử trong toán học, còn trong lập trình thì ta dùng toán tử quan hệ để nói đến mối quan hệ giữa hai biến hoặc hai giá trị nào đó. Kết quả của toán tử quan hệ sẽ trả về một trong hai giá trị TRUE hoặc FALSE.
Toán tử luận lýToán tử luân lý dùng để kết hợp hay phủ định biểu thức có chứa các toán tử quan hệ, kết quả của sự kết hợp sẽ có giá trị là TRUE hoặc FALSE.
Lưu ý với toán tử so sánh bằng

Chúng ta có hai toán tử so sánh bằng đó là toán tử ===== , vậy sự khác nhau giữa hai toán tử này như thế nào? Khi nào thì sử dụng các toán tử đó? Chúng ta cùng tìm hiểu nhé.

Khác với các ngôn ngữ cao cấp khác như C# thì khi khai báo biến bạn không cần phải khai báo kiểu dữ liệu cho biến mà nó sẽ dựa vào giá trị mà bạn truyền cho biến, vì vậy bạn có thể chuyển đổi giá trị cho biến với nhiều kiểu dữ liệu khác nhau.

Vòng lặp

Trong khi viết một chương trình, bạn có thể gặp một tình huống mà bạn cần thực hiện một hành động lặp đi lặp lại. Trong những tính huống này, bạn sẽ cần viết các lệnh vòng lặp để giảm số dòng code.

Vòng lặp while

Vòng lặp cơ bản nhất trong JavaScript là vòng lặp while sẽ được bàn luận trong chương này. Mục đích của vòng lặp while là để thực thi một lệnh hoặc khối code lặp đi lặp lại miễn là expression – biểu thức là true. Một khi biểu thức trở thành false, vòng lặp kết thúc.

Vòng lặp do...while

Vòng lặp do...while là tương tự như vòng lặp while ngoại trừ việc kiểm tra điều kiện xảy ra ở phần cuối vòng lặp. Điều này có nghĩa là vòng lặp sẽ luôn luôn được thực thi ít nhất một lần, ngay cả khi điều kiện là false.

Vòng lặp for

Vòng lặp 'for' là mẫu vòng lặp gọn nhất. Nó bao gồm 3 phần quan trọng:

  • Phần khởi tạo vòng lặp – initialization, nơi chúng ta khởi tạo phép tính tới một giá trị bắt đầu. Lệnh khởi tạo được thực thi trước khi vòng lặp bắt đầu.
  • Phần kiểm tra lệnh – test statement mà sẽ kiểm tra nếu một điều kiện đã cho là true hoặc không. Nếu điều kiện là true, thì khi đó code đã cho bên trong vòng lặp sẽ được thực thi, nếu không thì điều khiển sẽ thoát ra khỏi vòng lặp.
  • Phần lệnh lặp lại – iteration statement, nơi bạn có thể tăng hoặc giảm phép tính của bạn.
Vòng lặp for...in

Vòng lặp for...in được sử dụng để lặp qua các thuộc tính của một đối tượng. Khi chúng ta vẫn chưa bàn luận về đối tượng, bạn có thể không cảm thấy thoải mái với vòng lặp này. Nhưng một khi bạn hiểu cách các đối tượng vận hành trong JavaScript, bạn sẽ thấy vòng lặp này rất hữu ích. Trong mỗi lần lặp, một thuộc tính từ object – đối tượng được gán tới variablename - tên biến và vòng lặp này tiếp tục tới khi hết tất cả thuộc tính của đối tượng.

Điều khiển vòng lặp trong JavaScript

JavaScript cung cấp sự điều khiển cao để xử lý các lệnh vòng lặp và lệnh switch. Có thể có một tình huống khi bạn cần thoát khỏi vòng lặp mà không phải đi tới điểm cuối của nó. Cũng có thể có tình huống khi bạn muốn nhảy qua một phần của khối code và bắt đầu vòng lặp tiếp theo.

Để xử lý các tình huống trên, JavaScript cung cấp lệnh break và continue. Những lệnh này được sử dụng để thoát khỏi ngay lập tức bất kỳ vòng lặp nào hoặc để bắt đầu vòng lặp tiếp theo của bất kỳ vòng lặp tương ứng.

Lệnh break

Lệnh break, đã được giới thiệu ngắn gọn với lệnh switch, được sử dụng để thoát sớm ra khỏi một vòng lặp, thoát khỏi khu vực dấu ngoặc ôm.

Lệnh continue

Lệnh continue nói cho bộ thông dịch ngay lập tức bắt đầu lần lặp tiếp theo của vòng lặp và nhảy qua khối code còn lại. Khi một lệnh continue được bắt gặp, luồng chương trình di chuyển ngay lập tức tới biểu thức kiểm tra và nếu điều kiện còn true, sau đó nó bắt đầu lần lặp tiếp theo, nếu không thì điều khiển thoát khỏi vòng lặp.

Lệnh Switch Case trong JavaScript

Bạn có thể sử dụng nhiều lệnh if...else…if như trong chương trước để thực hiện một nhánh nhiều lựa chọn. Tuy nhiên, nó luôn luôn không phải là giải pháp tốt nhât, đặc biệt khi tất các các nhánh phụ thuộc vào giá trị của một biến đơn.

Mục tiêu của một lệnh switch là cung cấp một biểu thức để ước lượng và một số lệnh khác nhau để thực thi trên cơ sở giá trị của biểu thức. Bộ thông dịch kiểm tra mỗi case – trường hợp với giá trị của biểu thức tới khi tìm thấy một sự so khớp. Nếu không có so khớp nào, một điều kiện default – mặc định sẽ được sử dụng. Lệnh break chỉ dẫn phần cuối của mỗi trường hợp cụ thể. Nếu chúng bị bỏ quên, bộ thông dịch sẽ tiếp tục thực thi mỗi lệnh trong mỗi trường hợp sau.

Hàm trong JavaScript

Một hàm là một nhóm code có thể tái sử dụng mà có thể được gọi bất cứ đâu trong chương trình của bạn. Điều này giúp bạn không cần thiết phải viết cùng một code lại nhiều lần. Nó giúp các nhà lập trình viết các modular code. Các hàm cho phép một nhà lập trình phân chia một chương trình lớn thành các hàm nhỏ và dễ quản lý.

Giống như bất kỳ ngôn ngữ chương trình cấp cao khác, JavaScript cũng hỗ trợ tất cả tính năng cần thiết để viết các code có tính modun bởi sử dụng các hàm. Bạn đã xem các hàm như alert() và write() trong các chương trước. Chúng tôi đã sử dụng các hàm này nhiều lần, nhưng chúng mới chỉ được viết trong core JavaScript. JavaScript cũng cho phép chúng ta viết các hàm cho riêng mình. Phần này giải thích cách viết các hàm riêng của bạn trong JavaScript.

Định nghĩa hàm

Trước khi chúng ta sử dụng một hàm, chúng ta cần định nghĩa nó. Phương thức phổ biến nhất để định nghĩa một hàm trong JavaScript là bởi sử dụng từ khóa Hàm, được theo bởi một tên hàm duy nhất, một danh sách các tham số (mà có thể là trống), và một khối lệnh được bao quanh bởi các dấu ngoặc ôm.

Tham số của hàm

Tới chương này, chúng ta đã thấy các hàm mà không có tham số. Nhưng có một sự tiện lợi khi truyền các tham số khác nhau trong khi gọi một hàm. Những tham số được truyền này có thể được nắm bắt bên trong hàm đó và bất kỳ thao tác nào có thể được thực hiện trên các tham số đó. Một hàm có thể nhận nhiều tham số được phân biệt riêng rẽ bởi dấu phảy.

Sự kiện (Event) trong JavaScript

Sự tương tác của JavaScript với HMTL được xử lý thông qua các sự kiện xảy ra khi người sử dụng hoặc trình duyệt thao tác một trang.

Khi một trang tải, nó được gọi là một sự kiện (Event). Khi người sử dụng click vào một nút, thì click đó cũng là một sự kiện. Các ví dụ về sự kiện khác như nhấn một phím, đóng một cửa sổ, tăng giảm cửa sổ, …

Nhà lập trình có thể sử dụng những sự kiện này để thực thi các phản hồi được mã hóa bởi JavaScript, như các nút để đóng cửa sổ, các thông báo được hiển thị tới người dùng, …

Các sự kiện là một phần của Document Object Model (DOM) Level 3 và mỗi phần tử HTML chứa một tập hợp các sự kiện mà có thể kích hoạt JavaScript Code.

Dưới đây là một ví dụ về kiểu sự kiện onmouseover và onmouseout. Sự kiện onmouseover được kích hoạt khi bạn di chuyển chuột qua bất kỳ vùng nào của phần tử và onmouseout kích hoạt khi bạn di chuyển chuột ra khỏi phần tử đó. Bạn thử ví dụ sau:

Sự kiện HTML5 chuẩn

Các sự kiện HTML5 chuẩn được liệt kê dưới đây. Tại đây, script chỉ dẫn một hàm JavaScript để được thực thi đối với sự kiện đó.

Thuộc tínhGiá trịMiêu tả
OfflinescriptKích hoạt khi tài liệu ở ngoại tuyến
OnabortscriptKích hoạt trên một sự kiện bỏ dở
onafterprintscriptKích hoạt sau khi tài liệu được in
onbeforeonloadscriptKích hoạt trước khi tài liệu tải
onbeforeprintscriptKích hoạt trước khi tài liệu được in
onblurscriptKích hoạt khi cửa sổ mất trọng tâm
oncanplayscriptKích hoạt khi media có thể bắt đầu chơi, nhưng phải dừng để đệm
oncanplaythroughscriptKích hoạt khi media có thể chơi tới cuối, mà không dừng để đệm
onchangescriptKích hoạt khi một phần tử thay đổi
onclickscriptKích hoạt trên một cú click chuột
oncontextmenuscriptKích hoạt khi menu ngữ cảnh bị kích hoạt
ondblclickscriptKích hoạt khi nhấp đúp chuột
ondragscriptKích hoạt khi một phần tử bị kéo
ondragendscriptKích hoạt tại phần cuối của hoạt động kéo
ondragenterscriptKích hoạt khi một phần tử đã được kéo tới một mục tiêu thả hợp lệ
ondragleavescriptKích hoạt khi một phần tử đang được kéo qua một mục tiêu thả hợp lệ
ondragoverscriptKích hoạt tại phần đầu của hoạt động kéo
ondragstartscriptKích hoạt tại phần đầu của hoạt động kéo
ondropscriptKích hoạt khi phần tử được kéo đang được thả
ondurationchangescriptKích hoạt khi độ dài của media được thay đổi
onemptiedscriptKích hoạt khi phần tử nguồn media đột nhiên trở nên trống
onendedscriptKích hoạt khi media tiến tới cuối cùng
onerrorscriptKích hoạt khi một lỗi xảy ra
onfocusscriptKích hoạt khi cửa sổ nhận trọng tâm
onformchangescriptKích hoạt khi một form thay đổi
onforminputscriptKích hoạt khi một form nhận input từ người dùng
onhaschangescriptKích hoạt khi tài liệu có thay đổi
oninputscriptKích hoạt khi một phần tử nhận đầu vào từ người dùng
oninvalidscriptKích hoạt khi một phần tử không hợp lệ
onkeydownscriptKích hoạt khi một phím bị nhấn
onkeypressscriptKích hoạt khi một phím bị nhấn và được thả ra
onkeyupscriptKích hoạt khi một phím được thả ra
onloadscriptKích hoạt khi tài liệu tải
onloadeddatascriptKích hoạt khi dữ liệu media được tải
onloadedmetadatascriptKích hoạt khi thời gian và dữ liệu khác của một phần tử media được tải
onloadstartscriptKích hoạt khi trình duyệt bắt đầu tải dữ liệu media
onmessagescriptKích hoạt khi thông báo được kích hoạt
onmousedownscriptKích hoạt khi một nút chuột được nhả ra
onmousemovescriptKích hoạt khi con trỏ chuột di chuyển
onmouseoutscriptKích hoạt khi con trỏ chuột di chuyển ra khỏi một phần tử
onmouseoverscriptKích hoạt khi con trỏ chuột di chuyển qua một phần tử
onmouseupscriptKích hoạt khi một nút chuột được nhả ra
onmousewheelscriptKích hoạt khi bánh xe chuột được quay
onofflinescriptKích hoạt khi tài liệu ở ngoại tuyến
onoinescriptKích hoạt khi tài liệu ở trực tuyến
ononlinescriptKích hoạt khi tài liệu ở trực tuyến
onpagehidescriptKích hoạt khi cửa sổ bị ẩn
onpageshowscriptKích hoạt khi cửa sổ trở nên nhìn thấy
onpausescriptKích hoạt khi dữ liệu media bị dừng
onplayscriptKích hoạt khi dữ liệu media chuẩn bị bắt đầu chơi
onplayingscriptKích hoạt khi dữ liệu media đang bắt đầu chơi
onpopstatescriptKích hoạt khi lịch sử cửa sổ thay đổi
onprogressscriptKích hoạt khi trình duyệt đang nhận dữ liệu media
onratechangescriptKích hoạt khi tốc độ chơi của media đã thay đổi
onreadystatechangescriptKích hoạt khi trạng thái sẵn sàng thay đổi
onredoscriptKích hoạt khi tài liệu thực hiện một redo
onresizescriptKích hoạt khi cửa sổ bị thay đổi kích cỡ
onscrollscriptKích hoạt khi thanh cuốn của phần tử đang được cuốn
onseekedscriptKích hoạt khi thuộc tính seeking của một phần tử media không còn true, và seeking đã kết thúc
onseekingscriptKích hoạt khi thuộc tính seeking của một phần tử media là true, và seeking đã bắt đầu
onselectscriptKích hoạt khi một phần tử được chọn
onstalledscriptKích hoạt khi có một lỗi trong quá trình thu nhận dữ liệu media
onstoragescriptKích hoạt khi một tài liệu tải
onsubmitscriptKích hoạt khi một form được đệ trình
onsuspendscriptKích hoạt khi trình duyệt đã đang thu nhận dữ liệu media, nhưng đã dừng lại trước khi toàn bộ media file được thu nhận
ontimeupdatescriptKích hoạt khi media thay đổi vị trí chơi của nó
onundoscriptKích hoạt khi một tài liệu thực hiện một undo
onunloadscriptKích hoạt khi người sử dụng rời khỏi tài liệu
onvolumechangescriptKích hoạt khi media thay đổi âm lượng, kể cả khi media được thiết lập là mute
onwaitingscriptKích hoạt khi media đã dừng chơi nhưng được mong chờ phục hồi.

Regular Expression và RegExp trong JavaScript

Một Regular Expression là một đối tượng miêu tả một pattern của các ký tự. Lớp JavaScript RegExp biểu diễn Regular Expression, và cả String và RegExp định nghĩa các phương thức mà sử dụng Regular Expression để thực hiện các hàm so khớp pattern và tìm kiếm-thay thế mạnh trên văn bản. Một Regular Expression có thể được định nghĩa với RegExp () constructor như sau:

var pattern = new RegExp(pattern, attributes);

Trong đó

  • pattern − Một chuỗi mà xác định pattern của Regular Expression hoặc Regular Expression khác.
  • attributes − Một chuỗi tùy chọn chứa bất kỳ thuộc tính "g", "i", và "m" mà xác định tương ứng Global, Không phân biệt kiểu chữ (case-insensitive), và nhiều so khớp (multiline matches)
Các dấu ngoặc vuông

Các dấu ngoặc vuông ([]) có một ý nghĩa đặc biệt khi được sử dụng trong Regular Expression. Chúng được sử dụng để tìm một dãy ký tự.

ExpressionMiêu tả
[...]Bất kỳ một ký tự nào trong dấu ngoặc vuông
[^...]Bất kỳ một ký tự nào không trong dấu ngoặc vuông
[0-9]Nó so khớp bất kỳ số thập phân nào từ 0 đến 9
[a-z]Nó so khớp bất kỳ ký tự chữ thường nào từ a đến z.
[A-Z]Nó so khớp bất kỳ ký tự chữ hoa nào từ A đến Z.
[a-Z]Nó so khớp bất kỳ ký tự nào từ chữ thường a đến chữ hoa Z.

Các dãy được chỉ ở trên là chung; bạn cũng có thể sử dụng dãy [0-3] để so khớp bất kỳ số thập phân nào từ 0 đến 3, hoặc dãy [b-v] để so khớp bất kỳ ký tự chữ thường nào từ b đến v.

Phép lượng hóa (Quantifier)

Tần số và vị trí của các dãy ký tự và các ký tự đơn được bao trong các dấu ngoặc có thể được biểu thị bởi một ký tự đặc biệt. Mỗi ký tự đặc biệt có một phần mở rộng riêng biệt. Các +, * … theo sau một dãy ký tự.

ExpressionMiêu tả
p+Nó so khớp bất kỳ chuỗi nào chứa ít nhất một p.
p*Nó so khớp bất kỳ chuỗi nào chứa 0 hoặc nhiều p.
p?Nó so khớp bất kỳ chuỗi nào chứa 1 hoặc nhiều p
p{N}Nó so khớp bất kỳ chuỗi nào chứa một dãy có {N} p
p{2,3}Nó so khớp bất kỳ chuỗi nào chứa một dãy có 2 hoặc 3 p
p{2, }Nó so khớp bất kỳ chuỗi nào chứa một dãy có ít nhất 2 p
p$Nó so khớp bất kỳ chuỗi nào kết thúc với p
^pNó so khớp bất kỳ chuỗi nào bắt đầu bằng p
Ví dụ

Ví dụ sau giải thích chi tiết hơn về so khớp các ký tự.

ExpressionMiêu tả
[^a-zA-Z]Nó so khớp bất kỳ chuỗi nào không chứa bất kỳ ký tự từ a đến z và từ A đến Z.
p.pNó so khớp bất kỳ chuỗi nào chứa p, được theo sau bởi bất kỳ ký tự nào, theo sau bởi một ký tự p khác.
^.{2}$Nó so khớp bất kỳ chuỗi nào chứa chính xác 2 ký tự
(.*)Nó so khớp bất kỳ chuỗi nào trong thẻ .
p(hp)*Nó so khớp bất kỳ chuỗi nào chứa p được theo sau bởi 0 hoặc nhiều dãy hp.
Các ký tự Literal
Ký tựMiêu tả
AlphanumericChính nó
\0Ký tự NUL (\u0000)
\tTab (\u0009)
\nDòng mới (\u000A)
\vTab dọc (\u000B)
\fForm feed (\u000C)
\rCarriage return (\u000D)
\xnnKý tự Latin được xác định bởi số thập lục phân nn; ví dụ: \x0A là như \n
\uxxxxKý tự Unicode được xác định bởi số thập lục phân xxxx; ví dụ: \u0009 là \t
\cXKý tự điều khiển ^X; Ví dụ: \cJ tương đương với ký tự dòng mới \n
Siêu ký tự (Metacharacter)

Một metacharacter đơn giản là một ký tự chữ cái được đặt trước bởi một dấu gạch chéo ngược mà thực hiện so khớp một ý nghĩa đặc biệt.

Ví dụ, bạn có thể tìm kiếm một lượng tiền lớn bởi sử dụng siêu ký tự '\d' là: /([\d]+)000/. Ở đây, \d sẽ tìm bất kỳ chuỗi ký tự số nào.

Bảng sau liệt kê một tập hợp các siêu ký tự mà có thể được sử dụng trong PERL Style Regular Expression.

Ký tựMiêu tả
.Một ký tự đơn
\sMột ký tự khoảng trống trắng (space, tab, dòng mới)
\SKhông phải ký tự khoảng trống trắng
\dMột chữ số (0-9)
\DKhông là chữ số
\wMột ký tự từ (a-z, A-Z, 0-9, _)
\WKhông là một ký tự từ
[\b]Một literal backspace (trường hợp đặc biệt)
[aeiou]So khớp một ký tự đơn trong tập hợp đã cho
[^aeiou]So khớp một ký tự đơn bên ngoài tập hợp đã cho
(foo|bar|baz)So khớp bất kỳ các dãy thay đổi nhau đã cho
Lượng hóa (Modifier)

Một số lượng hóa là có sẵn mà có thể xác định cách bạn làm việc với regexp, như phân biệt kiểu chữ, tìm kiếm nhiều dòng, …

ModifierMiêu tả
iThực hiện so khớp không phân biệt kiểu chữ (case-insensitive).
mXác định nếu chuỗi có các ký tự newline (dòng mới) hoặc carriage return , toán tử ^ và $ sẽ so khớp với một giới hạn newline (dòng mới), thay vì một giới hạn chuỗi.
gThực hiện so khớp Global, mà tìm tất cả các so khớp thay vì dừng lại sau so khớp đầu tiên.
Các thuộc tính của RegExp

Bảng dưới liệt kê các thuộc tính của đối tượng RegExp và miêu tả:

Thuộc tínhMiêu tả
constructorXác định hàm tạo prototype của đối tượng.
globalXác định nếu lượng hóa "g" được thiết lập
ignoreCaseXác định nếu lượng hóa "i" được thiết lập
lastIndexChỉ mục tại đó bắt đầu so khớp mới
multilineXác định nếu lượng hóa "m" được thiết lập
sourceVăn bản của pattern
Các phương thức của RegExp

Bảng dưới liệt kê các phương thức của đối tượng RegExp và miêu tả:

Phương thứcMiêu tả
exec()Thực thi một tìm kiếm cho một so khớp trong tham số chuỗi của nó.
test()Kiểm tra một so khớp trong tham số chuỗi của nó.
toSource()Trả về một literal đối tượng biểu diễn đối tượng đã cho; bạn có thể sử dụng giá trị này để tạo đối tượng mới.
toString()Trả về một chuỗi biểu diễn đối tượng đã cho.

DOM là gì? Các loại DOM trong Javascript

Javascript là một ngôn ngữ được sử dụng trong các trình duyệt Browser nên nó đóng một vai trò khá quan trọng trong các ứng dụng website. Và nhiệm vụ của Javascript là thao tác với các tài liệu HTML kết hợp với các cú pháp riêng của nó để tạo nên sự ảo diệu của trang web.

Để thao tác được với các thẻ HTML thì nó phải thông qua một cơ chế ta gọi là DOM và ta hay gọi là Document Object Model. Vậy thì DOM là gì thì chúng ta cùng tì hiểu nó nhé.

DOM là viết tắt của chữ Document Object Model, dịch tạm ra là mô hình các đối tượng trong tài liệu HTML. Như các bạn biết trong mỗi thẻ HTML sẽ có những thuộc tính (Properties) và có phân cấp cha - con với các thẻ HTML khác. Sự phân cấp và các thuộc tính của thẻ HTML này ta gọi là selector và trong DOM sẽ có nhiệm vụ xử lý các vấn đề như đổi thuộc tính của thẻ, đổi cấu trúc HTML của thẻ, ...

Và đoạn code này có ý nghĩa rằng tìm thẻ có id="result" và gán nội dung HTML bên trong của thẻ này là dòng chữ "Tạm biệt".

Các thể loại DOM trong Javascript

Việc xử lý và làm việc với đối tượng HTML rất phức tạp và đa dạng, chính vì vậy javascript có cung cấp cho chúng ta nhiều phương thức, đối tượng và mỗi thành phần như vậy sẽ có những nhiệm vụ riêng biệt. Sau đây mình sẽ liệt kê danh sách chia nhóm và trong những bài học tiếp theo chúng ta sẽ cùng tìm hiểu nó nhé.

Danh sách chia nhóm DOM:

  • DOM document: có nhiệm vụ lưu trữ toàn bộ các thành phần trong tài liệu của website
  • DOM element: có nhiệm vụ truy xuất tới thẻ HTML nào đó thông qua các thuộc tính như tên class, id, name của thẻ HTML
  • DOM HTML: có nhiệm vụ thay đổi giá trị nội dung và giá trị thuộc tính của các thẻ HTML
  • DOM CSS: có nhiệm vụ thay đổi các định dạng CSS của thẻ HTML
  • DOM Event: có nhiệm vụ gán các sự kiện như onclick(), onload() vào các thẻ HTML
  • DOM Listener: có nhiệm vụ lắng nghe các sự kiện tác động lên thẻ HTML đó
  • DOM Navigation dùng để quản lý, thao tác với các thẻ HTML, thể hiện mối quan hệ cha - con của các thẻ HTML
  • DOM Node, Nodelist: có nhiệm vụ thao tác với HTML thông qua đối tượng (Object)

Như vậy ta có tổng cộng 8 loại thường được sử dụng như trên, và trong bài này mình không đề cập chi tiết hết được.

Để truy xuất tới một thẻ HTML theo ID ta sử dụng cú pháp sau:

BOM là gì?

BOM là chữ viết tắt của Browser Object Model, hay còn gọi là các đối tượng liên quan đến trình duyệt browser. Mỗi browser sẽ có những đối tượng khác nhau nên nó không có một chuẩn chung nào cả, tuy nhiên để có tính thống nhất giữa các trình duyệt thì người ta quy ước ra các loại BOM sau:

  • window
  • screen
  • location
  • history
  • navigator
  • popup
  • timing
  • cookies

Trong các đối tượng DOM trên có phân cấp lẫn nhau và trong đó window là cấp cao nhất vì nó đại diện cho browser. Ví dụ khi bạn muốn truy cập tới document thì bạn sẽ viêt là window.document, tuy nhiên vẫn có cách ghi tắt là document, muốn truy cập tới cookie thì ta viết window.document.cookie (viết tắt document.cookie), ...

Đối tượng Window có rất nhiều thuộc tính và phương thức riêng. Ví dụ đối tượng document là một thuộc tính của window (window.document), vì vậy nên ta có thể ví Window là một đối tượng toàn cục và ở đâu trong website cũng có thể sử dụng được. Bây giờ chúng ta sẽ tìm hiểu các thuộc tính và phương thức của đối tượng BOM Window nhé.

VD: Để lấy kích thước chiều cao và chiều rộng của trình duyệt thì chúng ta sử dụng đối tượng window, tuy nhiên với mỗi trình duyệt thì có những cách lấy khác nhau.

Đối với Internet Explorer, Chrome, Firefox, Opera, và Safari thì cú pháp như sau:

Đối với Internet Explorer các version 5,6,7,8 thì cú pháp như sau:

Việc tương thích với các trình duyệt quá rắc rối phải không nào? Vậy có cách nào giải quyết vấn đề này không? Câu trả lời là có bằng cách sử dụng một mẹo nhỏ như sau:

BOM - Window Navigator trong Javascript

Đối tượng Window Navigator trong Javascript được dùng để kiểm tra các thông tin về người dùng như trình duyệt đang sư dụng là gì? hệ điều hành đang sử dụng là gì? Trình duyệt có bật Cookie hay không? hay thậm chí có thể kiểm tra được tên và version của Browser.

Use Strict là gì? Strict Mode trong javascript

Khi bạn download những file JS trên mạng về hoặc download những Plugin jQuery thì bạn sẽ thấy phía trên cùng của file người ta có đặt dòng chữ "use strict";. Vậy câu hỏi được đặt ra là từ khóa use strict là gì và mục đích người ta đặt nó ở đầu file để làm gì?. Để trả lời câu hỏi trên thì ta phải tìm sự thoải mái trong việc phát triển của Javascript và sự ra đời của Strict Mode.

Chế độ Strict Mode là gì ?

Khi bạn làm việc với Javascript thì bạn có thể sử dụng biến mà chưa cần định nghĩa (hoisting), bạn có thể quên đặt dấu chấm phẩy ở cuối mỗi đoạn code và bạn có thể sử dụng tên những từ khóa để tạo tên biến. Điều này làm cho các lập trình viên có thói quen làm việc quá dễ dãi và dẫn đến chương trình thiếu tính an toàn. Chính vì vậy Javascript kể từ phiên bản 1.8.5 trở đi đã bổ sung một khái niệm gọi Strict Mode nhằm giải quyết tính thiếu an toàn này.

Use Strict là gì ?

Use strict là từ khóa khai báo sử dụng chế độ Strict Mode, nghĩa là nếu bạn muốn sử dụng chế độ Strict Mode ở đâu thì chỉ việc đặt từ khóa "use strict" ở đó. Chế độ Strict Mode có hai phạm vi sử dụng đó là toàn cục và cục bộ. Tính toàn cục tức là khi bạn đặt từ "use strict" ở ngoài hàm và nằm phía trên cùng của file thì lúc này tất cả các đoạn code bên dưới đều bị ảnh hưởng. Tính cục bộ tức là bạn đặt "use strict" nằm trong một hàm nào đó thì phạm vi ảnh hưởng chỉ nằm trong hàm đó mà thôi.

Phạm vi Strict Mode toàn cục

Trong ví dụ này chương trình chạy bình thường

Rõ ràng chúng ta viết sai vì chưa khai báo domain nhưng nó vẫn chạy, xét thêm 1 ví dụ nữa ta sẽ thấy dù khai báo Object sai (trùng key) nhưng nó vẫn chạy

Bây giờ ta thêm "use strict"; vào tất nhiên nó sẽ không chạy vì code đã bị sai, chỉ có cách fixed mọi thứ cho đúng và đủ thì mới có thể chạy tốt được.

Qua bài này bạn sẽ không còn thắc mắc use strict là gì nữa phải không nào. Và thông qua từ khóa use strict bạn đã biết thế nào là chế độ chạy Strict Mode và công dụng của nó trong việc lập trình. Vì vậy kể từ bây giờ bạn hãy tập làm quen với chế độ Strict Mode này nhé vì nó chặt chẽ và an toàn, đảm bảo chương trình của bạn có thể chạy trên mọi trình duyệt hiện nay.

TOP