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 đượ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).
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.
Đầ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.
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 một biến ta sử dụng từ khóa var [tenbien]
và let [tenbien]
var username; var _username; var __username; var username90; var 90baonguyen; => Sai
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.
/* 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.
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.
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 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:
Trong Javascript để tạo một function thì thông thường chúng ta sử dụng hai cách sau:
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.
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ả
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:
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.
| |||||||||||||||||
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ử 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. |
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 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 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' là mẫu vòng lặp gọn nhất. Nó bao gồm 3 phần quan trọng:
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.
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, đã đượ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 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.
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.
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.
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.
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ự 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:
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ính | Giá trị | Miêu tả |
---|---|---|
Offline | script | Kích hoạt khi tài liệu ở ngoại tuyến |
Onabort | script | Kích hoạt trên một sự kiện bỏ dở |
onafterprint | script | Kích hoạt sau khi tài liệu được in |
onbeforeonload | script | Kích hoạt trước khi tài liệu tải |
onbeforeprint | script | Kích hoạt trước khi tài liệu được in |
onblur | script | Kích hoạt khi cửa sổ mất trọng tâm |
oncanplay | script | Kích hoạt khi media có thể bắt đầu chơi, nhưng phải dừng để đệm |
oncanplaythrough | script | Kích hoạt khi media có thể chơi tới cuối, mà không dừng để đệm |
onchange | script | Kích hoạt khi một phần tử thay đổi |
onclick | script | Kích hoạt trên một cú click chuột |
oncontextmenu | script | Kích hoạt khi menu ngữ cảnh bị kích hoạt |
ondblclick | script | Kích hoạt khi nhấp đúp chuột |
ondrag | script | Kích hoạt khi một phần tử bị kéo |
ondragend | script | Kích hoạt tại phần cuối của hoạt động kéo |
ondragenter | script | Kích hoạt khi một phần tử đã được kéo tới một mục tiêu thả hợp lệ |
ondragleave | script | Kích hoạt khi một phần tử đang được kéo qua một mục tiêu thả hợp lệ |
ondragover | script | Kích hoạt tại phần đầu của hoạt động kéo |
ondragstart | script | Kích hoạt tại phần đầu của hoạt động kéo |
ondrop | script | Kích hoạt khi phần tử được kéo đang được thả |
ondurationchange | script | Kích hoạt khi độ dài của media được thay đổi |
onemptied | script | Kích hoạt khi phần tử nguồn media đột nhiên trở nên trống |
onended | script | Kích hoạt khi media tiến tới cuối cùng |
onerror | script | Kích hoạt khi một lỗi xảy ra |
onfocus | script | Kích hoạt khi cửa sổ nhận trọng tâm |
onformchange | script | Kích hoạt khi một form thay đổi |
onforminput | script | Kích hoạt khi một form nhận input từ người dùng |
onhaschange | script | Kích hoạt khi tài liệu có thay đổi |
oninput | script | Kích hoạt khi một phần tử nhận đầu vào từ người dùng |
oninvalid | script | Kích hoạt khi một phần tử không hợp lệ |
onkeydown | script | Kích hoạt khi một phím bị nhấn |
onkeypress | script | Kích hoạt khi một phím bị nhấn và được thả ra |
onkeyup | script | Kích hoạt khi một phím được thả ra |
onload | script | Kích hoạt khi tài liệu tải |
onloadeddata | script | Kích hoạt khi dữ liệu media được tải |
onloadedmetadata | script | Kích hoạt khi thời gian và dữ liệu khác của một phần tử media được tải |
onloadstart | script | Kích hoạt khi trình duyệt bắt đầu tải dữ liệu media |
onmessage | script | Kích hoạt khi thông báo được kích hoạt |
onmousedown | script | Kích hoạt khi một nút chuột được nhả ra |
onmousemove | script | Kích hoạt khi con trỏ chuột di chuyển |
onmouseout | script | Kích hoạt khi con trỏ chuột di chuyển ra khỏi một phần tử |
onmouseover | script | Kích hoạt khi con trỏ chuột di chuyển qua một phần tử |
onmouseup | script | Kích hoạt khi một nút chuột được nhả ra |
onmousewheel | script | Kích hoạt khi bánh xe chuột được quay |
onoffline | script | Kích hoạt khi tài liệu ở ngoại tuyến |
onoine | script | Kích hoạt khi tài liệu ở trực tuyến |
ononline | script | Kích hoạt khi tài liệu ở trực tuyến |
onpagehide | script | Kích hoạt khi cửa sổ bị ẩn |
onpageshow | script | Kích hoạt khi cửa sổ trở nên nhìn thấy |
onpause | script | Kích hoạt khi dữ liệu media bị dừng |
onplay | script | Kích hoạt khi dữ liệu media chuẩn bị bắt đầu chơi |
onplaying | script | Kích hoạt khi dữ liệu media đang bắt đầu chơi |
onpopstate | script | Kích hoạt khi lịch sử cửa sổ thay đổi |
onprogress | script | Kích hoạt khi trình duyệt đang nhận dữ liệu media |
onratechange | script | Kích hoạt khi tốc độ chơi của media đã thay đổi |
onreadystatechange | script | Kích hoạt khi trạng thái sẵn sàng thay đổi |
onredo | script | Kích hoạt khi tài liệu thực hiện một redo |
onresize | script | Kích hoạt khi cửa sổ bị thay đổi kích cỡ |
onscroll | script | Kích hoạt khi thanh cuốn của phần tử đang được cuốn |
onseeked | script | Kí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 |
onseeking | script | Kích hoạt khi thuộc tính seeking của một phần tử media là true, và seeking đã bắt đầu |
onselect | script | Kích hoạt khi một phần tử được chọn |
onstalled | script | Kích hoạt khi có một lỗi trong quá trình thu nhận dữ liệu media |
onstorage | script | Kích hoạt khi một tài liệu tải |
onsubmit | script | Kích hoạt khi một form được đệ trình |
onsuspend | script | Kí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 |
ontimeupdate | script | Kích hoạt khi media thay đổi vị trí chơi của nó |
onundo | script | Kích hoạt khi một tài liệu thực hiện một undo |
onunload | script | Kích hoạt khi người sử dụng rời khỏi tài liệu |
onvolumechange | script | Kích hoạt khi media thay đổi âm lượng, kể cả khi media được thiết lập là mute |
onwaiting | script | Kích hoạt khi media đã dừng chơi nhưng được mong chờ phục hồi. |
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 đó
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ự.
Expression | Miê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.
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ự.
Expression | Miê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 |
^p | Nó so khớp bất kỳ chuỗi nào bắt đầu bằng p |
Ví dụ sau giải thích chi tiết hơn về so khớp các ký tự.
Expression | Miê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.p | Nó 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ẻ và . |
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. |
Ký tự | Miêu tả |
---|---|
Alphanumeric | Chính nó |
\0 | Ký tự NUL (\u0000) |
\t | Tab (\u0009) |
\n | Dòng mới (\u000A) |
\v | Tab dọc (\u000B) |
\f | Form feed (\u000C) |
\r | Carriage return (\u000D) |
\xnn | Ký tự Latin được xác định bởi số thập lục phân nn; ví dụ: \x0A là như \n |
\uxxxx | Ký tự Unicode được xác định bởi số thập lục phân xxxx; ví dụ: \u0009 là \t |
\cX | Ký tự điều khiển ^X; Ví dụ: \cJ tương đương với ký tự dòng mới \n |
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 |
\s | Một ký tự khoảng trống trắng (space, tab, dòng mới) |
\S | Không phải ký tự khoảng trống trắng |
\d | Một chữ số (0-9) |
\D | Không là chữ số |
\w | Một ký tự từ (a-z, A-Z, 0-9, _) |
\W | Khô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 |
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, …
Modifier | Miêu tả |
---|---|
i | Thực hiện so khớp không phân biệt kiểu chữ (case-insensitive). |
m | Xá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. |
g | Thự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. |
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ính | Miêu tả |
---|---|
constructor | Xác định hàm tạo prototype của đối tượng. |
global | Xác định nếu lượng hóa "g" được thiết lập |
ignoreCase | Xác định nếu lượng hóa "i" được thiết lập |
lastIndex | Chỉ mục tại đó bắt đầu so khớp mới |
multiline | Xác định nếu lượng hóa "m" được thiết lập |
source | Văn bản của pattern |
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ức | Miê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. |
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".
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:
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à 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:
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:
Đố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.
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.
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à 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.
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.