Hướng dẫn javascript info pdf free download - tải xuống miễn phí thông tin javascript pdf

Permalink

bậc thầy

Chuyển nhánh/thẻ

Không thể tải các nhánh

Không có gì để hiển thị

{{refname}}

Tên đã được sử dụng

Một thẻ đã tồn tại với tên chi nhánh được cung cấp. Nhiều lệnh GIT chấp nhận cả tên thẻ và tên chi nhánh, vì vậy việc tạo nhánh này có thể gây ra hành vi bất ngờ. Bạn có chắc là bạn muốn tạo chi nhánh này?

Đi nộp

  • Đi nộp
  • Sao chép đường dẫn
  • Sao chép permalink

Không thể lấy lại những người đóng góp tại thời điểm này

3,65 MB

Tải xuống

  • Mở với máy tính để bàn
  • Tải xuống
  • Xóa tài liệu

Xin lỗi, có lỗi xảy ra. Tải lại?

Xin lỗi, chúng tôi không thể hiển thị tệp này.

Xin lỗi, tệp này không hợp lệ nên nó không thể được hiển thị.

Phần 1 Ngôn ngữ JavaScript Ilya Kantor được xây dựng vào ngày 10 tháng 7 năm 2019 Phiên bản cuối cùng của hướng dẫn là tại // jav

Lượt xem 6.942 lượt tải xuống 2.403 kích thước tệp 15MB Downloads 2,403 File size 15MB

Báo cáo DMCA / Bản quyền

TẢI TẬP TIN

Đề xuất câu chuyện

Xem trước trích dẫn

Phần 1

Ngôn ngữ JavaScript

Ilya Kantor

Được xây dựng vào ngày 10 tháng 7 năm 2019 Phiên bản cuối cùng của hướng dẫn là tại //javascript.info. Chúng tôi liên tục làm việc để cải thiện hướng dẫn. Nếu bạn tìm thấy bất kỳ sai lầm, xin vui lòng viết tại GitHub của chúng tôi. ●

Đầu tiên chúng tôi tìm kiếm một trích dẫn mở đầu "thì nếu chúng tôi có một dấu gạch chéo ngược . ] Và như vậy cho đến khi trích dẫn kết thúc.

Trong hành động: hãy để reg = /"[\. "\\\\ \\" ".. '; cảnh báo [str.match [reg]]; // "Kiểm tra tôi", "Say \" Hello \ "!", "\\ \" "

Đầu tiên chúng tôi tìm kiếm một trích dẫn mở đầu "thì nếu chúng tôi có một dấu gạch chéo ngược . ] Và như vậy cho đến khi trích dẫn kết thúc.

Đầu tiên chúng tôi tìm kiếm một trích dẫn mở đầu "thì nếu chúng tôi có một dấu gạch chéo ngược . ] Và như vậy cho đến khi trích dẫn kết thúc.

Đầu tiên chúng tôi tìm kiếm một trích dẫn mở đầu "thì nếu chúng tôi có một dấu gạch chéo ngược . ] Và như vậy cho đến khi trích dẫn kết thúc.

Trong hành động: hãy để reg = /"[\. "\\\\ \\" ".. '; cảnh báo [str.match [reg]]; // "Kiểm tra tôi", "Say \" Hello \ "!", "\\ \" "

Để xây dựng

Đầu tiên chúng tôi tìm kiếm một trích dẫn mở đầu "thì nếu chúng tôi có một dấu gạch chéo ngược . ] Và như vậy cho đến khi trích dẫn kết thúc.

Đầu tiên chúng tôi tìm kiếm một trích dẫn mở đầu "thì nếu chúng tôi có một dấu gạch chéo ngược . ] Và như vậy cho đến khi trích dẫn kết thúc.

Trong hành động: hãy để reg = /"[\. "\\\\ \\" ".. '; cảnh báo [str.match [reg]]; // "Kiểm tra tôi", "Say \" Hello \ "!", "\\ \" "

Để xây dựng

Tìm thẻ đầy đủ Khởi động mẫu là rõ ràng :]. Trong hành động: hãy để reg = /|\s.*?>]/g; cảnh báo ['' .match [reg]]; //,

Thông tin JavaScript có tốt cho việc học không?

JavaScript là ngôn ngữ quan trọng nhất bạn cần học như một nhà phát triển frontend. Đó là ngôn ngữ đầu tiên tuyệt vời cho các nhà phát triển web tìm hiểu vì: các ứng dụng web rất năng động vì JavaScript.

JavaScript có miễn phí không?

JavaScript là miễn phí để sử dụng cho tất cả mọi người.

Bạn có thể tải xuống JavaScript ở đâu?

Trình cài đặt JavaScript SyncFusion có thể được tải xuống từ trang web SyncFusion.com. Bạn có thể tải xuống trình cài đặt được cấp phép hoặc thử trình cài đặt thử nghiệm của chúng tôi tùy thuộc vào giấy phép của bạn.

JavaScript có khó học không?

Có thể cho rằng, JavaScript là một trong những ngôn ngữ lập trình dễ học nhất, vì vậy nó phục vụ như một ngôn ngữ đầu tiên tuyệt vời cho bất kỳ ai thương hiệu mới với mã hóa. Ngay cả các dòng phức tạp nhất của mã JavaScript cũng có thể được viết từng cái một, trong các đoạn. Nó cũng có thể được kiểm tra trong trình duyệt web cùng một lúc.

Xem trước trích dẫn

Phần 1

Ngôn ngữ JavaScript

Ilya Kantor

Được xây dựng vào ngày 10 tháng 7 năm 2019 Phiên bản cuối cùng của hướng dẫn là tại //javascript.info. Chúng tôi liên tục làm việc để cải thiện hướng dẫn. Nếu bạn tìm thấy bất kỳ sai lầm, xin vui lòng viết tại GitHub của chúng tôi. ●

Giới thiệu ●

Giới thiệu về JavaScript

Hướng dẫn và thông số kỹ thuật

Mã biên tập mã

Ban điêu khiển cải tiên hơn

Nguyên tắc cơ bản của JavaScript ●

Chào thế giới!

Cấu trúc mã

Chế độ hiện đại, "Sử dụng nghiêm ngặt"

Biến

Loại dữ liệu

Để xây dựng

Tìm thẻ đầy đủ Khởi động mẫu là rõ ràng :]. Trong hành động: hãy để reg = /|\s.*?>]/g; cảnh báo ['' .match [reg]]; //,

Thông tin JavaScript có tốt cho việc học không?

JavaScript là ngôn ngữ quan trọng nhất bạn cần học như một nhà phát triển frontend. Đó là ngôn ngữ đầu tiên tuyệt vời cho các nhà phát triển web tìm hiểu vì: các ứng dụng web rất năng động vì JavaScript.

JavaScript có miễn phí không?

JavaScript là miễn phí để sử dụng cho tất cả mọi người.

Bạn có thể tải xuống JavaScript ở đâu?

Trình cài đặt JavaScript SyncFusion có thể được tải xuống từ trang web SyncFusion.com. Bạn có thể tải xuống trình cài đặt được cấp phép hoặc thử trình cài đặt thử nghiệm của chúng tôi tùy thuộc vào giấy phép của bạn.

JavaScript có khó học không?

Có thể cho rằng, JavaScript là một trong những ngôn ngữ lập trình dễ học nhất, vì vậy nó phục vụ như một ngôn ngữ đầu tiên tuyệt vời cho bất kỳ ai thương hiệu mới với mã hóa. Ngay cả các dòng phức tạp nhất của mã JavaScript cũng có thể được viết từng cái một, trong các đoạn. Nó cũng có thể được kiểm tra trong trình duyệt web cùng một lúc.

Xem trước trích dẫn

Phần 1

Ngôn ngữ JavaScript

Ilya Kantor

Được xây dựng vào ngày 10 tháng 7 năm 2019 Phiên bản cuối cùng của hướng dẫn là tại //javascript.info. Chúng tôi liên tục làm việc để cải thiện hướng dẫn. Nếu bạn tìm thấy bất kỳ sai lầm, xin vui lòng viết tại GitHub của chúng tôi. ●

Giới thiệu ●

Giới thiệu về JavaScript

Hướng dẫn và thông số kỹ thuật

Mã biên tập mã

Ban điêu khiển cải tiên hơn

Nguyên tắc cơ bản của JavaScript ●

Chào thế giới!

Cấu trúc mã

Chế độ hiện đại, "Sử dụng nghiêm ngặt"

Biến

Loại dữ liệu

Nhập chuyển đổi

Người vận hành

So sánh

Tương tác: cảnh báo, nhắc nhở, xác nhận

Các nhà khai thác có điều kiện: Nếu, '?'

Toán tử logic

Vòng lặp: Trong khi và cho

Câu lệnh "Switch"

Chức năng

Biểu thức chức năng và mũi tên

JavaScript đặc biệt

Chất lượng mã ●

Gỡ lỗi trong Chrome

Phong cách mã hóa

Bình luận

Mã ninja

Thử nghiệm tự động với Mocha

Polyfills

Đối tượng: những điều cơ bản ●

Các đối tượng

Thu gom rác thải

Loại ký hiệu

Phương thức đối tượng, "cái này"

Phản đối chuyển đổi nguyên thủy

Hứa hẹn

Microtasks

Async/chờ đợi

Máy phát điện, Lặp lại nâng cao ●

Máy phát điện

Máy lặp và máy phát không đồng bộ

Mô -đun ●

Mô -đun, Giới thiệu

Xuất khẩu và nhập khẩu

Nhập khẩu động

Linh tinh ●

Proxy và phản ánh

Eval: Chạy chuỗi mã

Ở đây chúng tôi tìm hiểu JavaScript, bắt đầu từ đầu và tiếp tục các khái niệm nâng cao như OOP. Chúng tôi tập trung vào chính ngôn ngữ ở đây, với tối thiểu các ghi chú cụ thể về môi trường.

Giới thiệu về ngôn ngữ JavaScript và môi trường để phát triển với nó.

Giới thiệu về JavaScript, hãy để Lừa xem những gì rất đặc biệt về JavaScript, những gì chúng ta có thể đạt được với nó và những công nghệ khác chơi tốt với nó.

JavaScript là gì? JavaScript ban đầu được tạo ra để làm cho các trang web còn sống. Các chương trình trong ngôn ngữ này được gọi là tập lệnh. Chúng có thể được viết ngay trong một trang web HT HTML và chạy tự động khi tải trang. Các tập lệnh được cung cấp và thực thi dưới dạng văn bản đơn giản. Họ không cần sự chuẩn bị hoặc biên dịch đặc biệt để chạy. Trong khía cạnh này, JavaScript rất khác với một ngôn ngữ khác gọi là Java

.

Tại sao JavaScript?

Khi JavaScript được tạo ra, ban đầu nó có một tên khác: Lives Livescript. Nhưng Java rất nổi tiếng vào thời điểm đó, vì vậy người ta đã quyết định rằng việc định vị một ngôn ngữ mới là một người em trai của người Hồi giáo Java sẽ giúp đỡ. Nhưng khi nó phát triển, JavaScript trở thành một ngôn ngữ hoàn toàn độc lập với đặc điểm kỹ thuật của riêng nó được gọi là Ecmascript, và bây giờ nó không liên quan đến Java. Ngày nay, JavaScript có thể thực thi không chỉ trong trình duyệt mà còn trên máy chủ hoặc thực sự trên bất kỳ thiết bị nào có chương trình đặc biệt có tên là JavaScript Engine. Trình duyệt có một động cơ nhúng đôi khi được gọi là máy ảo JavaScript. Các động cơ khác nhau có các tên mã khác nhau. Ví dụ: ●

V8

Khỉ nhện

.

Tại sao JavaScript?

Khi JavaScript được tạo ra, ban đầu nó có một tên khác: Lives Livescript. Nhưng Java rất nổi tiếng vào thời điểm đó, vì vậy người ta đã quyết định rằng việc định vị một ngôn ngữ mới là một người em trai của người Hồi giáo Java sẽ giúp đỡ. Nhưng khi nó phát triển, JavaScript trở thành một ngôn ngữ hoàn toàn độc lập với đặc điểm kỹ thuật của riêng nó được gọi là Ecmascript, và bây giờ nó không liên quan đến Java. Ngày nay, JavaScript có thể thực thi không chỉ trong trình duyệt mà còn trên máy chủ hoặc thực sự trên bất kỳ thiết bị nào có chương trình đặc biệt có tên là JavaScript Engine. Trình duyệt có một động cơ nhúng đôi khi được gọi là máy ảo JavaScript. Các động cơ khác nhau có các tên mã khác nhau. Ví dụ: ●

V8

.

Tại sao JavaScript?

Khi JavaScript được tạo ra, ban đầu nó có một tên khác: Lives Livescript. Nhưng Java rất nổi tiếng vào thời điểm đó, vì vậy người ta đã quyết định rằng việc định vị một ngôn ngữ mới là một người em trai của người Hồi giáo Java sẽ giúp đỡ. Nhưng khi nó phát triển, JavaScript trở thành một ngôn ngữ hoàn toàn độc lập với đặc điểm kỹ thuật của riêng nó được gọi là Ecmascript, và bây giờ nó không liên quan đến Java. Ngày nay, JavaScript có thể thực thi không chỉ trong trình duyệt mà còn trên máy chủ hoặc thực sự trên bất kỳ thiết bị nào có chương trình đặc biệt có tên là JavaScript Engine. Trình duyệt có một động cơ nhúng đôi khi được gọi là máy ảo JavaScript. Các động cơ khác nhau có các tên mã khác nhau. Ví dụ: ●

V8

Khỉ nhện

- trong Chrome và Opera. 

- Trong Firefox.

Có những tên mã khác như Trident Trident và và chakra, cho các phiên bản khác nhau của IE, Chak Chakracore, cho Microsoft Edge, Hồi Nitro, và Squirelfish, cho Safari, v.v.

Các thuật ngữ trên là tốt để nhớ vì chúng được sử dụng trong các bài viết của nhà phát triển trên internet. Chúng tôi cũng sẽ sử dụng chúng. Chẳng hạn, nếu tính năng X được hỗ trợ bởi V8, thì nó có thể hoạt động trong Chrome và Opera.

Các tab/cửa sổ khác nhau thường không biết về nhau. Đôi khi, họ làm, ví dụ khi một cửa sổ sử dụng JavaScript để mở cái khác. Nhưng ngay cả trong trường hợp này, JavaScript từ một trang có thể không truy cập vào trang khác nếu chúng đến từ các trang web khác nhau [từ một miền, giao thức hoặc cổng khác nhau]. Đây được gọi là chính sách gốc của người Viking. Để làm việc xung quanh đó, cả hai trang phải đồng ý trao đổi dữ liệu và chứa mã JavaScript đặc biệt xử lý nó. Chúng tôi bao gồm điều đó trong hướng dẫn. Giới hạn này, một lần nữa, đối với sự an toàn của người dùng. Một trang từ //anysite.com mà người dùng đã mở không thể truy cập tab Trình duyệt khác với URL //gmail.com và đánh cắp thông tin từ đó.

JavaScript có thể dễ dàng liên lạc qua mạng đến máy chủ nơi trang hiện tại đến từ. Nhưng khả năng nhận dữ liệu từ các trang web/miền khác bị tê liệt. Mặc dù có thể, nó đòi hỏi phải thỏa thuận rõ ràng [được thể hiện trong các tiêu đề HTTP] từ phía từ xa. Một lần nữa, đó là một giới hạn an toàn.

Các giới hạn như vậy không tồn tại nếu JavaScript được sử dụng bên ngoài trình duyệt, ví dụ trên máy chủ. Các trình duyệt hiện đại cũng cho phép plugin/tiện ích mở rộng có thể yêu cầu các quyền mở rộng.

Điều gì làm cho JavaScript độc đáo? Có ít nhất ba điều tuyệt vời về JavaScript:

Tích hợp đầy đủ với HTML/CSS.

Những điều đơn giản được thực hiện đơn giản.

Hỗ trợ bởi tất cả các trình duyệt chính và được bật theo mặc định.

JavaScript là công nghệ trình duyệt duy nhất kết hợp ba điều này. Đó là những gì làm cho JavaScript độc đáo. Đó là lý do tại sao nó là công cụ phổ biến nhất để tạo giao diện trình duyệt. Mặc dù có kế hoạch học một công nghệ mới, nhưng nó có lợi để kiểm tra quan điểm của nó. Vì vậy, hãy để Lừa chuyển sang các xu hướng hiện đại ảnh hưởng đến nó, bao gồm các ngôn ngữ mới và khả năng trình duyệt.

Các ngôn ngữ trên mạng JavaScript Cú pháp của JavaScript không phù hợp với mọi người. Những người khác nhau muốn có các tính năng khác nhau. Điều đó được mong đợi, bởi vì các dự án và yêu cầu là khác nhau đối với tất cả mọi người. Vì vậy, gần đây, rất nhiều ngôn ngữ mới xuất hiện, được chuyển [chuyển đổi] thành JavaScript trước khi chúng chạy trong trình duyệt. Các công cụ hiện đại làm cho việc chuyển đổi rất nhanh và minh bạch, thực sự cho phép các nhà phát triển mã hóa bằng ngôn ngữ khác và tự động chuyển đổi nó dưới mui xe. Ví dụ về các ngôn ngữ đó: ●

CoffeeScript  là một loại đường cú pháp của người Viking cho JavaScript. Nó giới thiệu cú pháp ngắn hơn, cho phép chúng tôi viết mã rõ ràng hơn và chính xác hơn. Thông thường, Ruby Devs thích nó. TypeScript tập trung vào việc thêm dữ liệu nghiêm ngặt của nhóm gõ để đơn giản hóa sự phát triển và hỗ trợ của các hệ thống phức tạp. Nó được phát triển bởi Microsoft. lưu lượng

Cũng thêm gõ dữ liệu, nhưng theo một cách khác. Được phát triển bởi Facebook.

DART là một ngôn ngữ độc lập có động cơ riêng chạy trong môi trường không phải là trình duyệt [như ứng dụng di động], nhưng cũng có thể được chuyển sang JavaScript. Được phát triển bởi Google.

Có nhiều. Tất nhiên, ngay cả khi chúng ta sử dụng một trong những ngôn ngữ được truyền, chúng ta cũng nên biết JavaScript để thực sự hiểu những gì chúng ta đang làm.

Tóm tắt ●

JavaScript ban đầu được tạo ra như một ngôn ngữ chỉ dành cho trình duyệt, nhưng hiện cũng được sử dụng trong nhiều môi trường khác. Ngày nay, JavaScript có một vị trí duy nhất là ngôn ngữ trình duyệt được điều chỉnh rộng rãi nhất với tích hợp đầy đủ với HTML/CSS. Có nhiều ngôn ngữ nhận được các ngôn ngữ đã chuyển sang JavaScript và cung cấp một số tính năng nhất định. Bạn nên xem xét chúng, ít nhất là một thời gian ngắn, sau khi thành thạo JavaScript.

Hướng dẫn và thông số kỹ thuật Cuốn sách này là một hướng dẫn. Nó nhằm mục đích giúp bạn dần dần học ngôn ngữ. Nhưng một khi bạn đã quen thuộc với những điều cơ bản, bạn sẽ cần các nguồn khác.

Sự chỉ rõ

Thông số kỹ thuật ECMA-262 chứa thông tin chuyên sâu, chi tiết và chính thức nhất về JavaScript. Nó định nghĩa ngôn ngữ. Nhưng lúc đầu được chính thức hóa, nó khó hiểu. Vì vậy, nếu bạn cần nguồn thông tin đáng tin cậy nhất về các chi tiết ngôn ngữ, đặc điểm kỹ thuật là nơi phù hợp. Nhưng nó không sử dụng hàng ngày. Dự thảo mới nhất là tại //tc39.es/ecma262/

Cũng thêm gõ dữ liệu, nhưng theo một cách khác. Được phát triển bởi Facebook.

DART là một ngôn ngữ độc lập có động cơ riêng chạy trong môi trường không phải là trình duyệt [như ứng dụng di động], nhưng cũng có thể được chuyển sang JavaScript. Được phát triển bởi Google.

Có nhiều. Tất nhiên, ngay cả khi chúng ta sử dụng một trong những ngôn ngữ được truyền, chúng ta cũng nên biết JavaScript để thực sự hiểu những gì chúng ta đang làm.

Tóm tắt ●

.

Mặc dù, nó thường tốt nhất để sử dụng tìm kiếm trên internet. Chỉ cần sử dụng MD MDN [thuật ngữ] trong truy vấn, ví dụ: //google.com/search?q=mdn+ParseInt để tìm kiếm chức năng ParseInt. ●

MSDN - Hướng dẫn sử dụng Microsoft với nhiều thông tin, bao gồm JavaScript [thường giới thiệu là JScript]. Nếu một người cần một cái gì đó cụ thể cho Internet Explorer, tốt hơn là hãy đến đó: //msdn.microsoft.com/. Ngoài ra, chúng ta có thể sử dụng một tìm kiếm trên internet với các cụm từ, chẳng hạn như REGEXP MSDN, hoặc REGEXP MSDN JScript.

Hỗ trợ tính năng JavaScript là một ngôn ngữ đang phát triển, các tính năng mới được thêm vào thường xuyên. Để xem sự hỗ trợ của họ giữa các động cơ dựa trên trình duyệt và các động cơ khác, hãy xem: ●

//caniuse.com-Bảng hỗ trợ trên mỗi tính năng, ví dụ: Để xem động cơ nào hỗ trợ các chức năng mật mã hiện đại: //caniuse.com/#feat=cryptography. //kangax.github.io/compat-teable hỗ trợ những người hoặc hỗ trợ don don.

- Một bảng có các tính năng và động cơ ngôn ngữ

Tất cả các tài nguyên này đều hữu ích trong việc phát triển thực tế, vì chúng chứa thông tin có giá trị về các chi tiết ngôn ngữ, hỗ trợ của chúng, v.v. Vui lòng ghi nhớ chúng [hoặc trang này] cho các trường hợp khi bạn cần thông tin chuyên sâu về một tính năng cụ thể.

Mã biên tập một trình chỉnh sửa mã là nơi các lập trình viên dành phần lớn thời gian của họ.

Có hai loại trình chỉnh sửa mã chính: IDES và trình chỉnh sửa nhẹ. Nhiều người sử dụng một công cụ của từng loại.

IDE Thuật ngữ IDE [môi trường phát triển tích hợp] đề cập đến một trình soạn thảo mạnh mẽ với nhiều tính năng thường hoạt động trên toàn bộ dự án. Như tên cho thấy, nó không chỉ là một biên tập viên, mà là một môi trường phát triển toàn diện. IDE tải dự án [có thể là nhiều tệp], cho phép điều hướng giữa các tệp, cung cấp tự động hoàn thành dựa trên toàn bộ dự án [không chỉ tệp mở] và tích hợp với hệ thống quản lý phiên bản [như GIT], môi trường thử nghiệm, môi trường thử nghiệm, và những thứ khác ở cấp độ dự án của người Viking. Nếu bạn đã chọn một IDE, hãy xem xét các tùy chọn sau: ●

Visual Studio Code

//caniuse.com-Bảng hỗ trợ trên mỗi tính năng, ví dụ: Để xem động cơ nào hỗ trợ các chức năng mật mã hiện đại: //caniuse.com/#feat=cryptography. //kangax.github.io/compat-teable hỗ trợ những người hoặc hỗ trợ don don.

- Một bảng có các tính năng và động cơ ngôn ngữ

Tất cả các tài nguyên này đều hữu ích trong việc phát triển thực tế, vì chúng chứa thông tin có giá trị về các chi tiết ngôn ngữ, hỗ trợ của chúng, v.v. Vui lòng ghi nhớ chúng [hoặc trang này] cho các trường hợp khi bạn cần thông tin chuyên sâu về một tính năng cụ thể.

Mã biên tập một trình chỉnh sửa mã là nơi các lập trình viên dành phần lớn thời gian của họ.

Có hai loại trình chỉnh sửa mã chính: IDES và trình chỉnh sửa nhẹ. Nhiều người sử dụng một công cụ của từng loại.

IDE Thuật ngữ IDE [môi trường phát triển tích hợp] đề cập đến một trình soạn thảo mạnh mẽ với nhiều tính năng thường hoạt động trên toàn bộ dự án. Như tên cho thấy, nó không chỉ là một biên tập viên, mà là một môi trường phát triển toàn diện. IDE tải dự án [có thể là nhiều tệp], cho phép điều hướng giữa các tệp, cung cấp tự động hoàn thành dựa trên toàn bộ dự án [không chỉ tệp mở] và tích hợp với hệ thống quản lý phiên bản [như GIT], môi trường thử nghiệm, môi trường thử nghiệm, và những thứ khác ở cấp độ dự án của người Viking. Nếu bạn đã chọn một IDE, hãy xem xét các tùy chọn sau: ●

//caniuse.com-Bảng hỗ trợ trên mỗi tính năng, ví dụ: Để xem động cơ nào hỗ trợ các chức năng mật mã hiện đại: //caniuse.com/#feat=cryptography. //kangax.github.io/compat-teable hỗ trợ những người hoặc hỗ trợ don don.

//caniuse.com-Bảng hỗ trợ trên mỗi tính năng, ví dụ: Để xem động cơ nào hỗ trợ các chức năng mật mã hiện đại: //caniuse.com/#feat=cryptography. //kangax.github.io/compat-teable hỗ trợ những người hoặc hỗ trợ don don.

//caniuse.com-Bảng hỗ trợ trên mỗi tính năng, ví dụ: Để xem động cơ nào hỗ trợ các chức năng mật mã hiện đại: //caniuse.com/#feat=cryptography. //kangax.github.io/compat-teable hỗ trợ những người hoặc hỗ trợ don don.

- Một bảng có các tính năng và động cơ ngôn ngữ

Tất cả các tài nguyên này đều hữu ích trong việc phát triển thực tế, vì chúng chứa thông tin có giá trị về các chi tiết ngôn ngữ, hỗ trợ của chúng, v.v. Vui lòng ghi nhớ chúng [hoặc trang này] cho các trường hợp khi bạn cần thông tin chuyên sâu về một tính năng cụ thể.

Mã biên tập một trình chỉnh sửa mã là nơi các lập trình viên dành phần lớn thời gian của họ.

Có hai loại trình chỉnh sửa mã chính: IDES và trình chỉnh sửa nhẹ. Nhiều người sử dụng một công cụ của từng loại.

IDE Thuật ngữ IDE [môi trường phát triển tích hợp] đề cập đến một trình soạn thảo mạnh mẽ với nhiều tính năng thường hoạt động trên toàn bộ dự án. Như tên cho thấy, nó không chỉ là một biên tập viên, mà là một môi trường phát triển toàn diện. IDE tải dự án [có thể là nhiều tệp], cho phép điều hướng giữa các tệp, cung cấp tự động hoàn thành dựa trên toàn bộ dự án [không chỉ tệp mở] và tích hợp với hệ thống quản lý phiên bản [như GIT], môi trường thử nghiệm, môi trường thử nghiệm, và những thứ khác ở cấp độ dự án của người Viking. Nếu bạn đã chọn một IDE, hãy xem xét các tùy chọn sau: ●

Visual Studio Code

BRIAL Webstorm

[đa nền tảng, miễn phí].

Google Chrome Mở lỗi trang.html. Có một lỗi trong mã JavaScript trên đó. Nó ẩn giấu từ một khách truy cập thường xuyên, vì vậy, hãy để các công cụ của nhà phát triển mở để xem nó. Nhấn F12 hoặc, nếu bạn trên MAC, thì CMD+OPT+J. Các công cụ nhà phát triển sẽ mở trên tab Bảng điều khiển theo mặc định. Nó trông có vẻ như thế này:

Cái nhìn chính xác của các công cụ phát triển phụ thuộc vào phiên bản Chrome của bạn. Nó thay đổi theo thời gian nhưng nên tương tự. ●

Ở đây chúng ta có thể thấy thông báo lỗi màu đỏ. Trong trường hợp này, kịch bản chứa một lệnh không xác định của Lalala. Ở bên phải, có một liên kết có thể nhấp đến lỗi nguồn.html: 12 với số dòng xảy ra lỗi.

Bên dưới thông báo lỗi, có một ký hiệu màu xanh>. Nó đánh dấu một dòng lệnh của người Viking, nơi chúng ta có thể nhập các lệnh JavaScript. Nhấn Enter để chạy chúng [SHIFT+ENTER vào các lệnh đa dòng đầu vào]. Bây giờ chúng ta có thể thấy lỗi, và điều đó đủ để bắt đầu. Chúng tôi sẽ quay trở lại với các công cụ phát triển sau này và bao gồm gỡ lỗi sâu hơn trong chương trình gỡ lỗi trong Chrome.

Firefox, Edge và các trình duyệt khác, hầu hết các trình duyệt khác sử dụng F12 để mở các công cụ phát triển. Cái nhìn và cảm giác của họ là khá giống nhau. Khi bạn biết cách sử dụng một trong những công cụ này [bạn có thể bắt đầu với Chrome], bạn có thể dễ dàng chuyển sang một công cụ khác.

Safari Safari [Trình duyệt MAC, không được Windows/Linux hỗ trợ] là một chút đặc biệt ở đây. Chúng ta cần kích hoạt menu phát triển trực tuyến trước tiên. Tùy chọn mở và đi đến khung Advanced Advanced. Có một hộp kiểm ở phía dưới:

Bây giờ CMD+OPT+C có thể chuyển đổi bảng điều khiển. Ngoài ra, lưu ý rằng mục menu hàng đầu mới có tên là Phát triển đã xuất hiện. Nó có nhiều lệnh và tùy chọn.

Đầu vào đa dòng thường, khi chúng ta đặt một dòng mã vào bảng điều khiển, sau đó nhấn Enter, nó thực thi. Để chèn nhiều dòng, nhấn Shift+Enter.

Tóm tắt ●

Các công cụ phát triển cho phép chúng tôi thấy lỗi, chạy lệnh, kiểm tra các biến và nhiều hơn nữa.

Ở đây chúng ta có thể thấy thông báo lỗi màu đỏ. Trong trường hợp này, kịch bản chứa một lệnh không xác định của Lalala. Ở bên phải, có một liên kết có thể nhấp đến lỗi nguồn.html: 12 với số dòng xảy ra lỗi.

Bên dưới thông báo lỗi, có một ký hiệu màu xanh>. Nó đánh dấu một dòng lệnh của người Viking, nơi chúng ta có thể nhập các lệnh JavaScript. Nhấn Enter để chạy chúng [SHIFT+ENTER vào các lệnh đa dòng đầu vào]. Bây giờ chúng ta có thể thấy lỗi, và điều đó đủ để bắt đầu. Chúng tôi sẽ quay trở lại với các công cụ phát triển sau này và bao gồm gỡ lỗi sâu hơn trong chương trình gỡ lỗi trong Chrome.

Firefox, Edge và các trình duyệt khác, hầu hết các trình duyệt khác sử dụng F12 để mở các công cụ phát triển. Cái nhìn và cảm giác của họ là khá giống nhau. Khi bạn biết cách sử dụng một trong những công cụ này [bạn có thể bắt đầu với Chrome], bạn có thể dễ dàng chuyển sang một công cụ khác.

Safari Safari [Trình duyệt MAC, không được Windows/Linux hỗ trợ] là một chút đặc biệt ở đây. Chúng ta cần kích hoạt menu phát triển trực tuyến trước tiên. Tùy chọn mở và đi đến khung Advanced Advanced. Có một hộp kiểm ở phía dưới:

Bây giờ CMD+OPT+C có thể chuyển đổi bảng điều khiển. Ngoài ra, lưu ý rằng mục menu hàng đầu mới có tên là Phát triển đã xuất hiện. Nó có nhiều lệnh và tùy chọn.

Đầu vào đa dòng thường, khi chúng ta đặt một dòng mã vào bảng điều khiển, sau đó nhấn Enter, nó thực thi. Để chèn nhiều dòng, nhấn Shift+Enter.

Tóm tắt ●

Các công cụ phát triển cho phép chúng tôi thấy lỗi, chạy lệnh, kiểm tra các biến và nhiều hơn nữa.

Chúng có thể được mở với F12 cho hầu hết các trình duyệt trên Windows. Chrome cho Mac cần CMD+OPT+J, Safari: CMD+OPT+C [cần bật trước].

Bây giờ chúng ta đã sẵn sàng môi trường. Trong phần tiếp theo, chúng tôi sẽ xuống JavaScript.

Các nguyên tắc cơ bản của JavaScript cho phép tìm hiểu các nguyên tắc cơ bản của việc xây dựng kịch bản.

Chào thế giới! Phần này của hướng dẫn là về JavaScript cốt lõi, chính ngôn ngữ. Sau đó, bạn sẽ tìm hiểu về Node.js và các nền tảng khác sử dụng nó. Nhưng chúng tôi cần một môi trường làm việc để chạy các kịch bản của chúng tôi và, vì cuốn sách này là trực tuyến, trình duyệt là một lựa chọn tốt. Chúng tôi sẽ giữ số lượng các lệnh dành riêng cho trình duyệt [như cảnh báo] ở mức tối thiểu để bạn không dành thời gian cho chúng nếu bạn có kế hoạch tập trung vào một môi trường khác [như Node.js]. Chúng tôi tập trung vào JavaScript trong trình duyệt trong phần tiếp theo của hướng dẫn. Vì vậy, trước tiên, hãy để xem cách chúng tôi đính kèm tập lệnh vào một trang web. Đối với các môi trường phía máy chủ [như Node.js], bạn có thể thực thi tập lệnh bằng một lệnh như "Node my.js".

Các chương trình JavaScript của Tag script script có thể được đưa vào bất kỳ phần nào của tài liệu HTML với sự trợ giúp của

... sau kịch bản.

Các

Thủ thuật này được sử dụng trong JavaScript hiện đại. Những bình luận này đã ẩn mã JavaScript từ các trình duyệt cũ mà không biết cách xử lý

Ở đây, /path/to/script.js là một đường dẫn tuyệt đối đến tệp tập lệnh [từ root trang web]. Bạn cũng có thể cung cấp một đường dẫn tương đối từ trang hiện tại. Chẳng hạn, src = "script.js" có nghĩa là một tệp "script.js" trong thư mục hiện tại. Chúng tôi cũng có thể cung cấp một URL đầy đủ. Ví dụ:

Để đính kèm một số tập lệnh, hãy sử dụng nhiều thẻ:

Xin lưu ý:

Tóm tắt ●

Các công cụ phát triển cho phép chúng tôi thấy lỗi, chạy lệnh, kiểm tra các biến và nhiều hơn nữa.

Chúng có thể được mở với F12 cho hầu hết các trình duyệt trên Windows. Chrome cho Mac cần CMD+OPT+J, Safari: CMD+OPT+C [cần bật trước].

Bây giờ chúng ta đã sẵn sàng môi trường. Trong phần tiếp theo, chúng tôi sẽ xuống JavaScript.

Các nguyên tắc cơ bản của JavaScript cho phép tìm hiểu các nguyên tắc cơ bản của việc xây dựng kịch bản.

Để giải pháp

Hiển thị một cảnh báo với tầm quan trọng của tập lệnh bên ngoài: 5 Lấy giải pháp của nhiệm vụ trước đó cho thấy cảnh báo. Sửa đổi nó bằng cách trích xuất nội dung tập lệnh thành một tệp bên ngoài cảnh báo.js, nằm trong cùng một thư mục. Mở trang, đảm bảo rằng cảnh báo hoạt động. Để giải pháp

Cấu trúc mã Điều đầu tiên chúng tôi nghiên cứu là các khối xây dựng mã.

Các câu lệnh là cấu trúc cú pháp và các lệnh thực hiện các hành động. Chúng tôi đã thấy một tuyên bố, cảnh giác ['Xin chào, thế giới!'], Trong đó hiển thị thông điệp Hello Hello, World! Chúng tôi có thể có nhiều câu trong mã của chúng tôi như chúng tôi muốn. Các tuyên bố có thể được phân tách bằng một dấu chấm phẩy. Ví dụ: ở đây chúng tôi chia ra thế giới Hello Hello thế giới thành hai cảnh báo:

cảnh báo ['xin chào']; cảnh báo ['thế giới'];

Thông thường, các câu lệnh được viết trên các dòng riêng biệt để làm cho mã dễ đọc hơn:

cảnh báo ['xin chào']; cảnh báo ['thế giới'];

Thông thường, các câu lệnh được viết trên các dòng riêng biệt để làm cho mã dễ đọc hơn:

Bán kết Một dấu chấm phẩy có thể bị bỏ qua trong hầu hết các trường hợp khi tồn tại một dòng phá vỡ. Điều này cũng sẽ hoạt động:

cảnh báo ['xin chào'] cảnh báo ['thế giới']

Ở đây, JavaScript diễn giải dòng phá vỡ như một dấu chấm phẩy ngầm của người Hồi giáo. Đây được gọi là chèn dấu chấm phẩy tự động. Trong hầu hết các trường hợp, một dòng mới ngụ ý một dấu chấm phẩy. Nhưng trong hầu hết các trường hợp, không có nghĩa là luôn luôn có nghĩa là người Viking! Có những trường hợp khi một dòng mới không có nghĩa là dấu chấm phẩy. Ví dụ:

cảnh báo [3 + 1 + 2];

Mã xuất ra 6 vì JavaScript không chèn các dấu chấm phẩy ở đây. Rõ ràng là nếu dòng kết thúc bằng một điểm cộng "+", thì đó là một biểu thức không hoàn chỉnh của người Hồi giáo, do đó, dấu chấm phẩy không bắt buộc. Và trong trường hợp này hoạt động như dự định. Nhưng có những tình huống mà JavaScript đã thất bại khi giả sử một dấu chấm phẩy nơi nó thực sự cần thiết. Lỗi xảy ra trong các trường hợp như vậy khá khó tìm và sửa chữa.

Một ví dụ về một lỗi

Nếu bạn tò mò muốn thấy một ví dụ cụ thể về một lỗi như vậy, hãy kiểm tra mã này:

[1, 2] .foreach [cảnh báo]

Không cần phải suy nghĩ về ý nghĩa của dấu ngoặc [] và foreach chưa. Chúng tôi sẽ nghiên cứu chúng sau. Hiện tại, chỉ cần nhớ kết quả của mã: nó hiển thị 1 sau đó 2. Bây giờ, hãy để thêm một cảnh báo trước mã và không hoàn thành nó bằng dấu chấm phẩy: cảnh báo ["Sẽ có lỗi"] [1, 2] .foreach [ALERT]

Bây giờ nếu chúng ta chạy mã, chỉ cảnh báo đầu tiên được hiển thị và sau đó chúng ta có lỗi! Nhưng mọi thứ lại ổn nếu chúng ta thêm một dấu chấm phẩy sau cảnh báo: cảnh báo ["Tất cả bây giờ tốt"]; [1, 2] .foreach [cảnh báo]

Bây giờ chúng tôi có tin nhắn hiện tại tất cả các loại tốt, sau đó là 1 và 2. Lỗi trong biến thể NO-Semeolon xảy ra vì JavaScript không giả sử dấu chấm phẩy trước khung vuông [...]. Vì vậy, vì dấu chấm phẩy không được tự động chèn, mã trong ví dụ đầu tiên được coi là một tuyên bố duy nhất. Ở đây, cách thức động cơ nhìn thấy nó:

cảnh báo ["Sẽ có một lỗi"] [1, 2] .foreach [ALERT]

Nhưng nó nên là hai câu riêng biệt, không phải một. Một sự hợp nhất như vậy trong trường hợp này chỉ là sai, do đó lỗi. Điều này có thể xảy ra trong các tình huống khác. Chúng tôi khuyên bạn nên đặt dấu chấm phẩy giữa các tuyên bố ngay cả khi chúng được phân tách bằng các dòng mới. Quy tắc này được cộng đồng áp dụng rộng rãi. Hãy lưu ý một lần nữa - có thể bỏ qua các dấu chấm phẩy hầu hết thời gian. Nhưng nó an toàn hơn - đặc biệt là cho người mới bắt đầu - sử dụng chúng.

Nhận xét Khi thời gian trôi qua, các chương trình ngày càng trở nên phức tạp hơn. Nó trở nên cần thiết để thêm nhận xét mô tả những gì mã làm và tại sao. Nhận xét có thể được đưa vào bất kỳ nơi nào của một kịch bản. Họ không ảnh hưởng đến việc thực hiện nó vì động cơ chỉ đơn giản là bỏ qua chúng.

Nhận xét một dòng bắt đầu với hai ký tự chém về phía trước //. Phần còn lại của dòng là một bình luận. Nó có thể chiếm một dòng đầy đủ của riêng mình hoặc làm theo một tuyên bố. Như ở đây:

// Nhận xét này chiếm một dòng cảnh báo của riêng mình ['Xin chào']; cảnh báo ['thế giới']; // Nhận xét này theo tuyên bố

Nhận xét đa dòng bắt đầu bằng một dấu gạch chéo phía trước và dấu hoa thị / * và kết thúc bằng dấu hoa thị và một dấu gạch chéo phía trước * /. Như thế này:

/* Một ví dụ với hai tin nhắn. Đây là một nhận xét đa dòng. */ cảnh báo ['xin chào']; cảnh báo ['thế giới'];

Nội dung của các bình luận bị bỏ qua, vì vậy nếu chúng ta đặt mã bên trong / * * * /, nó đã giành được thực thi. Đôi khi nó có thể tiện dụng để vô hiệu hóa tạm thời một phần của mã:

Mã xuất ra 6 vì JavaScript không chèn các dấu chấm phẩy ở đây. Rõ ràng là nếu dòng kết thúc bằng một điểm cộng "+", thì đó là một biểu thức không hoàn chỉnh của người Hồi giáo, do đó, dấu chấm phẩy không bắt buộc. Và trong trường hợp này hoạt động như dự định. Nhưng có những tình huống mà JavaScript đã thất bại khi giả sử một dấu chấm phẩy nơi nó thực sự cần thiết. Lỗi xảy ra trong các trường hợp như vậy khá khó tìm và sửa chữa.

Một ví dụ về một lỗi

Nếu bạn tò mò muốn thấy một ví dụ cụ thể về một lỗi như vậy, hãy kiểm tra mã này:

[1, 2] .foreach [cảnh báo]

Không cần phải suy nghĩ về ý nghĩa của dấu ngoặc [] và foreach chưa. Chúng tôi sẽ nghiên cứu chúng sau. Hiện tại, chỉ cần nhớ kết quả của mã: nó hiển thị 1 sau đó 2. Bây giờ, hãy để thêm một cảnh báo trước mã và không hoàn thành nó bằng dấu chấm phẩy: cảnh báo ["Sẽ có lỗi"] [1, 2] .foreach [ALERT]

Bây giờ nếu chúng ta chạy mã, chỉ cảnh báo đầu tiên được hiển thị và sau đó chúng ta có lỗi! Nhưng mọi thứ lại ổn nếu chúng ta thêm một dấu chấm phẩy sau cảnh báo: cảnh báo ["Tất cả bây giờ tốt"]; [1, 2] .foreach [cảnh báo]

Xin vui lòng, đừng ngần ngại bình luận mã của bạn. Nhận xét tăng dấu chân mã tổng thể, nhưng đó không phải là vấn đề gì cả. Có nhiều công cụ thu nhỏ mã trước khi xuất bản lên máy chủ sản xuất. Họ loại bỏ các bình luận, vì vậy họ không xuất hiện trong các kịch bản làm việc. Do đó, ý kiến ​​không có tác động tiêu cực đến sản xuất. Sau này trong hướng dẫn sẽ có một chất lượng mã chương cũng giải thích cách viết nhận xét tốt hơn.

Chế độ hiện đại, "Sử dụng nghiêm ngặt" trong một thời gian dài, JavaScript phát triển mà không có vấn đề tương thích. Các tính năng mới đã được thêm vào ngôn ngữ trong khi chức năng cũ không thay đổi. Điều đó có lợi ích là không bao giờ phá vỡ mã hiện có. Nhưng nhược điểm là bất kỳ sai lầm hoặc quyết định không hoàn hảo nào được đưa ra bởi những người sáng tạo JavaScript đã bị mắc kẹt trong ngôn ngữ mãi mãi. Đây là trường hợp cho đến năm 2009 khi Ecmascript 5 [ES5] xuất hiện. Nó đã thêm các tính năng mới vào ngôn ngữ và sửa đổi một số trong các tính năng hiện có. Để giữ cho mã cũ hoạt động, hầu hết các sửa đổi đều bị tắt theo mặc định. Bạn cần kích hoạt rõ ràng họ bằng một chỉ thị đặc biệt: "Sử dụng nghiêm ngặt".

Sử dụng nghiêm ngặt, chỉ thị trông giống như một chuỗi: "Sử dụng nghiêm ngặt" hoặc 'sử dụng nghiêm ngặt'. Khi nó nằm ở đầu một kịch bản, toàn bộ kịch bản hoạt động theo cách hiện đại của người Hồi giáo. Ví dụ:

"Sử dụng nghiêm ngặt"; // Mã này hoạt động theo cách hiện đại ...

Chúng tôi sẽ tìm hiểu các chức năng [một cách để các lệnh nhóm] sớm sớm. Nhìn về phía trước, hãy để Lôi chỉ lưu ý rằng "sử dụng nghiêm ngặt" có thể được đặt ở đầu hầu hết các loại chức năng thay vì toàn bộ kịch bản. Làm điều đó chỉ cho phép chế độ nghiêm ngặt trong chức năng đó. Nhưng thông thường, mọi người sử dụng nó cho toàn bộ kịch bản.

Đảm bảo rằng việc sử dụng nghiêm ngặt ”ở trên đỉnh

Vui lòng đảm bảo rằng "sử dụng nghiêm ngặt" ở đầu tập lệnh của bạn, nếu không chế độ nghiêm ngặt có thể không được bật. Chế độ nghiêm ngặt được kích hoạt ở đây:

cảnh báo ["một số mã"]; // "Sử dụng nghiêm ngặt" bên dưới bị bỏ qua-nó phải ở trên cùng "sử dụng nghiêm ngặt"; // Chế độ nghiêm ngặt không được kích hoạt

Chỉ những bình luận có thể xuất hiện ở trên "Sử dụng nghiêm ngặt".

Đảm bảo rằng việc sử dụng nghiêm ngặt ”ở trên đỉnh

Vui lòng đảm bảo rằng "sử dụng nghiêm ngặt" ở đầu tập lệnh của bạn, nếu không chế độ nghiêm ngặt có thể không được bật. Chế độ nghiêm ngặt được kích hoạt ở đây:

cảnh báo ["một số mã"]; // "Sử dụng nghiêm ngặt" bên dưới bị bỏ qua-nó phải ở trên cùng "sử dụng nghiêm ngặt"; // Chế độ nghiêm ngặt không được kích hoạt

Chỉ những bình luận có thể xuất hiện ở trên "Sử dụng nghiêm ngặt".

Không có cách nào để hủy sử dụng nghiêm ngặt

Không có chỉ thị như "không sử dụng nghiêm ngặt" mà đưa động cơ trở lại hành vi cũ. Khi chúng ta vào chế độ nghiêm ngặt, không có sự trở lại.

Bảng điều khiển trình duyệt cho tương lai, khi bạn sử dụng bảng điều khiển trình duyệt để kiểm tra các tính năng, xin lưu ý rằng nó không sử dụng nghiêm ngặt theo mặc định. Đôi khi, khi sử dụng nghiêm ngặt tạo ra sự khác biệt, bạn sẽ nhận được kết quả không chính xác. Bạn có thể cố gắng nhấn Shift+Enter vào đầu vào nhiều dòng và đặt sử dụng nghiêm ngặt trên đầu, như thế này:

'Sử dụng nghiêm ngặt'; // ...ma cua ban

Nó hoạt động trong hầu hết các trình duyệt, cụ thể là Firefox và Chrome. Nếu nó không có, cách đáng tin cậy nhất để đảm bảo sử dụng nghiêm ngặt sẽ là nhập mã vào bảng điều khiển như thế này:

[function [] {'sử dụng nghiêm ngặt'; // ... mã của bạn ...}] []

Luôn luôn sử dụng nghiêm ngặt ”

Chúng tôi vẫn chưa bao gồm sự khác biệt giữa chế độ nghiêm ngặt và chế độ mặc định trên mạng. Trong các chương tiếp theo, khi chúng tôi tìm hiểu các tính năng ngôn ngữ, chúng tôi sẽ lưu ý sự khác biệt giữa các chế độ nghiêm ngặt và mặc định. May mắn thay, có rất nhiều và họ thực sự làm cho cuộc sống của chúng ta tốt hơn. Hiện tại, nó đủ để biết về nó nói chung: 1. Chỉ thị "sử dụng nghiêm ngặt" chuyển động cơ sang chế độ hiện đại, thay đổi hành vi của một số tính năng tích hợp. Chúng tôi sẽ thấy các chi tiết sau này trong hướng dẫn. 2. Chế độ nghiêm ngặt được bật bằng cách đặt "Sử dụng nghiêm ngặt" ở đầu tập lệnh hoặc hàm. Một số tính năng ngôn ngữ, như các lớp học của các lớp và các mô -đun trực tuyến, và tự động bật chế độ nghiêm ngặt. 3. Chế độ nghiêm ngặt được hỗ trợ bởi tất cả các trình duyệt hiện đại. 4. Chúng tôi đề nghị luôn luôn bắt đầu các tập lệnh với "sử dụng nghiêm ngặt". Tất cả các ví dụ trong hướng dẫn này giả định chế độ nghiêm ngặt trừ khi [rất hiếm khi] được chỉ định khác.

Các biến hầu hết thời gian, một ứng dụng JavaScript cần làm việc với thông tin. Dưới đây là hai ví dụ: 1. Một cửa hàng trực tuyến - Thông tin có thể bao gồm hàng hóa được bán và giỏ hàng. 2. Một ứng dụng trò chuyện - Thông tin có thể bao gồm người dùng, tin nhắn và nhiều hơn nữa. Các biến được sử dụng để lưu trữ thông tin này.

Một biến Một biến là một bộ lưu trữ có tên là dữ liệu. Chúng tôi có thể sử dụng các biến để lưu trữ các tính năng, khách truy cập và dữ liệu khác. Để tạo một biến trong JavaScript, hãy sử dụng từ khóa LET. Câu lệnh bên dưới tạo ra [nói cách khác: khai báo hoặc xác định] một biến có tên là tin nhắn trực tuyến:

Hãy để tin nhắn;

Để súc tích, chúng ta có thể kết hợp khai báo và gán biến thành một dòng duy nhất:

hãy để tin nhắn = 'Xin chào!'; // Xác định biến và gán cảnh báo giá trị [tin nhắn]; // Xin chào!

Chúng tôi cũng có thể khai báo nhiều biến trong một dòng:

Hãy để người dùng = 'John', tuổi = 25, tin nhắn = 'xin chào';

Điều đó có vẻ ngắn hơn, nhưng chúng tôi không khuyến khích nó. Để có khả năng đọc tốt hơn, vui lòng sử dụng một dòng cho mỗi biến. Biến thể đa dòng dài hơn một chút, nhưng dễ đọc hơn:

Hãy để người dùng = 'John'; để tuổi = 25; hãy để tin nhắn = 'xin chào';

Một số người cũng xác định nhiều biến theo kiểu đa dòng này:

Hãy để người dùng = 'John', tuổi = 25, tin nhắn = 'xin chào';

Điều đó có vẻ ngắn hơn, nhưng chúng tôi không khuyến khích nó. Để có khả năng đọc tốt hơn, vui lòng sử dụng một dòng cho mỗi biến. Biến thể đa dòng dài hơn một chút, nhưng dễ đọc hơn:

Hãy để người dùng = 'John'; để tuổi = 25; hãy để tin nhắn = 'xin chào';

Một số người cũng xác định nhiều biến theo kiểu đa dòng này:

Mạnh hoặc thậm chí trong phong cách đầu tiên của dấu phẩy:

Hãy để người dùng = 'John', tuổi = 25, tin nhắn = 'xin chào';

Về mặt kỹ thuật, tất cả các biến thể này làm điều tương tự. Vì vậy, nó là một vấn đề về sở thích cá nhân và thẩm mỹ.

var thay vì để

Trong các tập lệnh cũ hơn, bạn cũng có thể tìm thấy một từ khóa khác: var thay vì LET: var message = 'hello';

Từ khóa VAR gần giống như LET. Nó cũng tuyên bố một biến số, nhưng theo một cách hơi khác, trường học cũ. Có sự khác biệt tinh tế giữa LET và VAR, nhưng chúng chưa quan trọng đối với chúng tôi. Chúng tôi sẽ bao gồm chúng một cách chi tiết trong chương "Var" cũ.

Một sự tương tự trong đời thực, chúng ta có thể dễ dàng nắm bắt được khái niệm về một biến số của người Hồi giáo nếu chúng ta tưởng tượng nó là một hộp hộp cho dữ liệu, với một nhãn dán được đặt tên độc đáo trên đó. Chẳng hạn, thông báo biến có thể được tưởng tượng là một hộp được dán nhãn "Tin nhắn" với giá trị "Xin chào!" trong đó:

Chúng ta có thể đặt bất kỳ giá trị nào vào hộp. Chúng tôi cũng có thể thay đổi nó bao nhiêu lần tùy thích:

Hãy để tin nhắn; tin nhắn = 'Xin chào!'; thông điệp = 'Thế giới!'; // giá trị thay đổi cảnh báo [tin nhắn];

Mạnh hoặc thậm chí trong phong cách đầu tiên của dấu phẩy:

Hãy để người dùng = 'John', tuổi = 25, tin nhắn = 'xin chào';

Về mặt kỹ thuật, tất cả các biến thể này làm điều tương tự. Vì vậy, nó là một vấn đề về sở thích cá nhân và thẩm mỹ.

var thay vì để

Trong các tập lệnh cũ hơn, bạn cũng có thể tìm thấy một từ khóa khác: var thay vì LET: var message = 'hello';

Từ khóa VAR gần giống như LET. Nó cũng tuyên bố một biến số, nhưng theo một cách hơi khác, trường học cũ. Có sự khác biệt tinh tế giữa LET và VAR, nhưng chúng chưa quan trọng đối với chúng tôi. Chúng tôi sẽ bao gồm chúng một cách chi tiết trong chương "Var" cũ.

Một sự tương tự trong đời thực, chúng ta có thể dễ dàng nắm bắt được khái niệm về một biến số của người Hồi giáo nếu chúng ta tưởng tượng nó là một hộp hộp cho dữ liệu, với một nhãn dán được đặt tên độc đáo trên đó. Chẳng hạn, thông báo biến có thể được tưởng tượng là một hộp được dán nhãn "Tin nhắn" với giá trị "Xin chào!" trong đó:

Chúng ta có thể đặt bất kỳ giá trị nào vào hộp. Chúng tôi cũng có thể thay đổi nó bao nhiêu lần tùy thích:

Hãy để tin nhắn; tin nhắn = 'Xin chào!'; thông điệp = 'Thế giới!'; // giá trị thay đổi cảnh báo [tin nhắn];

Khi giá trị được thay đổi, dữ liệu cũ sẽ bị xóa khỏi biến:

Mạnh hoặc thậm chí trong phong cách đầu tiên của dấu phẩy:

Hãy để người dùng = 'John', tuổi = 25, tin nhắn = 'xin chào';

Về mặt kỹ thuật, tất cả các biến thể này làm điều tương tự. Vì vậy, nó là một vấn đề về sở thích cá nhân và thẩm mỹ.

Mạnh hoặc thậm chí trong phong cách đầu tiên của dấu phẩy:

Hãy để người dùng = 'John', tuổi = 25, tin nhắn = 'xin chào';

Về mặt kỹ thuật, tất cả các biến thể này làm điều tương tự. Vì vậy, nó là một vấn đề về sở thích cá nhân và thẩm mỹ.

var thay vì để

Trong các tập lệnh cũ hơn, bạn cũng có thể tìm thấy một từ khóa khác: var thay vì LET: var message = 'hello';

Từ khóa VAR gần giống như LET. Nó cũng tuyên bố một biến số, nhưng theo một cách hơi khác, trường học cũ. Có sự khác biệt tinh tế giữa LET và VAR, nhưng chúng chưa quan trọng đối với chúng tôi. Chúng tôi sẽ bao gồm chúng một cách chi tiết trong chương "Var" cũ.

Một sự tương tự trong đời thực, chúng ta có thể dễ dàng nắm bắt được khái niệm về một biến số của người Hồi giáo nếu chúng ta tưởng tượng nó là một hộp hộp cho dữ liệu, với một nhãn dán được đặt tên độc đáo trên đó. Chẳng hạn, thông báo biến có thể được tưởng tượng là một hộp được dán nhãn "Tin nhắn" với giá trị "Xin chào!" trong đó:

var thay vì để

Trong các tập lệnh cũ hơn, bạn cũng có thể tìm thấy một từ khóa khác: var thay vì LET: var message = 'hello';

Từ khóa VAR gần giống như LET. Nó cũng tuyên bố một biến số, nhưng theo một cách hơi khác, trường học cũ. Có sự khác biệt tinh tế giữa LET và VAR, nhưng chúng chưa quan trọng đối với chúng tôi. Chúng tôi sẽ bao gồm chúng một cách chi tiết trong chương "Var" cũ.

Trong các tập lệnh cũ hơn, bạn cũng có thể tìm thấy một từ khóa khác: var thay vì LET: var message = 'hello';

Từ khóa VAR gần giống như LET. Nó cũng tuyên bố một biến số, nhưng theo một cách hơi khác, trường học cũ. Có sự khác biệt tinh tế giữa LET và VAR, nhưng chúng chưa quan trọng đối với chúng tôi. Chúng tôi sẽ bao gồm chúng một cách chi tiết trong chương "Var" cũ.

Một sự tương tự trong đời thực, chúng ta có thể dễ dàng nắm bắt được khái niệm về một biến số của người Hồi giáo nếu chúng ta tưởng tượng nó là một hộp hộp cho dữ liệu, với một nhãn dán được đặt tên độc đáo trên đó. Chẳng hạn, thông báo biến có thể được tưởng tượng là một hộp được dán nhãn "Tin nhắn" với giá trị "Xin chào!" trong đó:

// Lưu ý: Không "sử dụng nghiêm ngặt" trong ví dụ này num = 5; // biến "num" được tạo nếu nó không tồn tại cảnh báo [num]; // 5

Đây là một thông lệ xấu và sẽ gây ra lỗi ở chế độ nghiêm ngặt:

"Sử dụng nghiêm ngặt"; num = 5; // Lỗi: Num không được xác định

Các hằng số để khai báo một biến hằng [không thay đổi], sử dụng const thay vì cho: const mybirthday = '18 .04.1982 ';

Các biến được tuyên bố bằng cách sử dụng const được gọi là hằng số. Họ không thể thay đổi. Một nỗ lực để làm như vậy sẽ gây ra lỗi:

const mybirthday = '18 .04.1982 '; mybirthday = '01 .01.2001 '; // Lỗi, không thể gán lại hằng số!

Khi một lập trình viên chắc chắn rằng một biến sẽ không bao giờ thay đổi, họ có thể khai báo nó với Const để đảm bảo và truyền đạt rõ ràng sự thật đó cho mọi người.

Hằng số từ trên Có một thực hành rộng rãi để sử dụng các hằng số làm bí danh cho các giá trị khó nhớ được biết trước khi thực hiện. Các hằng số như vậy được đặt tên bằng cách sử dụng chữ in hoa và dấu gạch dưới. Chẳng hạn, hãy để các hằng số cho các màu sắc trong cái gọi là định dạng Web Web [Hexadecimal]:

const color_red = "#f00"; const color_green = "#0f0"; const color_blue = "#00f";

const color_orange = "#ff7f00"; // ... Khi chúng ta cần chọn một màu, hãy để màu = color_orange; cảnh báo [màu]; // #ff7f00

Lợi ích: ●

Color_orange dễ nhớ hơn nhiều so với "#ff7f00".

Nó dễ dàng hơn nhiều để phân tích "#ff7f00" so với color_orange.

Nó dễ dàng hơn nhiều để phân tích "#ff7f00" so với color_orange.

Khi đọc mã, color_orange có ý nghĩa hơn nhiều so với #ff7f00.

Khi nào chúng ta nên sử dụng thủ đô cho một hằng số và khi nào chúng ta nên đặt tên cho nó bình thường? Hãy để cho điều đó rõ ràng. Là một hằng số của người Viking, chỉ có nghĩa là giá trị của một biến không bao giờ thay đổi. Nhưng có những hằng số được biết trước khi thực hiện [như giá trị thập lục phân cho màu đỏ] và có các hằng số được tính theo thời gian chạy, trong quá trình thực hiện, nhưng không thay đổi sau khi gán ban đầu. Ví dụ:

const pageloadtime = / * Thời gian được thực hiện bởi một trang web để tải * /;

Giá trị của pageloadtime không được biết đến trước khi tải trang, do đó, nó có tên bình thường. Nhưng nó vẫn là một hằng số vì nó không thay đổi sau khi chuyển nhượng. Nói cách khác, các hằng số có tên vốn chỉ được sử dụng làm bí danh cho các giá trị mã hóa cứng.

Nó dễ dàng hơn nhiều để phân tích "#ff7f00" so với color_orange.

Nó dễ dàng hơn nhiều để phân tích "#ff7f00" so với color_orange.

Khi đọc mã, color_orange có ý nghĩa hơn nhiều so với #ff7f00.

Khi nào chúng ta nên sử dụng thủ đô cho một hằng số và khi nào chúng ta nên đặt tên cho nó bình thường? Hãy để cho điều đó rõ ràng. Là một hằng số của người Viking, chỉ có nghĩa là giá trị của một biến không bao giờ thay đổi. Nhưng có những hằng số được biết trước khi thực hiện [như giá trị thập lục phân cho màu đỏ] và có các hằng số được tính theo thời gian chạy, trong quá trình thực hiện, nhưng không thay đổi sau khi gán ban đầu. Ví dụ:

const pageloadtime = / * Thời gian được thực hiện bởi một trang web để tải * /;

Giá trị của pageloadtime không được biết đến trước khi tải trang, do đó, nó có tên bình thường. Nhưng nó vẫn là một hằng số vì nó không thay đổi sau khi chuyển nhượng. Nói cách khác, các hằng số có tên vốn chỉ được sử dụng làm bí danh cho các giá trị mã hóa cứng.

Kể tên những điều đúng đắn nói về các biến, có một điều cực kỳ quan trọng hơn. Một tên biến cần có một ý nghĩa rõ ràng, rõ ràng, mô tả dữ liệu mà nó lưu trữ. Đặt tên biến là một trong những kỹ năng quan trọng và phức tạp nhất trong lập trình. Một cái nhìn nhanh vào các tên biến có thể tiết lộ mã nào được viết bởi người mới bắt đầu so với một nhà phát triển có kinh nghiệm. Trong một dự án thực sự, hầu hết thời gian được dành để sửa đổi và mở rộng một cơ sở mã hiện có thay vì viết một cái gì đó hoàn toàn tách biệt với đầu. Khi chúng tôi trở lại một số mã sau khi làm một việc khác trong một thời gian, nó sẽ dễ dàng hơn nhiều để tìm thấy thông tin được dán nhãn tốt. Hoặc, nói cách khác, khi các biến có tên tốt. Vui lòng dành thời gian suy nghĩ về tên phù hợp cho một biến trước khi khai báo nó. Làm như vậy sẽ trả nợ cho bạn một cách đẹp đẽ. Một số quy tắc tốt theo dõi là: ●

Nó dễ dàng hơn nhiều để phân tích "#ff7f00" so với color_orange.

Các biến nên được đặt tên theo cách cho phép chúng ta dễ dàng hiểu được những gì bên trong chúng.

Nhiệm vụ làm việc với các biến quan trọng: 2 1. Khai báo hai biến: quản trị viên và tên. 2. Gán giá trị "John" cho tên. 3. Sao chép giá trị từ tên này sang quản trị viên. 4. Hiển thị giá trị của quản trị viên bằng cách sử dụng cảnh báo [phải xuất ra John John].

Để giải pháp

Cho đúng tên tầm quan trọng: 3 1. Tạo một biến với tên của hành tinh của chúng ta. Làm thế nào bạn sẽ đặt tên cho một biến như vậy? 2. Tạo một biến để lưu trữ tên của một khách truy cập hiện tại vào một trang web. Làm thế nào bạn sẽ đặt tên cho biến đó? Để giải pháp

Constercase const? Tầm quan trọng: 4 Kiểm tra mã sau: const sinh nhật = '18 .04.1982 '; const tuổi = somecode [sinh nhật];

Ở đây chúng tôi có một ngày sinh nhật liên tục và tuổi được tính từ sinh nhật với sự trợ giúp của một số mã [nó không được cung cấp cho thời gian ngắn và vì chi tiết không quan trọng ở đây]. Sẽ đúng khi sử dụng trường hợp trên cho sinh nhật? Cho tuổi? Hoặc thậm chí cho cả hai? sinh nhật const = '18 .04.1982 '; // Làm từ dưới? const tuổi = somecode [sinh nhật]; // Làm từ dưới?

Để giải pháp

Cho đúng tên tầm quan trọng: 3 1. Tạo một biến với tên của hành tinh của chúng ta. Làm thế nào bạn sẽ đặt tên cho một biến như vậy? 2. Tạo một biến để lưu trữ tên của một khách truy cập hiện tại vào một trang web. Làm thế nào bạn sẽ đặt tên cho biến đó? Để giải pháp

Constercase const? Tầm quan trọng: 4 Kiểm tra mã sau: const sinh nhật = '18 .04.1982 '; const tuổi = somecode [sinh nhật];

Ở đây chúng tôi có một ngày sinh nhật liên tục và tuổi được tính từ sinh nhật với sự trợ giúp của một số mã [nó không được cung cấp cho thời gian ngắn và vì chi tiết không quan trọng ở đây]. Sẽ đúng khi sử dụng trường hợp trên cho sinh nhật? Cho tuổi? Hoặc thậm chí cho cả hai? sinh nhật const = '18 .04.1982 '; // Làm từ dưới? const tuổi = somecode [sinh nhật]; // Làm từ dưới?

Kiểu dữ liệu Một biến trong JavaScript có thể chứa bất kỳ dữ liệu nào. Một biến có thể tại một thời điểm là một chuỗi và tại một số khác là một số:

// không có lỗi, hãy để tin nhắn = "xin chào"; tin nhắn = 123456;

Các ngôn ngữ lập trình cho phép những thứ như vậy được gọi là gõ một cách tự động, có nghĩa là có các loại dữ liệu, nhưng các biến không bị ràng buộc với bất kỳ loại nào trong số chúng. Có bảy loại dữ liệu cơ bản trong JavaScript. Ở đây, chúng tôi sẽ bao gồm chúng nói chung và trong các chương tiếp theo, chúng tôi sẽ nói về từng người trong số họ một cách chi tiết.

Một số hãy n = 123; n = 12.345;

Loại số đại diện cho cả số số nguyên và số nổi. Có nhiều hoạt động cho các số, ví dụ: phép nhân *, chia /, bổ sung +, phép trừ -, v.v. Bên cạnh các số thông thường, còn có những giá trị số đặc biệt được gọi là, cũng thuộc loại dữ liệu này: vô cực, -Infinity và Nan. ●

Infinity đại diện cho vô cùng toán học bất kỳ số nào.

. Đó là một giá trị đặc biệt mà lớn hơn

Chúng ta có thể nhận được nó như là kết quả của sự phân chia theo 0:

cảnh báo [1/0]; // Vô cực

Hoặc chỉ tham khảo trực tiếp nó:

cảnh báo [vô cực]; // Vô cực

NAN đại diện cho một lỗi tính toán. Nó là kết quả của một hoạt động toán học không chính xác hoặc không xác định, ví dụ:

cảnh báo ["không phải là số" / 2]; // nan, sự phân chia như vậy là sai lầm

Nan là dính. Bất kỳ hoạt động nào nữa trên NAN trả về NAN: cảnh báo ["không phải là số" / 2 + 5]; // nan

Vì vậy, nếu có một nan ở đâu đó trong một biểu thức toán học, nó sẽ tuyên truyền đến toàn bộ kết quả.

Hoạt động toán học an toàn

Làm toán là một người an toàn trong JavaScript. Chúng ta có thể làm bất cứ điều gì: chia cho 0, coi các chuỗi không phải là số là số, v.v ... Kịch bản sẽ không bao giờ dừng lại với một lỗi nghiêm trọng [Hồi Die]. Tệ nhất, chúng tôi sẽ nhận được NAN như là kết quả. Các giá trị số đặc biệt chính thức thuộc về loại số trực tuyến. Tất nhiên chúng không phải là những con số theo nghĩa chung của từ này.

Chúng tôi sẽ thấy nhiều hơn về việc làm việc với các số trong các số chương.

Một chuỗi Một chuỗi trong JavaScript phải được bao quanh bởi các trích dẫn.

Đặt str = "xin chào"; Đặt str2 = 'trích dẫn đơn cũng vậy'; Đặt cụm từ = `có thể nhúng $ {str}`;

Trong JavaScript, có 3 loại trích dẫn. 1. Double Trích dẫn: "Xin chào". 2. Trích dẫn đơn: 'Xin chào'. 3. Backticks: `Xin chào`. Trích dẫn kép và đơn là trích dẫn đơn giản của người Viking. Không có sự khác biệt giữa họ trong JavaScript. Backticks là các trích dẫn chức năng mở rộng của người Viking. Chúng cho phép chúng tôi nhúng các biến và biểu thức vào một chuỗi bằng cách gói chúng trong $ {,}, ví dụ: hãy để name = "john"; // nhúng một cảnh báo biến [`Xin chào, $ {name}!`]; // Chào John! // nhúng cảnh báo biểu thức [`Kết quả là $ {1 + 2}}]; // kết quả là 3

cảnh báo ["không phải là số" / 2]; // nan, sự phân chia như vậy là sai lầm

Nan là dính. Bất kỳ hoạt động nào nữa trên NAN trả về NAN: cảnh báo ["không phải là số" / 2 + 5]; // nan

Vì vậy, nếu có một nan ở đâu đó trong một biểu thức toán học, nó sẽ tuyên truyền đến toàn bộ kết quả.

hãy để nameFieldChecked = true; // Có, trường tên được kiểm tra cho AgeFieldChecked = false; // Không, trường tuổi không được kiểm tra

Các giá trị Boolean cũng là kết quả của sự so sánh:

Let Isgreater = 4> 1; cảnh báo [Isgreater]; // true [kết quả so sánh là "có"]

Chúng tôi sẽ bao gồm Booleans sâu hơn trong các toán tử logic chương.

Giá trị của NULL giá trị giá trị null đặc biệt không thuộc về bất kỳ loại nào được mô tả ở trên. Nó tạo thành một loại riêng biệt của riêng nó chỉ chứa giá trị null: Let Age = null;

Trong JavaScript, NULL không phải là một tài liệu tham khảo về một đối tượng không tồn tại, hay một con trỏ Null Null giống như trong một số ngôn ngữ khác. Nó chỉ là một giá trị đặc biệt đại diện cho không có gì, không có giá trị nào. Mã trên nói rằng tuổi không rõ hoặc trống vì một số lý do.

Giá trị không xác định của người Viking Giá trị đặc biệt không được xác định cũng đứng cách nhau. Nó làm cho một loại của riêng mình, giống như null. Ý nghĩa của không xác định là giá trị không được gán. Nếu một biến được khai báo, nhưng không được gán, thì giá trị của nó không được xác định: Đặt x; cảnh báo [x]; // cho thấy "không xác định"

Về mặt kỹ thuật, có thể gán không xác định cho bất kỳ biến nào:

Đặt x = 123; x = không xác định; cảnh báo [x]; // "chưa xác định"

Nhưng chúng tôi không khuyên bạn nên làm điều đó. Thông thường, chúng tôi sử dụng NULL để gán một giá trị trống rỗng hoặc không xác định được cho một biến và chúng tôi sử dụng không xác định để kiểm tra như xem liệu một biến có được chỉ định không.

Đối tượng và ký hiệu Loại đối tượng là đặc biệt. Tất cả các loại khác được gọi là nguyên thủy, vì các giá trị của chúng chỉ có thể chứa một thứ duy nhất [có thể là một chuỗi hoặc một số hoặc bất cứ điều gì]. Ngược lại, các đối tượng được sử dụng để lưu trữ các bộ sưu tập dữ liệu và các thực thể phức tạp hơn. Chúng tôi sẽ đối phó với chúng sau này trong các đối tượng chương sau khi chúng tôi tìm hiểu thêm về các nguyên thủy. Loại ký hiệu được sử dụng để tạo số nhận dạng duy nhất cho các đối tượng. Chúng tôi phải đề cập đến nó ở đây để hoàn thiện, nhưng nó tốt hơn để nghiên cứu loại này sau các đối tượng.

Toán tử typeOf Trình vận hành typeOf trả về loại đối số. Nó rất hữu ích khi chúng tôi muốn xử lý các giá trị của các loại khác nhau khác nhau hoặc chỉ muốn kiểm tra nhanh. Nó hỗ trợ hai dạng cú pháp: 1. Là người vận hành: typeof x. 2. Là một hàm: Loại [x]. Nói cách khác, nó hoạt động với dấu ngoặc đơn hoặc không có chúng. Kết quả là như nhau. Call to typeof X trả về một chuỗi với tên loại: typeof Undefined // "loại" loại "không xác định 0 //" số "typeof true //" boolean "typeof" foo "//" chuỗi "biểu tượng loại // "Biểu tượng" Toán loại // "Đối tượng"

[1]

typeof null // "Đối tượng"

[2]

TypeOf Alert // "Chức năng"

[3]

Ba dòng cuối cùng có thể cần giải thích bổ sung: 1. Toán học là một đối tượng tích hợp cung cấp các hoạt động toán học. Chúng tôi sẽ học nó trong các số chương. Ở đây, nó chỉ phục vụ như một ví dụ về một đối tượng. 2. Kết quả của typeof null là "đối tượng". Sai rồi. Đó là một lỗi chính thức được công nhận trong typeof, được giữ để tương thích. Tất nhiên, NULL không phải là một đối tượng. Nó là một giá trị đặc biệt với một loại riêng của riêng nó. Vì vậy, một lần nữa, đây là một lỗi trong ngôn ngữ. 3. Kết quả của cảnh báo loại là "hàm", vì cảnh báo là một hàm. Chúng tôi sẽ nghiên cứu các chức năng trong các chương tiếp theo, nơi chúng tôi cũng sẽ thấy rằng không có loại chức năng đặc biệt nào trong JavaScript. Các chức năng thuộc loại đối tượng. Nhưng typeof đối xử với họ khác nhau, trả lại "chức năng". Điều đó không hoàn toàn chính xác, nhưng rất thuận tiện trong thực tế.

Tóm tắt Có 7 loại dữ liệu cơ bản trong JavaScript. ●

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Boolean cho Đúng / Sai.

null cho các giá trị không xác định - một loại độc lập có một giá trị duy nhất null.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Số cho số của bất kỳ loại nào: Số nguyên hoặc điểm nổi. Chuỗi cho chuỗi. Một chuỗi có thể có một hoặc nhiều ký tự, không có loại SingleCharacter riêng biệt.

Boolean cho Đúng / Sai.

null cho các giá trị không xác định - một loại độc lập có một giá trị duy nhất null.

Không xác định cho các giá trị không được chỉ định - một loại độc lập có một giá trị duy nhất không được xác định.

Đối tượng cho các cấu trúc dữ liệu phức tạp hơn.

Biểu tượng cho số nhận dạng duy nhất.

Chưa nói về các đối tượng

Trong chương này, chúng tôi đã giành được các đối tượng che phủ. Thay vào đó, chúng tôi sẽ nghiên cứu nguyên thủy trước. Sau đó, sau khi chúng tôi tìm hiểu về các đối tượng, chúng tôi sẽ thấy cách chuyển đổi đối tượng hoạt động trong đối tượng chương sang chuyển đổi nguyên thủy.

Chuyển đổi chuỗi toString xảy ra khi chúng ta cần dạng chuỗi của một giá trị. Ví dụ, cảnh báo [giá trị] thực hiện nó để hiển thị giá trị. Chúng ta cũng có thể gọi hàm chuỗi [giá trị] để chuyển đổi giá trị thành chuỗi: LET value = true; cảnh báo [giá trị loại]; // boolean value = chuỗi [giá trị]; // Bây giờ giá trị là một chuỗi cảnh báo "true" [giá trị typeOf]; // sợi dây

Chuyển đổi chuỗi chủ yếu là rõ ràng. A Sai trở thành "sai", null trở thành "null", v.v.

Chuyển đổi số tonumber xảy ra trong các hàm và biểu thức toán học tự động. Ví dụ: khi phân chia / được áp dụng cho những người không phải là người: cảnh báo ["6" / "2"]; // 3, chuỗi được chuyển đổi thành số

Chúng ta có thể sử dụng hàm số [giá trị] để chuyển đổi một cách rõ ràng một giá trị thành một số:

Đặt str = "123"; cảnh báo [typeof str]; // chuỗi let num = number [str]; // trở thành một cảnh báo số 123 [typeOf num]; // con số

Chuyển đổi rõ ràng thường được yêu cầu khi chúng tôi đọc một giá trị từ một nguồn dựa trên chuỗi như một biểu mẫu văn bản nhưng mong đợi một số sẽ được nhập. Nếu chuỗi không phải là một số hợp lệ, kết quả của việc chuyển đổi như vậy là NAN. Ví dụ: Let Age = Number ["một chuỗi tùy ý thay vì số"]; cảnh báo [tuổi]; // nan, chuyển đổi không thành công

Quy tắc chuyển đổi số: Giá trị

Trở thành…

chưa xác định

Nan

vô giá trị

0

đúng và sai

1 và 0 khoảng trắng từ đầu và kết thúc được loại bỏ. Nếu chuỗi còn lại trống, kết quả là 0.

sợi dây

Mặt khác, số là người đọc đọc từ chuỗi. Một lỗi cho NAN.

Ví dụ:

cảnh báo [cảnh báo [cảnh báo [cảnh báo [

Số ["123"]]; // 123 số ["123z"]]; // nan [lỗi đọc một số tại số "z"] [true]]; // 1 số [sai]]; // 0

Xin lưu ý rằng NULL và không xác định hoạt động khác nhau ở đây: null trở thành 0 trong khi không xác định trở thành NAN.

Bổ sung ’+chuỗi Concatenates chuỗi

Hầu như tất cả các hoạt động toán học chuyển đổi giá trị thành số. Một ngoại lệ đáng chú ý là bổ sung +. Nếu một trong các giá trị được thêm vào là một chuỗi, một giá trị còn lại cũng được chuyển đổi thành một chuỗi. Sau đó, nó kết hợp [tham gia] chúng:

cảnh báo [1 + '2']; // '12' [chuỗi bên phải] cảnh báo ['1' + 2]; // '12' [chuỗi bên trái]

Điều này chỉ xảy ra khi ít nhất một trong các đối số là một chuỗi. Nếu không, các giá trị được chuyển đổi thành số.

Chuyển đổi Boolean của Toboolean là đơn giản nhất. Nó xảy ra trong các hoạt động logic [sau đó chúng tôi sẽ đáp ứng các thử nghiệm điều kiện và những điều tương tự khác] nhưng cũng có thể được thực hiện rõ ràng với một cuộc gọi để Boolean [giá trị]. Quy tắc chuyển đổi: ●

Các giá trị có trực giác trống rỗng, như 0, một chuỗi trống, null, không xác định và nan, trở nên sai. Các giá trị khác trở thành đúng.

Ví dụ:

cảnh báo [boolean [1]]; // cảnh báo thực [boolean [0]]; // cảnh báo sai [boolean ["xin chào"]]; // cảnh báo thực sự [boolean [""]]; // sai

Xin lưu ý: Chuỗi bằng không "0" là đúng

Một số ngôn ngữ [cụ thể là PHP] coi "0" là sai. Nhưng trong JavaScript, một chuỗi không trống luôn luôn đúng. cảnh báo [boolean ["0"]]; // cảnh báo thực sự [boolean [""]]; // không gian, cũng đúng [bất kỳ chuỗi không trống nào là đúng]

Tóm tắt Ba chuyển đổi loại được sử dụng rộng rãi nhất là chuỗi, thành số và boolean.

ToString - xảy ra khi chúng ta xuất ra một cái gì đó. Có thể được thực hiện với chuỗi [giá trị]. Việc chuyển đổi thành chuỗi thường rõ ràng cho các giá trị nguyên thủy. Tonumber - xảy ra trong các hoạt động toán học. Có thể được thực hiện với số [giá trị]. Chuyển đổi tuân theo các quy tắc: giá trị

Trở thành…

chưa xác định

Nan

vô giá trị

0

đúng và sai

1 và 0 khoảng trắng từ đầu và kết thúc được loại bỏ. Nếu chuỗi còn lại trống, kết quả là 0.

sợi dây

Mặt khác, số là người đọc đọc từ chuỗi. Một lỗi cho NAN.

Ví dụ:

cảnh báo [cảnh báo [cảnh báo [cảnh báo [

Số ["123"]]; // 123 số ["123z"]]; // nan [lỗi đọc một số tại số "z"] [true]]; // 1 số [sai]]; // 0

Xin lưu ý rằng NULL và không xác định hoạt động khác nhau ở đây: null trở thành 0 trong khi không xác định trở thành NAN.

Các giá trị có trực giác trống rỗng, như 0, một chuỗi trống, null, không xác định và nan, trở nên sai. Các giá trị khác trở thành đúng.

Ví dụ:

cảnh báo [boolean [1]]; // cảnh báo thực [boolean [0]]; // cảnh báo sai [boolean ["xin chào"]]; // cảnh báo thực sự [boolean [""]]; // sai

Hãy suy nghĩ tốt, viết ra và sau đó so sánh với câu trả lời. Để giải pháp

Các nhà khai thác Chúng tôi biết nhiều nhà khai thác từ trường học. Chúng là những thứ như bổ sung +, nhân *, phép trừ -, v.v. Trong chương này, chúng tôi sẽ tập trung vào các khía cạnh của các nhà khai thác không được bao phủ bởi số học của trường.

Các điều khoản: Một số người không phải là người khác, một số người khác, một số người, một số người khác, trước khi chúng ta tiếp tục, hãy để nắm bắt một số thuật ngữ phổ biến. ●

Một toán hạng - là những gì các nhà khai thác được áp dụng. Chẳng hạn, trong phép nhân 5 * 2 có hai toán hạng: toán hạng bên trái là 5 và toán hạng bên phải là 2. Đôi khi, mọi người gọi những đối số này là những người khác, thay vì các vở opera của người Viking. Một nhà điều hành là đơn giản nếu nó có một toán hạng duy nhất. Ví dụ: sự phủ định đơn giản - đảo ngược dấu hiệu của một số:

Đặt x = 1; x = -x; cảnh báo [x]; // -1, sự phủ định chưa được áp dụng

Một toán hạng - là những gì các nhà khai thác được áp dụng. Chẳng hạn, trong phép nhân 5 * 2 có hai toán hạng: toán hạng bên trái là 5 và toán hạng bên phải là 2. Đôi khi, mọi người gọi những đối số này là những người khác, thay vì các vở opera của người Viking. Một nhà điều hành là đơn giản nếu nó có một toán hạng duy nhất. Ví dụ: sự phủ định đơn giản - đảo ngược dấu hiệu của một số:

Đặt x = 1; x = -x; cảnh báo [x]; // -1, sự phủ định chưa được áp dụng

Một nhà điều hành là nhị phân nếu nó có hai toán hạng. Cùng một điểm trừ cũng tồn tại ở dạng nhị phân:

Đặt x = 1, y = 3; cảnh báo [y - x]; // 2, nhị phân trừ các giá trị

Chính thức, chúng tôi nói về hai toán tử khác nhau ở đây: sự phủ định không [toán hạng đơn: đảo ngược dấu hiệu] và phép trừ nhị phân [hai toán hạng: trừ].

Kết hợp chuỗi, nhị phân + bây giờ, hãy để xem các tính năng đặc biệt của các toán tử JavaScript vượt ra ngoài trường học. Thông thường, toán tử cộng + số tổng. Nhưng, nếu nhị phân + được áp dụng cho các chuỗi, nó sẽ hợp nhất [concatenates] chúng:

Đặt S = "của tôi" + "chuỗi"; cảnh báo [s]; // MyString

Lưu ý rằng nếu một trong các toán hạng là một chuỗi, chuỗi còn lại cũng được chuyển đổi thành một chuỗi. Ví dụ:

cảnh báo ['1' + 2]; // "12" cảnh báo [2 + '1']; // "21"

Hãy xem, nó không quan trọng cho dù toán hạng đầu tiên là một chuỗi hay là chuỗi thứ hai. Quy tắc rất đơn giản: nếu một trong hai toán hạng là một chuỗi, một loại còn lại cũng được chuyển đổi thành một chuỗi. Tuy nhiên, lưu ý rằng các hoạt động chạy từ trái sang phải. Nếu có hai số theo sau là một chuỗi, các số sẽ được thêm vào trước khi được chuyển đổi thành một chuỗi:

cảnh báo [2 + 2 + '1']; // "41" chứ không phải "221"

Kết hợp và chuyển đổi chuỗi là một tính năng đặc biệt của nhị phân cộng với +. Các toán tử số học khác chỉ làm việc với các số và luôn chuyển đổi toán hạng của chúng thành các số. Ví dụ, phép trừ và phân chia:

cảnh báo [2 - '1']; // 1 cảnh báo ['6' / '2']; // 3

Chuyển đổi số, unary + plus + tồn tại ở hai dạng: dạng nhị phân mà chúng tôi đã sử dụng ở trên và dạng đơn. Nói cách khác, UNARY Plus hoặc, nói cách khác, toán tử cộng + áp dụng cho một giá trị duy nhất, không làm bất cứ điều gì với số. Nhưng nếu toán hạng không phải là một số, Unary Plus sẽ chuyển đổi nó thành một số. Ví dụ:

// Không ảnh hưởng đến các số Đặt x = 1; cảnh báo [ +x]; // 1 Đặt y = -2; cảnh báo [ +y]; // -2 // Chuyển đổi cảnh báo không phải số người [ +true]; // 1 cảnh báo [ +""]; // 0

Nó thực sự làm điều tương tự như số [...], nhưng ngắn hơn.

Sự cần thiết phải chuyển đổi chuỗi thành số phát sinh rất thường xuyên. Ví dụ: nếu chúng ta nhận được các giá trị từ các trường HTML, chúng thường là chuỗi. Điều gì sẽ xảy ra nếu chúng ta muốn tổng hợp chúng? Nhị phân Plus sẽ thêm chúng làm chuỗi:

Đặt táo = "2"; Đặt cam = "3"; cảnh báo [táo + cam]; // "23", chuỗi cộng với chuỗi

Nếu chúng ta muốn coi chúng là số, chúng ta cần chuyển đổi và sau đó tổng hợp chúng:

Đặt táo = "2"; Đặt cam = "3"; // cả hai giá trị được chuyển đổi thành số trước cảnh báo nhị phân cộng với [ +táo + +cam]; // 5 // biến thể dài hơn // cảnh báo [số [táo] + số [cam]]; // 5

Tên

Dấu hiệu

Quyền ưu tiên

Tên

Dấu hiệu

16

Quyền ưu tiên

16

Unary Plus

+

14

không phủ định

-

14

phép nhân

*

13

phân công

Quyền ưu tiên

13

Unary Plus

+

3

Quyền ưu tiên

Quyền ưu tiên

Unary Plus

+

không phủ định

-

phép nhân

*

phân công

/

phép cộng

phép trừ

phân công

… =…

Như chúng ta có thể thấy, người khác không có mức độ ưu tiên là 16, cao hơn 13 của bổ sung khác [nhị phân Plus]. Đó là lý do tại sao, trong biểu thức " +táo + +cam", UNARY Pluses hoạt động trước khi bổ sung.

Bài tập Hãy lưu ý rằng một bài tập = cũng là một toán tử. Nó được liệt kê trong bảng ưu tiên với mức độ ưu tiên rất thấp là 3. Đó là lý do tại sao, khi chúng ta gán một biến, như x = 2 * 2 + 1, các tính toán được thực hiện trước và sau đó = được đánh giá, lưu trữ kết quả trong x. Đặt x = 2 * 2 + 1; cảnh báo [x]; // 5

Có thể chuỗi bài tập:

Đặt A, B, C; a = b = c = 2 + 2; cảnh báo [a]; // 4 cảnh báo [b]; // 4 cảnh báo [c]; // 4

Bài tập xích đánh giá từ phải sang trái. Đầu tiên, biểu thức ngoài cùng bên phải 2 + 2 được đánh giá và sau đó được gán cho các biến ở bên trái: c, b và a. Cuối cùng, tất cả các biến chia sẻ một giá trị duy nhất.

Toán tử gán "=" trả về giá trị

Một toán tử luôn trả về một giá trị. Điều đó rõ ràng đối với hầu hết trong số họ như bổ sung + hoặc nhân *. Nhưng toán tử chuyển nhượng tuân theo quy tắc này quá. Cuộc gọi x = value ghi giá trị thành x và sau đó trả về nó. Ở đây, một bản demo sử dụng một bài tập như một phần của biểu thức phức tạp hơn:

Đặt A = 1; Đặt b = 2; Đặt c = 3 - [a = b + 1]; cảnh báo [a]; // 3 cảnh báo [c]; // 0

Trong ví dụ trên, kết quả của biểu thức [A = B + 1] là giá trị được gán cho A [đó là 3]. Sau đó nó được sử dụng để đánh giá thêm. Mã vui nhộn, có phải là nó không? Chúng ta nên hiểu cách thức hoạt động của nó, bởi vì đôi khi chúng ta thấy nó trong các thư viện JavaScript, nhưng không nên viết bất cứ thứ gì giống như vậy. Những mánh khóe như vậy chắc chắn don don làm cho mã rõ ràng hơn hoặc có thể đọc được.

Phần còn lại % nhà điều hành còn lại %, mặc dù sự xuất hiện của nó, không liên quan đến phần trăm. Kết quả của một % B là phần còn lại của sự phân chia số nguyên của a bởi b. Ví dụ:

cảnh báo [5 % 2]; // 1 là phần còn lại của 5 chia cho 2 cảnh báo [8 % 3]; // 2 là phần còn lại của 8 chia cho 3 cảnh báo [6 % 3]; // 0 là phần còn lại của 6 chia cho 3

Chứng số mũ ** Toán tử số mũ ** là một bổ sung gần đây cho ngôn ngữ. Đối với số B tự nhiên, kết quả của A ** B là nhân với chính nó b. Ví dụ:

Một toán tử luôn trả về một giá trị. Điều đó rõ ràng đối với hầu hết trong số họ như bổ sung + hoặc nhân *. Nhưng toán tử chuyển nhượng tuân theo quy tắc này quá. Cuộc gọi x = value ghi giá trị thành x và sau đó trả về nó. Ở đây, một bản demo sử dụng một bài tập như một phần của biểu thức phức tạp hơn:

Đặt A = 1; Đặt b = 2; Đặt c = 3 - [a = b + 1]; cảnh báo [a]; // 3 cảnh báo [c]; // 0

Trong ví dụ trên, kết quả của biểu thức [A = B + 1] là giá trị được gán cho A [đó là 3]. Sau đó nó được sử dụng để đánh giá thêm. Mã vui nhộn, có phải là nó không? Chúng ta nên hiểu cách thức hoạt động của nó, bởi vì đôi khi chúng ta thấy nó trong các thư viện JavaScript, nhưng không nên viết bất cứ thứ gì giống như vậy. Những mánh khóe như vậy chắc chắn don don làm cho mã rõ ràng hơn hoặc có thể đọc được.

Phần còn lại % nhà điều hành còn lại %, mặc dù sự xuất hiện của nó, không liên quan đến phần trăm. Kết quả của một % B là phần còn lại của sự phân chia số nguyên của a bởi b. Ví dụ:

cảnh báo [5 % 2]; // 1 là phần còn lại của 5 chia cho 2 cảnh báo [8 % 3]; // 2 là phần còn lại của 8 chia cho 3 cảnh báo [6 % 3]; // 0 là phần còn lại của 6 chia cho 3

Chứng số mũ ** Toán tử số mũ ** là một bổ sung gần đây cho ngôn ngữ. Đối với số B tự nhiên, kết quả của A ** B là nhân với chính nó b. Ví dụ:

cảnh báo [2 ** 2]; // 4 [2 * 2] cảnh báo [2 ** 3]; // 8 [2 * 2 * 2] cảnh báo [2 ** 4]; // 16 [2 * 2 * 2 * 2]

Nhà điều hành cũng hoạt động cho các số không số nguyên là tốt.

Ví dụ:

Nếu chúng tôi muốn tăng giá trị và sử dụng ngay kết quả của người vận hành, chúng tôi cần biểu mẫu tiền tố:

Đặt bộ đếm = 0; cảnh báo [bộ đếm ++]; // 1

Nếu chúng tôi muốn tăng giá trị nhưng sử dụng giá trị trước đó, chúng tôi cần biểu mẫu Postfix:

Đặt bộ đếm = 0; cảnh báo [bộ đếm ++]; // 0

Tăng/giảm trong số các nhà khai thác khác

Các toán tử ++/- cũng có thể được sử dụng bên trong các biểu thức. Ưu tiên của họ cao hơn hầu hết các hoạt động số học khác. Ví dụ:

Đặt Counter = 1; cảnh báo [bộ đếm 2 * ++]; // 4

So sánh với:

Đặt Counter = 1; cảnh báo [2 * bộ đếm ++]; // 2, vì bộ đếm ++ trả về giá trị "cũ"

Mặc dù về mặt kỹ thuật ổn, ký hiệu như vậy thường làm cho mã không thể đọc được. Một dòng làm nhiều điều - không tốt. Trong khi đọc mã, một lần quét mắt thẳng đứng của người Viking có thể dễ dàng bỏ lỡ một cái gì đó như Counter ++ và nó đã giành được rõ ràng rằng biến số này tăng lên. Chúng tôi tư vấn cho một phong cách của một dòng - một hành động trực tiếp:

Đặt Counter = 1; cảnh báo [2 * bộ đếm]; Bộ đếm ++;

Các nhà khai thác bitwise bitwise, các nhà khai thác coi các đối số là số nguyên 32 bit và hoạt động ở cấp độ biểu diễn nhị phân của chúng. Các nhà khai thác này không dành riêng cho JavaScript. Chúng được hỗ trợ trong hầu hết các ngôn ngữ lập trình. Danh sách các nhà khai thác: ●

VÀ [ & ]

Hoặc [|]

Xor [ ^]

Không [~]

SHIF trái [>]

Không điền đúng ca [>>>]

Những người vận hành này được sử dụng rất hiếm khi. Để hiểu họ, chúng ta cần đi sâu vào đại diện số cấp thấp và sẽ không tối ưu để làm điều đó ngay bây giờ, đặc biệt là vì chúng ta

Thắng được cần họ bất cứ lúc nào sớm. Nếu bạn tò mò, bạn có thể đọc các toán tử bitwise trên MDN. Nó sẽ là thực tế hơn để làm điều đó khi một nhu cầu thực sự phát sinh.

bài báo

Sửa đổi tại chỗ, chúng ta thường cần áp dụng toán tử vào một biến và lưu trữ kết quả mới trong cùng một biến đó. Ví dụ:

Đặt n = 2; n = n + 5; n = n * 2;

Ký hiệu này có thể được rút ngắn bằng các toán tử += và *=: Đặt n = 2; n += 5; // bây giờ n = 7 [giống như n = n + 5] n *= 2; // bây giờ n = 14 [giống như n = n * 2] cảnh báo [n]; // 14

Các toán tử sửa đổi và phân loại ngắn hạn tồn tại cho tất cả các toán tử arithmetical và bitwise: /=,-=, v.v.

Đặt n = 2; n *= 3 + 5; cảnh báo [n]; // 16

[phần bên phải được đánh giá đầu tiên, giống như n *= 8]

Dấu phẩy Người vận hành dấu phẩy, là một trong những nhà khai thác hiếm nhất và bất thường nhất. Đôi khi, nó được sử dụng để viết mã ngắn hơn, vì vậy chúng ta cần biết nó để hiểu những gì đang diễn ra. Nhà điều hành dấu phẩy cho phép chúng tôi đánh giá một số biểu thức, chia chúng với dấu phẩy,. Mỗi người trong số họ được đánh giá nhưng chỉ có kết quả của cái cuối cùng được trả lại. Ví dụ:

Đặt A = [1 + 2, 3 + 4]; cảnh báo [a]; // 7 [kết quả của 3 + 4]

Ở đây, biểu thức đầu tiên 1 + 2 được đánh giá và kết quả của nó được vứt bỏ. Sau đó, 3 + 4 được đánh giá và trả lại là kết quả.

Tăng/giảm trong số các nhà khai thác khác

Các toán tử ++/- cũng có thể được sử dụng bên trong các biểu thức. Ưu tiên của họ cao hơn hầu hết các hoạt động số học khác. Ví dụ:

Đặt Counter = 1; cảnh báo [bộ đếm 2 * ++]; // 4

So sánh với:

Đặt Counter = 1; cảnh báo [2 * bộ đếm ++]; // 2, vì bộ đếm ++ trả về giá trị "cũ"

Mặc dù về mặt kỹ thuật ổn, ký hiệu như vậy thường làm cho mã không thể đọc được. Một dòng làm nhiều điều - không tốt. Trong khi đọc mã, một lần quét mắt thẳng đứng của người Viking có thể dễ dàng bỏ lỡ một cái gì đó như Counter ++ và nó đã giành được rõ ràng rằng biến số này tăng lên. Chúng tôi tư vấn cho một phong cách của một dòng - một hành động trực tiếp:

Đặt Counter = 1; cảnh báo [2 * bộ đếm]; Bộ đếm ++;

Mặc dù về mặt kỹ thuật ổn, ký hiệu như vậy thường làm cho mã không thể đọc được. Một dòng làm nhiều điều - không tốt. Trong khi đọc mã, một lần quét mắt thẳng đứng của người Viking có thể dễ dàng bỏ lỡ một cái gì đó như Counter ++ và nó đã giành được rõ ràng rằng biến số này tăng lên. Chúng tôi tư vấn cho một phong cách của một dòng - một hành động trực tiếp:

Đặt Counter = 1; cảnh báo [2 * bộ đếm]; Bộ đếm ++;

Các nhà khai thác bitwise bitwise, các nhà khai thác coi các đối số là số nguyên 32 bit và hoạt động ở cấp độ biểu diễn nhị phân của chúng. Các nhà khai thác này không dành riêng cho JavaScript. Chúng được hỗ trợ trong hầu hết các ngôn ngữ lập trình. Danh sách các nhà khai thác: ●

VÀ [ & ]

Hoặc [|]

Xor [ ^]

Không [~]

cảnh báo ['z'> 'a']; // cảnh báo đúng ['phát sáng'> 'glee']; // cảnh báo đúng ['ong'> 'be']; // thật

Thuật toán để so sánh hai chuỗi rất đơn giản:

1. So sánh ký tự đầu tiên của cả hai chuỗi. 2. Nếu ký tự đầu tiên từ chuỗi đầu tiên lớn hơn [hoặc ít hơn] so với chuỗi khác, thì chuỗi đầu tiên lớn hơn [hoặc ít hơn] so với thứ hai. Đã được thực hiện. 3. Nếu không, nếu cả hai chuỗi ký tự đầu tiên giống nhau, hãy so sánh các ký tự thứ hai theo cùng một cách. 4. Lặp lại cho đến khi kết thúc một trong hai chuỗi. 5. Nếu cả hai chuỗi kết thúc ở cùng một độ dài, thì chúng bằng nhau. Nếu không, chuỗi dài hơn là lớn hơn. Trong các ví dụ trên, so sánh 'z'> 'a' có kết quả ở bước đầu tiên trong khi các chuỗi "phát sáng" và "glee" được so sánh từng ký tự: 1. g giống như g. 2. L giống như l. 3. O lớn hơn e. Dừng ở đây. Chuỗi đầu tiên lớn hơn.

Không phải là một từ điển thực sự, mà là thứ tự unicode

Thuật toán so sánh được đưa ra ở trên gần tương đương với thuật toán được sử dụng trong từ điển hoặc danh bạ điện thoại, nhưng nó không chính xác giống nhau. Ví dụ, các vấn đề trường hợp. Một chữ cái viết hoa "A" không bằng chữ thường "A". Cái nào lớn hơn? Chữ thường "A". Tại sao? Bởi vì ký tự thường có chỉ số lớn hơn trong bảng mã hóa nội bộ JavaScript sử dụng [unicode]. Chúng tôi sẽ quay lại với các chi tiết và hậu quả cụ thể của điều này trong chuỗi chương.

So sánh các loại khác nhau khi so sánh các giá trị của các loại khác nhau, JavaScript chuyển đổi các giá trị thành số. Ví dụ:

cảnh báo ['2'> 1]; // true, chuỗi '2' trở thành cảnh báo số 2 ['01' == 1]; // true, chuỗi '01' trở thành số 1

Đối với các giá trị boolean, true trở thành 1 và false trở thành 0. Ví dụ:

cảnh báo [true == 1]; // cảnh báo đúng [false == 0]; // thật

Không phải là một từ điển thực sự, mà là thứ tự unicode

Thuật toán so sánh được đưa ra ở trên gần tương đương với thuật toán được sử dụng trong từ điển hoặc danh bạ điện thoại, nhưng nó không chính xác giống nhau. Ví dụ, các vấn đề trường hợp. Một chữ cái viết hoa "A" không bằng chữ thường "A". Cái nào lớn hơn? Chữ thường "A". Tại sao? Bởi vì ký tự thường có chỉ số lớn hơn trong bảng mã hóa nội bộ JavaScript sử dụng [unicode]. Chúng tôi sẽ quay lại với các chi tiết và hậu quả cụ thể của điều này trong chuỗi chương.

So sánh các loại khác nhau khi so sánh các giá trị của các loại khác nhau, JavaScript chuyển đổi các giá trị thành số. Ví dụ:

cảnh báo ['2'> 1]; // true, chuỗi '2' trở thành cảnh báo số 2 ['01' == 1]; // true, chuỗi '01' trở thành số 1

Đối với các giá trị boolean, true trở thành 1 và false trở thành 0. Ví dụ:

cảnh báo [true == 1]; // cảnh báo đúng [false == 0]; // thật

Một hậu quả hài hước

Có thể là đồng thời: ●

Hai giá trị bằng nhau.

Một trong số đó là sự thật như một boolean và người còn lại là sai như một boolean.

Ví dụ:

Đặt A = 0; cảnh báo [boolean [a]]; // Sai Đặt B = "0"; cảnh báo [boolean [b]]; // cảnh báo thực [a == b]; // thật!

Từ quan điểm của JavaScript, kết quả này khá bình thường. Kiểm tra bình đẳng chuyển đổi các giá trị bằng cách sử dụng chuyển đổi số [do đó "0" trở thành 0], trong khi chuyển đổi Boolean rõ ràng sử dụng một bộ quy tắc khác.

Bình đẳng nghiêm ngặt một kiểm tra bình đẳng thông thường == có vấn đề. Nó không thể phân biệt 0 với sai: cảnh báo [0 == false]; // thật

Điều tương tự cũng xảy ra với một chuỗi trống:

cảnh báo ['' == false]; // thật

Điều này xảy ra bởi vì các toán hạng của các loại khác nhau được chuyển đổi thành số bởi toán tử bình đẳng ==. Một chuỗi trống, giống như sai, trở thành số không. Phải làm gì nếu chúng tôi muốn phân biệt 0 với sai? Một toán tử bình đẳng nghiêm ngặt === Kiểm tra sự bình đẳng mà không cần chuyển đổi loại. Nói cách khác, nếu A và B thuộc các loại khác nhau, thì A === B ngay lập tức trả lại sai mà không cố gắng chuyển đổi chúng. Hãy thử nó:

cảnh báo [0 === sai]; // sai, vì các loại khác nhau

Ngoài ra còn có một toán tử không bình đẳng nghiêm ngặt của người Viking! == Tương tự! =.

Nhà điều hành bình đẳng nghiêm ngặt là viết lâu hơn một chút, nhưng làm cho nó rõ ràng những gì xảy ra và để lại ít chỗ cho các lỗi.

Một giá trị không thể xác định được không thể xác định được không nên được so sánh với các giá trị khác:

cảnh báo [không xác định> 0]; // sai [1] cảnh báo [không xác định => "dứa" "2"> "12" không xác định == null không xác định === null null == "\ n0 \ n" null === +"\ n0 \ n"

Để giải pháp

Tương tác: Cảnh báo, nhắc nhở, xác nhận trong phần này của hướng dẫn, chúng tôi đề cập đến ngôn ngữ JavaScript như là một người khác, không có các tinh chỉnh dành riêng cho môi trường. Nhưng chúng tôi vẫn sẽ sử dụng trình duyệt làm môi trường demo của chúng tôi, vì vậy chúng tôi nên biết ít nhất một vài chức năng giao diện người dùng của nó. Trong chương này, chúng tôi sẽ làm quen với cảnh báo chức năng trình duyệt, nhắc nhở và xác nhận.

Cú pháp cảnh báo:

Thông điệp cảnh báo];

Điều này cho thấy một thông báo và tạm dừng thực thi tập lệnh cho đến khi người dùng nhấn vào OK OK. Ví dụ:

cảnh báo ["Xin chào"];

Cửa sổ mini với tin nhắn được gọi là cửa sổ phương thức. Từ ngữ Modal Modal có nghĩa là khách truy cập có thể tương tác với phần còn lại của trang, nhấn các nút khác, v.v. cho đến khi họ xử lý cửa sổ. Trong trường hợp này - cho đến khi họ nhấn vào OK OK.

Nhắc hàm nhắc Chức năng chấp nhận hai đối số: result = nhắc [Tiêu đề, [mặc định]];

Nó hiển thị một cửa sổ phương thức với tin nhắn văn bản, trường đầu vào cho khách truy cập và các nút OK/Hủy. tiêu đề văn bản để hiển thị khách truy cập. Mặc định một tham số thứ hai tùy chọn, giá trị ban đầu cho trường đầu vào. Khách truy cập có thể nhập một cái gì đó trong trường đầu vào nhắc nhở và nhấn OK. Hoặc họ có thể hủy đầu vào bằng cách nhấn Hủy hoặc nhấn phím ESC.

Cuộc gọi để nhắc trả về văn bản từ trường đầu vào hoặc null nếu đầu vào bị hủy. Ví dụ:

hãy để tuổi = nhắc nhở ['Bạn bao nhiêu tuổi?', ​​100]; cảnh báo [`Bạn là $ {tuổi} tuổi!`]; // Bạn đã 100 tuổi!

Trong IE: Luôn cung cấp mặc định

Tham số thứ hai là tùy chọn, nhưng nếu chúng tôi không cung cấp nó, Internet Explorer sẽ chèn văn bản "không xác định" vào dấu nhắc. Chạy mã này trong Internet Explorer để xem:

Đặt test = nhắc ["kiểm tra"];

Vì vậy, để có lời nhắc trông đẹp trong IE, chúng tôi khuyên bạn nên luôn cung cấp đối số thứ hai:

Đặt test = nhắc nhở ["kiểm tra", '']; // 2015] {alert ['quá muộn']; } khác {alert ['chính xác!']; }

In the code above, JavaScript first checks year < 2015 . If that is falsy, it goes to the next condition year > 2015 . If that is also falsy, it shows the last alert . There can be more else if blocks. The final else is optional.

Toán tử có điều kiện ‘Đôi khi, chúng ta cần gán một biến tùy thuộc vào điều kiện. Ví dụ:

cho phép truy cập; hãy để tuổi = nhắc nhở ['Bạn bao nhiêu tuổi?', ​​'']; if [tuổi> 18] {accessallowed = true; } other {accessallowed = false; } cảnh báo [accessallow];

Cái gọi là người điều khiển có điều kiện trực tuyến hoặc người điều khiển đánh dấu đánh dấu cho phép chúng tôi làm điều đó theo cách ngắn hơn và đơn giản hơn. Các nhà điều hành được đại diện bởi một dấu hỏi? . Đôi khi, nó được gọi là Ternary Ternary, bởi vì nhà điều hành có ba toán hạng. Nó thực sự là nhà điều hành một và duy nhất trong JavaScript có nhiều. Cú pháp là:

Đặt kết quả = điều kiện? Value1: value2;

Điều kiện được đánh giá: Nếu nó thật sự thật thì Value1 được trả về, nếu không - value2. Ví dụ:

Hãy để accessallow = [tuổi> 18]? đúng sai;

Về mặt kỹ thuật, chúng ta có thể bỏ qua các dấu ngoặc đơn vào khoảng 18 tuổi> 18. Toán tử đánh dấu câu hỏi có quyền ưu tiên thấp, do đó, nó thực hiện sau khi so sánh>. Ví dụ này sẽ làm điều tương tự như cái trước:

// Toán tử so sánh "Tuổi> 18" thực hiện đầu tiên // [không cần phải bọc nó thành dấu ngoặc đơn] hãy để accessalled = tuổi> 18? đúng sai;

Nhưng dấu ngoặc đơn làm cho mã dễ đọc hơn, vì vậy chúng tôi khuyên bạn nên sử dụng chúng.

Xin lưu ý:

Trong ví dụ trên, bạn có thể tránh sử dụng toán tử đánh dấu câu hỏi vì bản thân so sánh trả về đúng/sai: // cùng một người cho phép truy cập = tuổi> 18;

Nhiều ‘? Một chuỗi các toán tử đánh dấu câu hỏi? Có thể trả về một giá trị phụ thuộc vào nhiều điều kiện. Ví dụ:

hãy để tuổi = nhắc nhở ['tuổi?', ​​18];

hãy để tin nhắn = [tuổi setTimeout [resolve, ms]]; } trễ [3000] .then [[] => alert ['chạy sau 3 giây']];

Xin lưu ý rằng trong giải quyết nhiệm vụ này được gọi mà không có đối số. Chúng tôi không trả lại bất kỳ giá trị nào từ độ trễ, chỉ cần đảm bảo sự chậm trễ. Để xây dựng

Vòng tròn hoạt hình với Promise Mở giải pháp trong hộp cát.

Lời hứa hứa hẹn với lời hứa: Sau đó, so với việc bắt câu trả lời ngắn là: Không, chúng không bằng nhau: sự khác biệt là nếu lỗi xảy ra trong F1, thì nó được xử lý bởi .Catch ở đây: Promise. ];

… Nhưng không phải ở đây:

lời hứa .then [f1, f2];

Điều đó bởi vì một lỗi được truyền lại trong chuỗi, và trong đoạn mã thứ hai, không có chuỗi nào dưới F1. Nói cách khác,. Sau đó chuyển kết quả/lỗi cho. Sau đó/bắt. Vì vậy, trong ví dụ đầu tiên, có một cú bắt dưới đây, và trong lần thứ hai - có một số người, vì vậy lỗi không được xử lý. Để xây dựng

Xử lý lỗi với lời hứa lỗi trong setTimeout Câu trả lời là: Không, nó sẽ không: Lời hứa mới [hàm [giải quyết, từ chối] {setTimeout [[] => {ném lỗi mới ["whiros!"];}, 1000]; }]. Bắt [cảnh báo];

Như đã nói trong chương, có một "thử tiềm ẩn..catch" xung quanh mã chức năng. Vì vậy, tất cả các lỗi đồng bộ được xử lý. Nhưng ở đây lỗi được tạo ra không phải trong khi người thực thi đang chạy, mà là sau đó. Vì vậy, lời hứa có thể xử lý nó. Để xây dựng

Async/đang chờ viết lại bằng async/chờ đợi các ghi chú nằm dưới mã: hàm async loadJSON [url] {// [1] let respends = await fetch [url]; // [2] if [respons.status == 200] {hãy để json = chờ phản hồi.json []; // [3] trả lại json; }

ném lỗi mới [phản hồi.status]; } loadJson ['No-such-user.json'] .catch [alert]; // Lỗi: 404 [4]

Ghi chú: 1. Hàm LoadJson trở thành Async. 2. Tất cả. Bên trong được thay thế bằng chờ đợi. 3. Chúng ta có thể trả về phản hồi.json [] thay vì chờ đợi nó, như thế này: if [reserves.status == 200] {return return.json []; // [3]}

Để xây dựng

Sau đó, mã bên ngoài sẽ phải chờ đợi lời hứa đó để giải quyết. Trong trường hợp của chúng tôi, nó không quan trọng. 4. Lỗi được ném từ Loadjson được xử lý bởi .catch. Chúng tôi có thể sử dụng Await Loadjson [Mạnh] ở đó, bởi vì chúng tôi không ở trong một chức năng không đồng bộ. Để xây dựng

Để xây dựng

Viết lại "rethrow" với async/chờ đợi không có thủ thuật nào ở đây. Chỉ cần thay thế. this.name = 'httperror'; this.response = phản hồi; }} hàm async loadJSON [url] {let respession = isait fetch [url]; if [respons.status == 200] {return respession.json [];

} other {ném httperror mới [phản hồi]; }} // yêu cầu tên người dùng cho đến khi github trả về một người dùng hợp lệ Async hàm demogithubuser [] {hãy để người dùng; while [true] {let name = nhắc nhở ["nhập tên?", "iliakan"]; thử {user = Await LoadJson [`//api.github.com/users/$ {name}`]; phá vỡ; // Không có lỗi, LOOP thoát} Catch [err] {if [err instanceOf httperror && err.response.status == 404] {// loop tiếp tục sau cảnh báo cảnh báo ["Không người dùng như vậy, vui lòng nhập lại."]; } other {// lỗi không xác định, rethrow ném err; }}}

cảnh báo [`tên đầy đủ: $ {user.name} .`]; trả về người dùng; } demogithubuser [];

Proxy và phản ánh lỗi khi đọc thuộc tính không tồn tại

Hãy để người dùng = {name: "John"}; Function Wrap [Target] {trả về proxy mới [Target, {get [target, prop, người nhận] {if [prop in target] {return respl không tồn tại: "$ {prop}" `]}}}]; } user = wrap [người dùng]; cảnh báo [user.name]; // John Alert [người dùng.age]; // Lỗi: thuộc tính không tồn tại

Để xây dựng

Truy cập mảng [-1] Let mảng = [1, 2, 3]; Array = new proxy [mảng, {get [target, prop, người nhận] {if [prop elem.style.zindex biên giới-left-width => elem.style.borderleftwidth

Ví dụ:

document.body.style.backgroundColor = prompt ['màu nền?', 'màu xanh lá cây'];

Thuộc tính tiền tố

Các thuộc tính có trình duyệt như -moz-Border-Radius, -webkitbandder-Radius cũng tuân theo quy tắc tương tự, ví dụ: bettyle.style.mozbeterradius = '5px'; nút.style.webkitborderradius = '5px';

Đó là: một dấu gạch ngang "-" trở thành một chữ hoa.

Đặt lại thuộc tính kiểu đôi khi chúng tôi muốn gán một thuộc tính kiểu, và sau đó xóa nó. Chẳng hạn, để ẩn một phần tử, chúng ta có thể đặt elem.style.display = "none".

Sau đó, chúng ta có thể muốn loại bỏ style.display như thể nó không được đặt. Thay vì xóa elem.style.display, chúng ta nên gán một chuỗi trống cho nó: elem.style.display = "". // Nếu chúng tôi chạy mã này, tài liệu "nhấp nháy ".body.style.display =" none "; // Ẩn setTimeout [[] => document.body.style.display = "", 1000]; // trở lại bình thường

Nếu chúng tôi đặt hiển thị thành một chuỗi trống, thì trình duyệt áp dụng các lớp CSS và các kiểu tích hợp của nó một cách thông thường, như thể không có thuộc tính hiển thị như vậy.

Thuộc tính tiền tố

Các thuộc tính có trình duyệt như -moz-Border-Radius, -webkitbandder-Radius cũng tuân theo quy tắc tương tự, ví dụ: bettyle.style.mozbeterradius = '5px'; nút.style.webkitborderradius = '5px';

Đó là: một dấu gạch ngang "-" trở thành một chữ hoa.

Đặt lại thuộc tính kiểu đôi khi chúng tôi muốn gán một thuộc tính kiểu, và sau đó xóa nó. Chẳng hạn, để ẩn một phần tử, chúng ta có thể đặt elem.style.display = "none".

Sau đó, chúng ta có thể muốn loại bỏ style.display như thể nó không được đặt. Thay vì xóa elem.style.display, chúng ta nên gán một chuỗi trống cho nó: elem.style.display = "". // Nếu chúng tôi chạy mã này, tài liệu "nhấp nháy ".body.style.display =" none "; // Ẩn setTimeout [[] => document.body.style.display = "", 1000]; // trở lại bình thường

Nếu chúng tôi đặt hiển thị thành một chuỗi trống, thì trình duyệt áp dụng các lớp CSS và các kiểu tích hợp của nó một cách thông thường, như thể không có thuộc tính hiển thị như vậy.

Viết lại đầy đủ với style.csstext

Thông thường, chúng tôi sử dụng phong cách.* Để gán các thuộc tính kiểu riêng lẻ. Chúng ta có thể thiết lập phong cách đầy đủ như div.style = "color: red; width: 100px", vì div.style là một đối tượng và nó chỉ đọc. Để đặt phong cách đầy đủ thành một chuỗi, có một kiểu thuộc tính đặc biệt.csstext: nút

Thuộc tính này hiếm khi được sử dụng, bởi vì bài tập như vậy sẽ loại bỏ tất cả các kiểu hiện có: nó không thêm, nhưng thay thế chúng. Đôi khi có thể xóa một cái gì đó cần thiết. Nhưng chúng ta có thể sử dụng nó một cách an toàn cho các yếu tố mới, khi chúng ta biết rằng chúng ta đã thắng xóa một phong cách hiện có. Điều tương tự có thể được thực hiện bằng cách đặt một thuộc tính: Div.SetAttribution ['Style', 'Color: Red ...'].

Tâm trí các đơn vị

Các đơn vị CSS phải được cung cấp trong các giá trị kiểu. Chẳng hạn, chúng ta không nên đặt elem.style.top thành 10, mà là 10px. Nếu không thì nó sẽ hoạt động:

Được tính toán và giải quyết các giá trị

Có hai khái niệm trong CSS

:

1. Giá trị kiểu được tính toán là giá trị sau khi tất cả các quy tắc CSS và kế thừa CSS được áp dụng, do kết quả của tầng CSS. Nó có thể trông giống như chiều cao: 1em hoặc kích thước phông chữ: 125%. 2. Một giá trị kiểu được giải quyết là cuối cùng được áp dụng cho phần tử. Các giá trị như 1em hoặc 125% là tương đối. Trình duyệt lấy giá trị được tính toán và làm cho tất cả các đơn vị cố định và tuyệt đối, ví dụ: chiều cao: 20px hoặc phông chữ: 16px. Đối với các thuộc tính hình học, các giá trị được giải quyết có thể có một điểm nổi, như chiều rộng: 50,5px. Một thời gian dài trước đây GetComputedStyle đã được tạo ra để nhận các giá trị được tính toán, nhưng hóa ra các giá trị được giải quyết thuận tiện hơn nhiều và tiêu chuẩn đã thay đổi. Vì vậy, ngày nay getComputedStyle thực sự trả về giá trị được giải quyết của tài sản.

GetComputedStyle yêu cầu tên toàn bộ

Chúng ta phải luôn luôn yêu cầu tài sản chính xác mà chúng ta muốn, như paddingleft hoặc margintop hoặc biên giới. Nếu không thì kết quả chính xác không được đảm bảo. Chẳng hạn, nếu có các thuộc tính paddingleft/paddingtop, thì chúng ta nên nhận gì cho getComputedStyle [ELEM] .padding? Không có gì, hoặc có thể là một giá trị được tạo ra trên mạng từ các mái chèo đã biết? Không có quy tắc tiêu chuẩn ở đây. Có những mâu thuẫn khác. Ví dụ, một số trình duyệt [Chrome] hiển thị 10px trong tài liệu bên dưới và một số trong số chúng [Firefox] - không:

Các phong cách liên kết đã truy cập vào các liên kết được ẩn!

Các liên kết được truy cập có thể được tô màu bằng cách sử dụng: Visit CSS Pseudoclass. Nhưng GetComputedStyle không cung cấp quyền truy cập vào màu đó, bởi vì nếu không, một trang tùy ý có thể tìm hiểu xem người dùng có truy cập liên kết hay không bằng cách tạo nó trên trang và kiểm tra các kiểu. JavaScript có thể không thấy các kiểu được áp dụng bởi: đã truy cập. Ngoài ra, có một giới hạn trong CSS cấm áp dụng các kiểu thay đổi hình học trong: đã truy cập. Điều đó để đảm bảo rằng không có trang nào cho một trang xấu xa để kiểm tra xem một liên kết đã được truy cập và do đó phá vỡ sự riêng tư.

Tóm tắt Để quản lý các lớp, có hai thuộc tính DOM: ●

ClassName - Giá trị chuỗi, tốt để quản lý toàn bộ tập hợp các lớp. Danh sách lớp - đối tượng có các phương thức Thêm/Xóa/Chuyển đổi/Chứa, Tốt cho các lớp riêng lẻ.

Để thay đổi các kiểu: ●

ClassName - Giá trị chuỗi, tốt để quản lý toàn bộ tập hợp các lớp. Danh sách lớp - đối tượng có các phương thức Thêm/Xóa/Chuyển đổi/Chứa, Tốt cho các lớp riêng lẻ.

Để thay đổi các kiểu: ●

Thuộc tính phong cách là một đối tượng với các kiểu Camelcased. Đọc và viết cho nó có ý nghĩa tương tự như sửa đổi các thuộc tính riêng lẻ trong thuộc tính "kiểu". Để xem cách áp dụng những thứ quan trọng và các thứ hiếm khác - có một danh sách các phương thức tại MDN. Thuộc tính style.csStext tương ứng với toàn bộ thuộc tính "kiểu", chuỗi đầy đủ của các kiểu.

Để đọc các kiểu đã được giải quyết [liên quan đến tất cả các lớp, sau khi tất cả các CS được áp dụng và các giá trị cuối cùng được tính toán]: ●

GetComputedStyle [elem [, giả]] trả về đối tượng giống như kiểu dáng với chúng. Chỉ đọc.

Nhiệm vụ tạo ra một tầm quan trọng thông báo: 5 Viết chức năng hiển thị [Tùy chọn] tạo ra một thông báo: với nội dung đã cho. Thông báo

:

:

1. Giá trị kiểu được tính toán là giá trị sau khi tất cả các quy tắc CSS và kế thừa CSS được áp dụng, do kết quả của tầng CSS. Nó có thể trông giống như chiều cao: 1em hoặc kích thước phông chữ: 125%. 2. Một giá trị kiểu được giải quyết là cuối cùng được áp dụng cho phần tử. Các giá trị như 1em hoặc 125% là tương đối. Trình duyệt lấy giá trị được tính toán và làm cho tất cả các đơn vị cố định và tuyệt đối, ví dụ: chiều cao: 20px hoặc phông chữ: 16px. Đối với các thuộc tính hình học, các giá trị được giải quyết có thể có một điểm nổi, như chiều rộng: 50,5px. Một thời gian dài trước đây GetComputedStyle đã được tạo ra để nhận các giá trị được tính toán, nhưng hóa ra các giá trị được giải quyết thuận tiện hơn nhiều và tiêu chuẩn đã thay đổi. Vì vậy, ngày nay getComputedStyle thực sự trả về giá trị được giải quyết của tài sản.

GetComputedStyle yêu cầu tên toàn bộ

Chúng ta phải luôn luôn yêu cầu tài sản chính xác mà chúng ta muốn, như paddingleft hoặc margintop hoặc biên giới. Nếu không thì kết quả chính xác không được đảm bảo. Chẳng hạn, nếu có các thuộc tính paddingleft/paddingtop, thì chúng ta nên nhận gì cho getComputedStyle [ELEM] .padding? Không có gì, hoặc có thể là một giá trị được tạo ra trên mạng từ các mái chèo đã biết? Không có quy tắc tiêu chuẩn ở đây. Có những mâu thuẫn khác. Ví dụ, một số trình duyệt [Chrome] hiển thị 10px trong tài liệu bên dưới và một số trong số chúng [Firefox] - không:

Các phong cách liên kết đã truy cập vào các liên kết được ẩn!

:

1. Giá trị kiểu được tính toán là giá trị sau khi tất cả các quy tắc CSS và kế thừa CSS được áp dụng, do kết quả của tầng CSS. Nó có thể trông giống như chiều cao: 1em hoặc kích thước phông chữ: 125%. 2. Một giá trị kiểu được giải quyết là cuối cùng được áp dụng cho phần tử. Các giá trị như 1em hoặc 125% là tương đối. Trình duyệt lấy giá trị được tính toán và làm cho tất cả các đơn vị cố định và tuyệt đối, ví dụ: chiều cao: 20px hoặc phông chữ: 16px. Đối với các thuộc tính hình học, các giá trị được giải quyết có thể có một điểm nổi, như chiều rộng: 50,5px. Một thời gian dài trước đây GetComputedStyle đã được tạo ra để nhận các giá trị được tính toán, nhưng hóa ra các giá trị được giải quyết thuận tiện hơn nhiều và tiêu chuẩn đã thay đổi. Vì vậy, ngày nay getComputedStyle thực sự trả về giá trị được giải quyết của tài sản.

Khu vực đáy đệm có thể chứa đầy văn bản

Thông thường các mái chèo được hiển thị trống trên các hình minh họa, nhưng nếu có rất nhiều văn bản trong phần tử và nó tràn, thì các trình duyệt hiển thị văn bản tràn ra trên các phần dưới đáy. Đó là một lưu ý để tránh sự nhầm lẫn, vì đáy đệm được đặt trong các ví dụ khác, trừ khi có quy định rõ ràng khác.

Hình học ở đây, hình ảnh tổng thể:

Các giá trị của các thuộc tính này là các số kỹ thuật, nhưng những con số này là của các pixel, vì vậy đây là các phép đo pixel. Chúng là nhiều tính chất, rất khó để phù hợp với tất cả chúng trong một bức tranh duy nhất, nhưng giá trị của chúng rất đơn giản và dễ hiểu.

Hãy bắt đầu khám phá chúng từ bên ngoài yếu tố.

offsetparent, offsetleft/top Các thuộc tính này hiếm khi cần thiết, nhưng chúng vẫn là các thuộc tính hình học bên ngoài nhất, vì vậy chúng tôi sẽ bắt đầu với chúng. Tùy bù là tổ tiên gần nhất, trình duyệt sử dụng để tính toán tọa độ trong quá trình kết xuất. Đó là tổ tiên gần nhất, thỏa mãn các điều kiện sau: 1. vị trí của CSS [vị trí là tuyệt đối, tương đối, cố định hoặc dính], 2. hoặc

,,, 3. Hoặc. Các thuộc tính offsetleft/offsetTop cung cấp tọa độ x/y so với góc trên bên trái của nó. Trong ví dụ bên dưới bên trong có sự thay đổi và offsetleft/offsettop chuyển từ góc trên bên trái của nó [180]:

... message.remove [], 5000];

Mã này có thể được sửa đổi để hiển thị thông báo ở bên trái, bên phải, bên dưới, áp dụng hình ảnh CSS để Fade Fade It trong phạm vi, v.v. Điều đó dễ dàng, vì chúng ta có tất cả các tọa độ và kích thước của yếu tố. Nhưng lưu ý các chi tiết quan trọng: khi trang được cuộn, thông báo sẽ chảy ra khỏi nút. Lý do là hiển nhiên: phần tử tin nhắn dựa vào vị trí: đã sửa, vì vậy nó vẫn ở cùng một vị trí của cửa sổ trong khi trang cuộn đi. Để thay đổi điều đó, chúng ta cần sử dụng tọa độ và vị trí dựa trên tài liệu: Tuyệt đối.

Tọa độ tài liệu tọa độ liên quan đến tài liệu bắt đầu từ góc trên bên trái của tài liệu, không phải cửa sổ. Trong CSS, tọa độ cửa sổ tương ứng với vị trí: Đã sửa lỗi, trong khi tọa độ tài liệu tương tự như vị trí: tuyệt đối trên đỉnh. Chúng ta có thể sử dụng vị trí: Tuyệt đối và TOP/Bên trái để đặt một cái gì đó ở một vị trí nhất định của tài liệu, để nó ở đó trong một cuộn trang. Nhưng chúng ta cần tọa độ phù hợp đầu tiên. Để rõ ràng, chúng tôi sẽ gọi tọa độ cửa sổ [clientX, clienty] và tọa độ tài liệu [trang, pagey]. Khi trang không được cuộn, thì tọa độ cửa sổ và tọa độ tài liệu thực sự giống nhau. Điểm không phù hợp của họ quá:

Và nếu chúng ta cuộn nó, thì [clientx, clienty] thay đổi, vì chúng tương đối với cửa sổ, nhưng [pagex, pagey] vẫn giữ nguyên. Ở đây, cùng một trang sau cuộn dọc:

Khách hàng của tiêu đề "từ bài viết nổi bật của ngày hôm nay" đã trở thành 0, bởi vì phần tử hiện đang ở trên đầu cửa sổ. ClientX đã không thay đổi, vì chúng tôi đã cuộn theo chiều ngang. PageX và tọa độ pagey của phần tử vẫn giống nhau, bởi vì chúng liên quan đến tài liệu.

Nhận tọa độ tài liệu ở đó, không có phương pháp tiêu chuẩn nào để có được tọa độ tài liệu của một yếu tố. Nhưng nó dễ dàng viết nó. Hai hệ tọa độ được kết nối bằng công thức: ●

Khách hàng của tiêu đề "từ bài viết nổi bật của ngày hôm nay" đã trở thành 0, bởi vì phần tử hiện đang ở trên đầu cửa sổ. ClientX đã không thay đổi, vì chúng tôi đã cuộn theo chiều ngang. PageX và tọa độ pagey của phần tử vẫn giống nhau, bởi vì chúng liên quan đến tài liệu.

Nhận tọa độ tài liệu ở đó, không có phương pháp tiêu chuẩn nào để có được tọa độ tài liệu của một yếu tố. Nhưng nó dễ dàng viết nó. Hai hệ tọa độ được kết nối bằng công thức: ●

pagey = clienty + chiều cao của phần thẳng đứng cuộn ra của tài liệu. pagex = clientX + chiều rộng của phần ngang cuộn ra của tài liệu.

Hàm getCoords [ELEM] sẽ lấy tọa độ cửa sổ từ elem.getBoundingClientRect [] và thêm cuộn hiện tại vào chúng: // Nhận tọa độ tài liệu của hàm phần tử GetCoords [elem] {

Đặt hộp = elem.getBoundingClientRect []; return {top: box.top + pageyoffset, trái: box.left + pageXoffset}; }

1

Tóm tắt Bất kỳ điểm nào trên trang đều có tọa độ: 1. Liên quan đến cửa sổ - elem.getBoundingClientRect []. 2. Liên quan đến tài liệu - elem.getBoundingClientRect [] cộng với cuộn trang hiện tại. Các tọa độ cửa sổ là tuyệt vời để sử dụng với vị trí: cố định và tọa độ tài liệu làm tốt với vị trí: Tuyệt đối. Cả hai hệ thống tọa độ đều có các hệ thống của họ, và các hệ thống của họ, có những lúc chúng ta cần một hoặc một hệ thống khác, giống như vị trí CSS tuyệt đối và cố định.

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

4

. . . . . . . . . . . .

2

Mã của bạn nên sử dụng DOM để có được tọa độ cửa sổ của: 1. trên bên trái, góc ngoài [đơn giản]. 2. Bottom-right, góc ngoài [quá đơn giản]. 3. Phía trên bên trái, góc bên trong [khó hơn một chút]. 4. BOTTOM-bên phải, góc bên trong [có một số cách, chọn một]. Các tọa độ mà bạn tính toán phải giống như các tọa độ được trả về bởi nhấp chuột. P.S. Mã cũng sẽ hoạt động nếu phần tử có kích thước hoặc đường viền khác, không bị ràng buộc với bất kỳ giá trị cố định nào. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Hiển thị một ghi chú gần tầm quan trọng của phần tử: 5 Tạo một vị trí chức năng [neo, vị trí, ELEM] định vị ELEM, tùy thuộc vào vị trí ở đầu ["trên cùng"], phải ["phải"] hoặc dưới cùng ["dưới cùng"] của phần tử neo. Gọi nó bên trong hàm hiển thị [neo, vị trí, html] hiển thị một phần tử với lớp "ghi chú" và văn bản HTML tại vị trí đã cho gần

cái mỏ neo. Hiển thị các ghi chú như ở đây: Lorem Ipsum Dolor SIT AMET, lãnh đạo adipising elit. Retrehenderit sint atque doorum fuga ad incidunt voluptatum lỗi fugiat animi ampe! Odio temporibus nulla id unde quaerat dignissimos enim nisi rem provident molestias sit tempore omnis recusandae esse sequi officia sapiente. Lưu ý ở trên

Phạm tội này

Lưu ý ở bên phải

Giáo viên: Tại sao bạn đến muộn? Sinh viên: Có một người đàn ông mất một hóa đơn trăm đô la. Giáo viên: Thật tuyệt. Bạn có giúp anh ấy tìm nó không? Học sinh: Không. Tôi đã đứng trên đó.

Lưu ý dưới đây

Lorem Ipsum Dolor SIT AMET, Lãnh sự adipising elit. Retrehenderit sint atque doorum fuga ad incidunt voluptatum lỗi fugiat animi ampe! Odio temporibus nulla id unde quaerat dignissimos enim nisi rem provident molestias sit tempore omnis recusandae esse sequi officia sapiente.

P.S. Ghi chú nên có vị trí: Đã sửa cho nhiệm vụ này. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Hiển thị một ghi chú gần tầm quan trọng của phần tử: 5 Tạo một vị trí chức năng [neo, vị trí, ELEM] định vị ELEM, tùy thuộc vào vị trí ở đầu ["trên cùng"], phải ["phải"] hoặc dưới cùng ["dưới cùng"] của phần tử neo. Gọi nó bên trong hàm hiển thị [neo, vị trí, html] hiển thị một phần tử với lớp "ghi chú" và văn bản HTML tại vị trí đã cho gần

cái mỏ neo. Hiển thị các ghi chú như ở đây: Lorem Ipsum Dolor SIT AMET, lãnh đạo adipising elit. Retrehenderit sint atque doorum fuga ad incidunt voluptatum lỗi fugiat animi ampe! Odio temporibus nulla id unde quaerat dignissimos enim nisi rem provident molestias sit tempore omnis recusandae esse sequi officia sapiente. Lưu ý ở trên

Phạm tội này

Lưu ý ở bên phải

Giáo viên: Tại sao bạn đến muộn? Sinh viên: Có một người đàn ông mất một hóa đơn trăm đô la. Giáo viên: Thật tuyệt. Bạn có giúp anh ấy tìm nó không? Học sinh: Không. Tôi đã đứng trên đó.

Lưu ý dưới đây

Lorem Ipsum Dolor SIT AMET, Lãnh sự adipising elit. Retrehenderit sint atque doorum fuga ad incidunt voluptatum lỗi fugiat animi ampe! Odio temporibus nulla id unde quaerat dignissimos enim nisi rem provident molestias sit tempore omnis recusandae esse sequi officia sapiente.

Phạm tội này

Lưu ý ở bên phải

Giáo viên: Tại sao bạn đến muộn? Sinh viên: Có một người đàn ông mất một hóa đơn trăm đô la. Giáo viên: Thật tuyệt. Bạn có giúp anh ấy tìm nó không? Học sinh: Không. Tôi đã đứng trên đó.

Giáo viên: Tại sao bạn đến muộn? Sinh viên: Có một người đàn ông mất một hóa đơn trăm đô la. Giáo viên: Thật tuyệt. Bạn có giúp anh ấy tìm nó không? Học sinh: Không. Tôi đã đứng trên đó.

Lưu ý dưới đây

Lorem Ipsum Dolor SIT AMET, Lãnh sự adipising elit. Retrehenderit sint atque doorum fuga ad incidunt voluptatum lỗi fugiat animi ampe! Odio temporibus nulla id unde quaerat dignissimos enim nisi rem provident molestias sit tempore omnis recusandae esse sequi officia sapiente.

P.S. Ghi chú nên có vị trí: Đã sửa cho nhiệm vụ này. Mở một hộp cát cho nhiệm vụ.

Hiển thị một ghi chú gần phần tử [tuyệt đối] tầm quan trọng: 5 Sửa đổi giải pháp của tác vụ trước đó để ghi chú sử dụng vị trí: tuyệt đối thay vì vị trí: cố định. Điều đó sẽ ngăn chặn sự chạy trốn của nó từ phần tử khi trang cuộn. Lấy giải pháp của nhiệm vụ đó như một điểm khởi đầu. Để kiểm tra cuộn, thêm phong cách. Để giải pháp

Định vị ghi chú bên trong [tuyệt đối] tầm quan trọng: 5

Mở rộng tác vụ trước đây hiển thị một ghi chú gần phần tử [tuyệt đối]: Dạy vị trí chức năng [neo, vị trí, elem] để chèn elem bên trong mỏ neo. Giá trị mới cho vị trí: ●

Lưu ý ở bên phải

Lưu ý ở bên phải

Lưu ý ở bên phải

Lưu ý ở bên phải

Giáo viên: Tại sao bạn đến muộn? Sinh viên: Có một người đàn ông mất một hóa đơn trăm đô la. Giáo viên: Thật tuyệt. Bạn có giúp anh ấy tìm nó không? Học sinh: Không. Tôi đã đứng trên đó.

Biểu mẫu các sự kiện phần tử: ●

Gửi - Khi khách truy cập gửi a.

Tập trung - Khi khách truy cập tập trung vào một yếu tố, ví dụ: trên một.

Sự kiện bàn phím: ●

Keydown và KeyUp - Khi khách truy cập nhấn và sau đó nhả nút.

Sự kiện tài liệu: ●

DomContentLoaded - Khi HTML được tải và xử lý, DOM được xây dựng đầy đủ.

Sự kiện CSS: ●

Chuyển tiếp-Khi một hoạt động CSS kết thúc.

Có nhiều sự kiện khác. Chúng tôi sẽ nhận được nhiều chi tiết hơn về các sự kiện cụ thể trong các chương tiếp theo.

Người xử lý sự kiện

Để phản ứng trên các sự kiện, chúng ta có thể chỉ định một người xử lý - một chức năng chạy trong trường hợp của một sự kiện. Người xử lý là một cách để chạy mã JavaScript trong trường hợp hành động của người dùng. Có một số cách để gán một người xử lý. Hãy cùng nhìn thấy họ, bắt đầu từ cái đơn giản nhất.

HTML-attribution Một trình xử lý có thể được đặt trong HTML với một thuộc tính có tên trên. Chẳng hạn, để gán một trình xử lý nhấp chuột cho đầu vào, chúng ta có thể sử dụng title, như ở đây:

Khi nhấp chuột, mã bên trong Onclick chạy. Xin lưu ý rằng bên trong Onclick, chúng tôi sử dụng các trích dẫn đơn, bởi vì bản thân thuộc tính có trong trích dẫn kép. Nếu chúng ta quên rằng mã nằm trong thuộc tính và sử dụng các trích dẫn kép bên trong, như thế này: title = "alert [" click! "]", Thì nó đã giành được công việc đúng. Một sự tham gia của HTML không phải là một nơi thuận tiện để viết nhiều mã, vì vậy chúng tôi nên tạo một chức năng JavaScript và gọi nó ở đó. Ở đây một nhấp chuột chạy chức năng Countrabbits []:

Đếm thỏ!

Như chúng ta đã biết, tên thuộc tính HTML không nhạy cảm với trường hợp, do đó, Onclick hoạt động cũng như title và title, nhưng thường các thuộc tính được hạ thấp: title.

Thuộc tính dom

Chúng ta có thể chỉ định một trình xử lý bằng một thuộc tính DOM trên. Ví dụ, elem. title:

Nhấp vào đây

Nếu trình xử lý được gán bằng cách sử dụng phương tiện HTML thì trình duyệt sẽ đọc nó, hãy tạo một hàm mới từ nội dung thuộc tính và ghi nó vào thuộc tính DOM. Vì vậy, cách này thực sự giống như cái trước. Trình xử lý luôn nằm trong thuộc tính DOM: thuộc tính HTML chỉ là một trong những cách để khởi tạo nó. Hai đoạn mã này hoạt động giống nhau: 1. Chỉ HTML:

Cái nút

2. HTML + JS:

Cái nút

2. HTML + JS:

Vì chỉ có một tài sản Onclick, chúng tôi có thể gán nhiều hơn một người xử lý sự kiện.

Nhấp vào đây

Nếu trình xử lý được gán bằng cách sử dụng phương tiện HTML thì trình duyệt sẽ đọc nó, hãy tạo một hàm mới từ nội dung thuộc tính và ghi nó vào thuộc tính DOM. Vì vậy, cách này thực sự giống như cái trước. Trình xử lý luôn nằm trong thuộc tính DOM: thuộc tính HTML chỉ là một trong những cách để khởi tạo nó. Hai đoạn mã này hoạt động giống nhau: 1. Chỉ HTML:

Cái nút

2. HTML + JS:

Vì chỉ có một tài sản Onclick, chúng tôi có thể gán nhiều hơn một người xử lý sự kiện.

Trong ví dụ dưới đây, việc thêm một trình xử lý với JavaScript ghi đè lên trình xử lý hiện có:

Nhân tiện, chúng ta có thể gán một chức năng hiện có như một người xử lý trực tiếp:

hàm saythanks [] {alert ['cảm ơn!']; } elem. title = saythanks;

Để loại bỏ một người xử lý - gán elem. title = null.

Truy cập phần tử: Đây là giá trị của bên trong một trình xử lý là phần tử. Một trong đó có người xử lý trên đó. Trong nút bên dưới hiển thị nội dung của nó bằng cách sử dụng này.

Những sai lầm có thể xảy ra nếu bạn bắt đầu làm việc với sự kiện - xin lưu ý một số sự tinh tế. Hàm nên được gán là Saythanks, không phải Saythanks []. // nút bên phải. title = saythanks;

// Nút sai. title = Saythanks [];

Nếu chúng ta thêm dấu ngoặc đơn, Saythanks [] - là một cuộc gọi chức năng. Vì vậy, dòng cuối cùng thực sự có kết quả của việc thực thi chức năng, điều đó không được xác định [vì hàm không trả về không có gì] và gán nó cho title. Điều đó không làm việc. Nhưng trong đánh dấu, chúng tôi cần các dấu ngoặc đơn:

Sự khác biệt là dễ dàng để giải thích. Khi trình duyệt đọc thuộc tính, nó tạo ra một hàm xử lý với cơ thể từ nội dung của nó. Vì vậy, ví dụ cuối cùng giống như:

nút. title = function [] {Saythanks []; // Nội dung thuộc tính};

Sử dụng các chức năng, không phải chuỗi. Bài tập elem. title = "alert [1]" cũng sẽ hoạt động. Nó hoạt động vì lý do tương thích, nhưng không được khuyến khích. Don Tiết sử dụng SetAttribution cho người xử lý. Một cuộc gọi như vậy đã giành được công việc:

// Nhấp vào sẽ tạo lỗi, // Vì các thuộc tính luôn là chuỗi, hàm trở thành một chuỗi tài liệu.body.setAttribution [' title', function [] {alert [1]}];

Element.AddeventListener [Sự kiện, Trình xử lý [, Tùy chọn]];

Tên sự kiện, ví dụ: "nhấp chuột" . Handler chức năng xử lý. Tùy chọn một đối tượng tùy chọn bổ sung với các thuộc tính: ●

Một lần: Nếu đúng, thì người nghe sẽ tự động bị xóa sau khi nó kích hoạt. Chụp: Phase nơi xử lý sự kiện, sẽ được đề cập sau đó trong chương sủi bọt và bắt giữ. Vì lý do lịch sử, các tùy chọn cũng có thể là sai/đúng, điều đó giống như {Capture: false/true}. Bị động: Nếu đúng, thì trình xử lý sẽ không ngăn cảnDefault [], chúng tôi sẽ đề cập đến điều đó sau trong các hành động mặc định của trình duyệt.

Để xóa trình xử lý, hãy sử dụng removeEventListener: Element.RemoveEventListener [sự kiện, trình xử lý [, tùy chọn]];

Loại bỏ yêu cầu cùng một chức năng

Để loại bỏ một trình xử lý, chúng ta nên vượt qua chính xác chức năng như được gán. Điều đó không hoạt động:

elem.addeventListener ["click", [] => alert ['cảm ơn!']]; // .... elem.RemoveEventListener ["Nhấp", [] => alert ['cảm ơn!']];

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Chức năng xử lý [] {alert ['cảm ơn!']; } input.AddEnentListener ["Nhấp", Handler]; // .... input.RemoveEventListener ["Nhấp", Handler];

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Như chúng ta có thể thấy trong ví dụ trên, chúng ta có thể đặt trình xử lý cả bằng cách sử dụng DomProperty và AddEventListener. Nhưng nói chung chúng tôi chỉ sử dụng một trong những cách này.

Loại bỏ yêu cầu cùng một chức năng

Để loại bỏ một trình xử lý, chúng ta nên vượt qua chính xác chức năng như được gán. Điều đó không hoạt động:

elem.addeventListener ["click", [] => alert ['cảm ơn!']]; // .... elem.RemoveEventListener ["Nhấp", [] => alert ['cảm ơn!']];

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Chức năng xử lý [] {alert ['cảm ơn!']; } input.AddEnentListener ["Nhấp", Handler]; // .... input.RemoveEventListener ["Nhấp", Handler];

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Một lần: Nếu đúng, thì người nghe sẽ tự động bị xóa sau khi nó kích hoạt. Chụp: Phase nơi xử lý sự kiện, sẽ được đề cập sau đó trong chương sủi bọt và bắt giữ. Vì lý do lịch sử, các tùy chọn cũng có thể là sai/đúng, điều đó giống như {Capture: false/true}. Bị động: Nếu đúng, thì trình xử lý sẽ không ngăn cảnDefault [], chúng tôi sẽ đề cập đến điều đó sau trong các hành động mặc định của trình duyệt.

Để xóa trình xử lý, hãy sử dụng removeEventListener: Element.RemoveEventListener [sự kiện, trình xử lý [, tùy chọn]];

Loại bỏ yêu cầu cùng một chức năng

Để loại bỏ một trình xử lý, chúng ta nên vượt qua chính xác chức năng như được gán. Điều đó không hoạt động:

elem.addeventListener ["click", [] => alert ['cảm ơn!']]; // .... elem.RemoveEventListener ["Nhấp", [] => alert ['cảm ơn!']];

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Chức năng xử lý [] {alert ['cảm ơn!']; } input.AddEnentListener ["Nhấp", Handler]; // .... input.RemoveEventListener ["Nhấp", Handler];

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Như chúng ta có thể thấy trong ví dụ trên, chúng ta có thể đặt trình xử lý cả bằng cách sử dụng DomProperty và AddEventListener. Nhưng nói chung chúng tôi chỉ sử dụng một trong những cách này.

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Chức năng xử lý [] {alert ['cảm ơn!']; } input.AddEnentListener ["Nhấp", Handler]; // .... input.RemoveEventListener ["Nhấp", Handler];

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Như chúng ta có thể thấy trong ví dụ trên, chúng ta có thể đặt trình xử lý cả bằng cách sử dụng DomProperty và AddEventListener. Nhưng nói chung chúng tôi chỉ sử dụng một trong những cách này.

Đối với một số sự kiện, người xử lý chỉ làm việc với AddEventListener

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Như chúng ta có thể thấy trong ví dụ trên, chúng ta có thể đặt trình xử lý cả bằng cách sử dụng DomProperty và AddEventListener. Nhưng nói chung chúng tôi chỉ sử dụng một trong những cách này.

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Như chúng ta có thể thấy trong ví dụ trên, chúng ta có thể đặt trình xử lý cả bằng cách sử dụng DomProperty và AddEventListener. Nhưng nói chung chúng tôi chỉ sử dụng một trong những cách này.

Đối với một số sự kiện, người xử lý chỉ làm việc với AddEventListener

elem.addeventListener ["click", [] => alert ['cảm ơn!']]; // .... elem.RemoveEventListener ["Nhấp", [] => alert ['cảm ơn!']];

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Chức năng xử lý [] {alert ['cảm ơn!']; } input.AddEnentListener ["Nhấp", Handler]; // .... input.RemoveEventListener ["Nhấp", Handler];

Xin lưu ý - nếu chúng tôi không lưu trữ chức năng trong một biến, thì chúng tôi có thể loại bỏ nó. Không có cách nào để đọc lại những người xử lý của người khác được chỉ định bởi AddEventListener. Nhiều cuộc gọi đến AddEventListener cho phép thêm nhiều trình xử lý, như thế này:

Như chúng ta có thể thấy trong ví dụ trên, chúng ta có thể đặt trình xử lý cả bằng cách sử dụng DomProperty và AddEventListener. Nhưng nói chung chúng tôi chỉ sử dụng một trong những cách này.

Đối với một số sự kiện, người xử lý chỉ làm việc với AddEventListener

elem.addeventListener ["click", [] => alert ['cảm ơn!']]; // .... elem.RemoveEventListener ["Nhấp", [] => alert ['cảm ơn!']];

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Trình xử lý đã giành chiến thắng được loại bỏ, bởi vì RemoveEventListener có một chức năng khác - với cùng một mã, nhưng điều đó không quan trọng. Đây là cách đúng đắn:

Chức năng xử lý [] {alert ['cảm ơn!']; } input.AddEnentListener ["Nhấp", Handler]; // .... input.RemoveEventListener ["Nhấp", Handler];

Mã cũng nên hoạt động với các kích thước bóng và trường khác nhau, không bị ràng buộc với bất kỳ giá trị cố định nào. Sử dụng Thuộc tính Event.ClientX/Event.Clienty cho tọa độ nhấp chuột.

Mở một hộp cát cho nhiệm vụ.

Tạo một menu trượt tầm quan trọng: 5 Tạo một menu mở/sụp đổ khi nhấp vào: ▶ Sweeties

[nhấp vào đây]!

P.S. HTML/CSS của tài liệu nguồn sẽ được sửa đổi. Mở một hộp cát cho nhiệm vụ.

Thêm một nút đóng tầm quan trọng: 5 Có một danh sách các tin nhắn. Sử dụng JavaScript để thêm nút đóng vào góc UPPER bên phải của mỗi tin nhắn. Kết quả sẽ trông như thế này:

[x]

Ngựa

Con ngựa là một trong hai phân loài còn tồn tại của Equus Ferus. Đó là một động vật có vú kỳ lạ thuộc về họ Equidae phân loại. Con ngựa đã phát triển trong 45 đến 55 triệu năm qua từ một sinh vật nhiều mũi nhỏ, Eohippus, vào con vật lớn, độc thân ngày nay.

Donkey con lừa hoặc mông [Equus Africanus asinus] là một thành viên được thuần hóa của gia đình ngựa, Equidae. Tổ tiên hoang dã của con lừa là mông hoang dã châu Phi, E. Phi. Con lừa đã được sử dụng như một động vật làm việc trong ít nhất 5000 năm.

Con mèo

Con mèo nhà [tiếng Latin: Felis Catus] là một động vật có vú nhỏ, thường là động vật có vú ăn thịt. Chúng thường được gọi là mèo nhà khi được nuôi làm vật nuôi trong nhà hoặc đơn giản là mèo khi không cần phải phân biệt chúng với các felids và mèo khác. Mèo thường được con người đánh giá cao để đồng hành và vì khả năng săn sâu của chúng.

Tầm quan trọng của Carousel: 4 Tạo một băng chuyền của người Viking - một dải hình ảnh có thể được cuộn bằng cách nhấp vào mũi tên.

Trung tâm bóng sẽ đến chính xác dưới con trỏ trên nhấp chuột [nếu có thể mà không vượt qua cạnh trường]. CSS-Animation được chào đón.

Bóng không được ranh giới trường chéo.

Điều này [= event.civerseTarget] là yếu tố, bởi vì trình xử lý chạy trên đó. event.target là phần tử cụ thể bên trong biểu mẫu thực sự được nhấp.

Kiểm tra xem: //plnkr.co/edit/iapo3qfpdphzxju0jita?p=preview

Nó có thể là sự kiện.Target bằng này - khi nhấp chuột được thực hiện trực tiếp trên phần tử.

Ngừng sủi bọt một sự kiện sủi bọt đi từ phần tử đích thẳng lên. Thông thường, nó đi lên cho đến khi, sau đó để ghi lại đối tượng, và một số sự kiện thậm chí còn tiếp cận cửa sổ, gọi tất cả các trình xử lý trên đường dẫn. Nhưng bất kỳ người xử lý nào cũng có thể quyết định rằng sự kiện này đã được xử lý đầy đủ và ngăn chặn sự sủi bọt. Phương pháp cho nó là event.stoppropagation []. Chẳng hạn, ở đây Body. title không hoạt động nếu bạn nhấp vào:

Nhấp vào đây

Nhấp vào đây

sự kiện.

Nếu một phần tử có nhiều trình xử lý sự kiện trong một sự kiện, thì ngay cả khi một trong số chúng dừng sủi bọt, các yếu tố khác vẫn thực thi. Nói cách khác, Event.StopPropagation [] dừng việc di chuyển lên trên, nhưng trên phần tử hiện tại, tất cả các trình xử lý khác sẽ chạy. Để ngăn chặn sự sủi bọt và ngăn chặn các trình xử lý trên phần tử hiện tại chạy, có một sự kiện phương thức. Sau khi không có người xử lý khác thực thi.

Don Tiết dừng sủi bọt mà không cần!

Bong bóng là thuận tiện. Don Tiết ngăn chặn nó mà không cần một nhu cầu thực sự: rõ ràng và kiến ​​trúc được suy nghĩ tốt. Đôi khi sự kiện.stoppropagation [] tạo ra những cạm bẫy ẩn mà sau này có thể trở thành vấn đề. Ví dụ: 1. Chúng tôi tạo một menu lồng nhau. Mỗi menu con xử lý nhấp vào các yếu tố của nó và gọi stopPropagation để menu bên ngoài giành được kích hoạt. 2. Sau đó, chúng tôi quyết định bắt các nhấp chuột trên toàn bộ cửa sổ, để theo dõi hành vi của người dùng [nơi mọi người nhấp]. Một số hệ thống phân tích làm điều đó. Thông thường mã sử dụng Document.AddeventListener ['Nhấp' '] để bắt tất cả các nhấp chuột. 3 Chúng tôi đã có một khu vực chết người khác. Không có nhu cầu thực sự để ngăn chặn sự sủi bọt. Một nhiệm vụ dường như yêu cầu có thể được giải quyết bằng các phương tiện khác. Một trong số đó là sử dụng các sự kiện tùy chỉnh, chúng tôi sẽ bao gồm chúng sau. Ngoài ra, chúng tôi có thể viết dữ liệu của mình vào đối tượng sự kiện trong một trình xử lý và đọc nó trong một đối tượng khác, vì vậy chúng tôi có thể chuyển cho người xử lý thông tin của phụ huynh về việc xử lý bên dưới.

Nắm bắt ở đó, một giai đoạn khác của việc xử lý sự kiện có tên là bắt giữ. Nó hiếm khi được sử dụng trong mã thực, nhưng đôi khi có thể hữu ích. Các sự kiện DOM tiêu chuẩn

Nó có thể là sự kiện.Target bằng này - khi nhấp chuột được thực hiện trực tiếp trên phần tử.

Ngừng sủi bọt một sự kiện sủi bọt đi từ phần tử đích thẳng lên. Thông thường, nó đi lên cho đến khi, sau đó để ghi lại đối tượng, và một số sự kiện thậm chí còn tiếp cận cửa sổ, gọi tất cả các trình xử lý trên đường dẫn. Nhưng bất kỳ người xử lý nào cũng có thể quyết định rằng sự kiện này đã được xử lý đầy đủ và ngăn chặn sự sủi bọt. Phương pháp cho nó là event.stoppropagation []. Chẳng hạn, ở đây Body. title không hoạt động nếu bạn nhấp vào:

Nhấp vào đây

sự kiện.

Nếu một phần tử có nhiều trình xử lý sự kiện trong một sự kiện, thì ngay cả khi một trong số chúng dừng sủi bọt, các yếu tố khác vẫn thực thi. Nói cách khác, Event.StopPropagation [] dừng việc di chuyển lên trên, nhưng trên phần tử hiện tại, tất cả các trình xử lý khác sẽ chạy. Để ngăn chặn sự sủi bọt và ngăn chặn các trình xử lý trên phần tử hiện tại chạy, có một sự kiện phương thức. Sau khi không có người xử lý khác thực thi.

elem.addeventlistener [..., {capture: true}] // hoặc, chỉ là "true" là một bí danh đối với {capture: true} elem.addeventlistener [..., true]

Có hai giá trị có thể của tùy chọn chụp: ●

Nếu nó sai [mặc định], thì trình xử lý được đặt trên pha sủi bọt.

Nếu nó đúng, thì người xử lý được đặt ở giai đoạn bắt giữ.

Lưu ý rằng mặc dù chính thức có 3 giai đoạn, giai đoạn 2 [giai đoạn mục tiêu của Hồi giáo: sự kiện đạt đến phần tử] không được xử lý riêng: Trình xử lý trên cả hai pha chụp và sủi bọt kích hoạt ở pha đó. Hãy cùng xem cả hai lần bắt giữ và sủi bọt trong hành động:

Hình thức div

P

Hình thức div p

Mã đặt bộ xử lý nhấp vào mọi yếu tố trong tài liệu để xem cái nào đang hoạt động. Nếu bạn nhấp vào

, sau đó trình tự là:

1. HTML → Body → Form → Div [pha chụp, người nghe đầu tiên]: 2. P [cụm mục tiêu, kích hoạt hai lần, khi chúng tôi đặt hai người nghe: chụp và sủi bọt] 3. Div → Mẫu [Giai đoạn sủi bọt, người nghe thứ hai]. Có một sự kiện tài sản.Eventphase cho chúng ta biết số lượng pha mà sự kiện đã bị bắt. Nhưng nó hiếm khi được sử dụng, bởi vì chúng ta thường biết nó trong người xử lý.

Để loại bỏ trình xử lý, RemoveEventListener cần cùng pha

Nếu chúng ta addEventListener [..., true], thì chúng ta nên đề cập đến cùng một pha trong RemoveEventListener [..., đúng] để loại bỏ chính xác trình xử lý.

Để loại bỏ trình xử lý, RemoveEventListener cần cùng pha

Nếu chúng ta addEventListener [..., true], thì chúng ta nên đề cập đến cùng một pha trong RemoveEventListener [..., đúng] để loại bỏ chính xác trình xử lý.

Người nghe trên cùng một phần tử và cùng một pha chạy theo thứ tự đã đặt của họ

Nếu chúng ta có nhiều trình xử lý sự kiện ở cùng một pha, được gán cho cùng một yếu tố với AddEventListener, chúng sẽ chạy theo cùng thứ tự như chúng được tạo:

Nếu nó đúng, thì người xử lý được đặt ở giai đoạn bắt giữ.

Lưu ý rằng mặc dù chính thức có 3 giai đoạn, giai đoạn 2 [giai đoạn mục tiêu của Hồi giáo: sự kiện đạt đến phần tử] không được xử lý riêng: Trình xử lý trên cả hai pha chụp và sủi bọt kích hoạt ở pha đó. Hãy cùng xem cả hai lần bắt giữ và sủi bọt trong hành động:

Hình thức div

Nếu nó đúng, thì người xử lý được đặt ở giai đoạn bắt giữ.

Lưu ý rằng mặc dù chính thức có 3 giai đoạn, giai đoạn 2 [giai đoạn mục tiêu của Hồi giáo: sự kiện đạt đến phần tử] không được xử lý riêng: Trình xử lý trên cả hai pha chụp và sủi bọt kích hoạt ở pha đó. Hãy cùng xem cả hai lần bắt giữ và sủi bọt trong hành động:

Hình thức divP

Hình thức div p

Mã đặt bộ xử lý nhấp vào mọi yếu tố trong tài liệu để xem cái nào đang hoạt động. Nếu bạn nhấp vào

, sau đó trình tự là:

1. HTML → Body → Form → Div [pha chụp, người nghe đầu tiên]: 2. P [cụm mục tiêu, kích hoạt hai lần, khi chúng tôi đặt hai người nghe: chụp và sủi bọt] 3. Div → Mẫu [Giai đoạn sủi bọt, người nghe thứ hai]. Có một sự kiện tài sản.Eventphase cho chúng ta biết số lượng pha mà sự kiện đã bị bắt. Nhưng nó hiếm khi được sử dụng, bởi vì chúng ta thường biết nó trong người xử lý.

Để loại bỏ trình xử lý, RemoveEventListener cần cùng pha

Nếu chúng ta addEventListener [..., true], thì chúng ta nên đề cập đến cùng một pha trong RemoveEventListener [..., đúng] để loại bỏ chính xác trình xử lý.

Người nghe trên cùng một phần tử và cùng một pha chạy theo thứ tự đã đặt của họ

Nếu chúng ta có nhiều trình xử lý sự kiện ở cùng một pha, được gán cho cùng một yếu tố với AddEventListener, chúng sẽ chạy theo cùng thứ tự như chúng được tạo:

elem.addeventListener ["click", e => alert [1]]; // Đảm bảo kích hoạt elem.addeventlistener đầu tiên ["Nhấp", e => alert [2]];

Tóm tắt khi một sự kiện xảy ra - yếu tố lồng nhau nhất nơi nó xảy ra được gắn nhãn là phần tử mục tiêu của Google [Event.target]. ●

Sau đó, sự kiện chuyển xuống từ root tài liệu sang event.target, người xử lý gọi được gán với addEventListener [...., true] trên đường [true là tốc ký cho {Capture: true}]. Sau đó, người xử lý được gọi trên chính phần tử đích. Sau đó, sự kiện bong bóng từ Event.Target cho đến gốc, gọi Trình xử lý được gán bằng cách sử dụng và AddEventListener mà không có đối số thứ 3 hoặc với đối số thứ 3 Sai/{Capture: False}.

Mỗi người xử lý có thể truy cập các thuộc tính đối tượng sự kiện: ●

event.target - yếu tố sâu nhất có nguồn gốc sự kiện. event.cienTarget [= this] - phần tử hiện tại xử lý sự kiện [một phần có trình xử lý trên đó] sự kiện.EventPhase - pha hiện tại [bắt giữ = 1, Target = 2, sủi bọt = 3].
...Tây Bắc...Northwest... ......

Bảng có 9 ô, nhưng có thể có 99 hoặc 9999, không quan trọng. Nhiệm vụ của chúng tôi là làm nổi bật một ô

trong một cái nhấp chuột. Thay vì gán một trình xử lý title cho mỗi . Nó sẽ sử dụng Event.Target để có được phần tử đã nhấp và làm nổi bật nó. Mật mã:

Cho phépTD; bảng. title = function [event] {let target = event.target; // Nhấp chuột ở đâu?

if [target.tagname! = 'td'] return; // Không phải trên TD? Sau đó, chúng tôi không quan tâm nổi bật [mục tiêu]; // làm nổi bật nó}; hàm nhấn mạnh [td] {if [selectTd] {// xóa điểm nổi bật hiện có nếu bất kỳ lựa chọn nào } selectTd = td; selectTd.ClassList.Add ['tô sáng']; // làm nổi bật TD mới}

Một mã như vậy không quan tâm đến việc có bao nhiêu ô trong bảng. Chúng tôi có thể thêm/xóa

Đương nhiên, nếu một nhấp chuột xảy ra trên đó thì nó sẽ trở thành giá trị của Event.Target. then it becomes the value of event.target .

Trong bảng xử lý. title, chúng ta nên tham gia

 Để giải pháp
Động lực bất cứ lúc nào và sự nổi bật vẫn sẽ hoạt động. Tuy nhiên, có một nhược điểm. Nhấp chuột có thể xảy ra không trên , nhưng bên trong nó. Trong trường hợp của chúng tôi nếu chúng ta nhìn vào bên trong HTML, chúng ta có thể thấy các thẻ lồng nhau bên trong , giống : : Tây Bắc ... ... hay không. Ở đây, mã hóa được cải thiện:

bảng. title = function [event] {let td = event.target.closest ['td']; // [1] if [! Td] trả về; // [2] if [! Bảng.contains [td]] return; // [3] nổi bật [TD]; // [4] };

Giải thích: 1. Phương thức elem.closest [bộ chọn] trả về tổ tiên gần nhất phù hợp với bộ chọn. Trong trường hợp của chúng tôi, chúng tôi tìm kiếm

Trên đường lên từ phần tử nguồn. 2. Nếu event.target không ở trong bất kỳ , sau đó cuộc gọi trở lại NULL, và chúng tôi không phải làm bất cứ điều gì. 3. Trong trường hợp bảng lồng nhau, sự kiện.Target có thể là một nằm bên ngoài bàn hiện tại. Vì vậy, chúng tôi kiểm tra xem đó có thực sự là bảng của chúng tôi không . 4. Và, nếu nó như vậy, thì hãy làm nổi bật nó.

Ví dụ về ủy quyền: Các hành động trong đánh dấu ủy quyền sự kiện có thể được sử dụng để tối ưu hóa việc xử lý sự kiện. Chúng tôi sử dụng một trình xử lý duy nhất cho các hành động tương tự trên nhiều yếu tố. Giống như chúng tôi đã làm điều đó để làm nổi bật

. Nhưng chúng ta cũng có thể sử dụng một người xử lý duy nhất làm điểm vào cho nhiều thứ khác nhau. Chẳng hạn, chúng tôi muốn tạo một menu với các nút Save Save, Tải, tải, Tìm kiếm, v.v. Và có một đối tượng với các phương thức lưu, tải, tìm kiếm. Ý tưởng đầu tiên có thể là gán một trình xử lý riêng cho mỗi nút. Nhưng có một giải pháp thanh lịch hơn. Chúng tôi có thể thêm một trình xử lý cho toàn bộ menu và các thuộc tính DataAction cho các nút có phương thức gọi: bấm để lưu

Trình xử lý đọc thuộc tính và thực thi phương thức. Hãy xem ví dụ làm việc:

Lưu tải

Tìm kiếm

Tiết kiệm

Trọng tải

Tìm kiếm

Xin lưu ý rằng điều này. title bị ràng buộc với điều này trong [*]. Điều đó rất quan trọng, bởi vì nếu không thì bên trong nó sẽ tham chiếu phần tử DOM [ELEM], không phải đối tượng menu và [hành động] này sẽ không phải là thứ chúng ta cần. Vì vậy, những gì phái đoàn cho chúng ta ở đây?

Chúng tôi không cần phải viết mã để gán một trình xử lý cho mỗi nút. Chỉ cần tạo một phương pháp và đặt nó vào đánh dấu. Cấu trúc HTML linh hoạt, chúng ta có thể thêm/xóa các nút bất cứ lúc nào.

Chúng tôi cũng có thể sử dụng các lớp .action-save, .action-tải, nhưng một hành động dữ liệu thuộc tính tốt hơn về mặt ngữ nghĩa. Và chúng ta cũng có thể sử dụng nó trong các quy tắc CSS.

Mô hình hành vi của người Viking, chúng tôi cũng có thể sử dụng Phái đoàn sự kiện để thêm các hành vi của người Viking vào các yếu tố được khai báo, với các thuộc tính và lớp đặc biệt. Mẫu có hai phần: 1. Chúng tôi thêm một thuộc tính đặc biệt vào một phần tử. 2. Một trình xử lý toàn tài liệu theo dõi các sự kiện và nếu một sự kiện xảy ra trên một phần tử quy kết-thực hiện hành động.

Chẳng hạn, ở đây, ở đây, việc ghi dữ liệu thuộc tính thêm một hành vi: Giá trị tăng lên trên các nút Nhấp vào các nút:

Counter: Một bộ đếm nữa:

Counter: 1 một bộ đếm nữa: 2

Nếu chúng ta nhấp vào một nút - giá trị của nó được tăng lên. Không phải nút, nhưng cách tiếp cận chung là quan trọng ở đây. Có thể có nhiều thuộc tính có dữ liệu như chúng ta muốn. Chúng ta có thể thêm những cái mới vào HTML bất cứ lúc nào. Sử dụng phái đoàn sự kiện, chúng tôi đã mở rộng HTML, đã thêm một thuộc tính mô tả một hành vi mới.

Đối với trình xử lý cấp tài liệu-Luôn luôn luôn

Khi chúng tôi chỉ định một trình xử lý sự kiện cho đối tượng tài liệu, chúng tôi nên luôn sử dụng AddEventListener, không phải tài liệu. Đối với các dự án thực tế, điều bình thường là có nhiều trình xử lý trên tài liệu được đặt bởi các phần khác nhau của mã.

Toggler một ví dụ nữa. Một nhấp chuột vào một phần tử với Data-Toggle-ID thuộc tính sẽ hiển thị/ẩn phần tử bằng ID đã cho:

Hiển thị biểu mẫu đăng ký

Thư của bạn:

Hiển thị biểu mẫu đăng ký

Hãy để lưu ý một lần nữa những gì chúng tôi đã làm. Bây giờ, để thêm chức năng chuyển đổi vào một phần tử-ở đó, không cần phải biết JavaScript, chỉ cần sử dụng thuộc tính Datatoggle-id. Điều đó có thể trở nên thực sự thuận tiện - không cần phải viết JavaScript cho mọi yếu tố như vậy. Chỉ cần sử dụng hành vi. Trình xử lý cấp tài liệu làm cho nó hoạt động cho bất kỳ yếu tố nào của trang. Chúng ta cũng có thể kết hợp nhiều hành vi trên một yếu tố duy nhất. Mô hình hành vi của người Viking có thể là một sự thay thế của các bản dựng mini của JavaScript.

Tóm tắt Phái đoàn sự kiện thực sự tuyệt vời! Nó là một trong những mẫu hữu ích nhất cho các sự kiện DOM. Nó thường được sử dụng để thêm xử lý cho nhiều yếu tố tương tự, nhưng không chỉ cho điều đó. Thuật toán: 1. Đặt một trình xử lý duy nhất trên container. 2. Trong Handler - Kiểm tra phần tử nguồn .Target. 3. Nếu sự kiện xảy ra bên trong một yếu tố khiến chúng tôi quan tâm, thì hãy xử lý sự kiện. Lợi ích:

Đơn giản hóa việc khởi tạo và lưu bộ nhớ: Không cần thêm nhiều trình xử lý. Ít mã hơn: Khi thêm hoặc xóa các phần tử, không cần thêm/xóa trình xử lý. Sửa đổi DOM: Chúng ta có thể thêm/loại bỏ khối lượng các phần tử bằng bên trong và giống nhau.

Tất nhiên, phái đoàn có những hạn chế của nó:

Đơn giản hóa việc khởi tạo và lưu bộ nhớ: Không cần thêm nhiều trình xử lý. Ít mã hơn: Khi thêm hoặc xóa các phần tử, không cần thêm/xóa trình xử lý. Sửa đổi DOM: Chúng ta có thể thêm/loại bỏ khối lượng các phần tử bằng bên trong và giống nhau.

Tất nhiên, phái đoàn có những hạn chế của nó:

Đầu tiên, sự kiện phải sủi bọt. Một số sự kiện không bong bóng. Ngoài ra, người xử lý cấp thấp không nên sử dụng Event.StopPropagation []. Thứ hai, phái đoàn có thể thêm tải CPU, bởi vì trình xử lý cấp độ container phản ứng trên các sự kiện ở bất kỳ nơi nào của container, bất kể họ có quan tâm đến chúng tôi hay không. Nhưng thông thường tải không đáng kể, vì vậy chúng tôi không tính đến nó.

Nhiệm vụ ẩn tin nhắn với phái đoàn

Tầm quan trọng: 5 Có một danh sách các tin nhắn với các nút xóa [x]. Làm cho các nút hoạt động. Như thế này: [x]

Ngựa

Con ngựa là một trong hai phân loài còn tồn tại của Equus Ferus. Đó là một động vật có vú kỳ lạ thuộc về họ Equidae phân loại. Con ngựa đã phát triển trong 45 đến 55 triệu năm qua từ một sinh vật nhiều mũi nhỏ, Eohippus, vào con vật lớn, độc thân ngày nay.

Ngựa

Con ngựa là một trong hai phân loài còn tồn tại của Equus Ferus. Đó là một động vật có vú kỳ lạ thuộc về họ Equidae phân loại. Con ngựa đã phát triển trong 45 đến 55 triệu năm qua từ một sinh vật nhiều mũi nhỏ, Eohippus, vào con vật lớn, độc thân ngày nay.

[x]

Donkey con lừa hoặc mông [Equus Africanus asinus] là một thành viên được thuần hóa của gia đình ngựa, Equidae. Tổ tiên hoang dã của con lừa là mông hoang dã châu Phi, E. Phi. Con lừa đã được sử dụng như một động vật làm việc trong ít nhất 5000 năm.

Con mèo

Con mèo nhà [tiếng Latin: Felis Catus] là một động vật có vú nhỏ, thường là động vật có vú ăn thịt. Chúng thường được gọi là mèo nhà khi được nuôi làm vật nuôi trong nhà hoặc đơn giản là mèo khi không cần phải phân biệt chúng với các felids và mèo khác. Mèo thường được con người đánh giá cao để đồng hành và vì khả năng săn sâu của chúng.

P.S. Chỉ nên là một người nghe sự kiện trên container, sử dụng Phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Menu Tree Tầm quan trọng: 5 Tạo một cây hiển thị/ẩn nút trẻ em khi nhấp vào:

Đơn giản hóa việc khởi tạo và lưu bộ nhớ: Không cần thêm nhiều trình xử lý. Ít mã hơn: Khi thêm hoặc xóa các phần tử, không cần thêm/xóa trình xử lý. Sửa đổi DOM: Chúng ta có thể thêm/loại bỏ khối lượng các phần tử bằng bên trong và giống nhau.

Tất nhiên, phái đoàn có những hạn chế của nó:

Con mèo

Con mèo nhà [tiếng Latin: Felis Catus] là một động vật có vú nhỏ, thường là động vật có vú ăn thịt. Chúng thường được gọi là mèo nhà khi được nuôi làm vật nuôi trong nhà hoặc đơn giản là mèo khi không cần phải phân biệt chúng với các felids và mèo khác. Mèo thường được con người đánh giá cao để đồng hành và vì khả năng săn sâu của chúng.

P.S. Chỉ nên là một người nghe sự kiện trên container, sử dụng Phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Menu Tree Tầm quan trọng: 5 Tạo một cây hiển thị/ẩn nút trẻ em khi nhấp vào: Động vật Động vật có vú bò con lừa chó Hổ khác Chim con thằn lằn cá cá hồ cá cá con cá hồi biển biển Angelfish
5 Yêu cầu: ●
10 Chỉ có một người xử lý sự kiện [sử dụng phái đoàn]

Một nhấp chuột bên ngoài tiêu đề nút [trên một khoảng trống] không nên làm gì cả.

Mở một hộp cát cho nhiệm vụ.

2

Tầm quan trọng của bảng có thể sắp xếp

12

Các yếu tố nên sắp xếp nó theo cột tương ứng. Mỗi

9

Có loại trong thuộc tính, như thế này: ...

1

Tuổi tác

Tên

Con mèo

Con mèo nhà [tiếng Latin: Felis Catus] là một động vật có vú nhỏ, thường là động vật có vú ăn thịt. Chúng thường được gọi là mèo nhà khi được nuôi làm vật nuôi trong nhà hoặc đơn giản là mèo khi không cần phải phân biệt chúng với các felids và mèo khác. Mèo thường được con người đánh giá cao để đồng hành và vì khả năng săn sâu của chúng.

P.S. Chỉ nên là một người nghe sự kiện trên container, sử dụng Phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Menu Tree Tầm quan trọng: 5 Tạo một cây hiển thị/ẩn nút trẻ em khi nhấp vào:

Động vật Động vật có vú bò con lừa chó Hổ khác Chim con thằn lằn cá cá hồ cá cá con cá hồi biển biển Angelfish

Yêu cầu: ●

Chỉ có một người xử lý sự kiện [sử dụng phái đoàn]

Bạn sẽ cần hai sự kiện ở đây: ●

MouseOver kích hoạt khi một con trỏ đi qua một phần tử.

Chuột kích hoạt khi một con trỏ để lại một phần tử.

Vui lòng sử dụng Phái đoàn sự kiện: Thiết lập hai trình xử lý trên tài liệu để theo dõi tất cả các bộ phận vượt trội và ra khỏi các yếu tố với các yếu tố với công cụ dữ liệu và quản lý các chú giải công cụ từ đó. Sau khi hành vi được thực hiện, ngay cả những người không quen thuộc với JavaScript cũng có thể thêm các yếu tố được chú thích. P.S. Chỉ có một chú giải công cụ có thể hiển thị tại một thời điểm. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Trình duyệt hành động mặc định Nhiều sự kiện tự động dẫn đến các hành động của trình duyệt. Ví dụ:

Chuột kích hoạt khi một con trỏ để lại một phần tử.

Chuột kích hoạt khi một con trỏ để lại một phần tử.

Chuột kích hoạt khi một con trỏ để lại một phần tử.

Vui lòng sử dụng Phái đoàn sự kiện: Thiết lập hai trình xử lý trên tài liệu để theo dõi tất cả các bộ phận vượt trội và ra khỏi các yếu tố với các yếu tố với công cụ dữ liệu và quản lý các chú giải công cụ từ đó. Sau khi hành vi được thực hiện, ngay cả những người không quen thuộc với JavaScript cũng có thể thêm các yếu tố được chú thích. P.S. Chỉ có một chú giải công cụ có thể hiển thị tại một thời điểm. Mở một hộp cát cho nhiệm vụ.

Chuột kích hoạt khi một con trỏ để lại một phần tử.

Vui lòng sử dụng Phái đoàn sự kiện: Thiết lập hai trình xử lý trên tài liệu để theo dõi tất cả các bộ phận vượt trội và ra khỏi các yếu tố với các yếu tố với công cụ dữ liệu và quản lý các chú giải công cụ từ đó. Sau khi hành vi được thực hiện, ngay cả những người không quen thuộc với JavaScript cũng có thể thêm các yếu tố được chú thích. P.S. Chỉ có một chú giải công cụ có thể hiển thị tại một thời điểm. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Trình duyệt hành động mặc định Nhiều sự kiện tự động dẫn đến các hành động của trình duyệt. Ví dụ:

Một cú nhấp chuột vào một liên kết - bắt đầu đi đến URL của nó.

Nhấp vào nút gửi bên trong một biểu mẫu - bắt đầu gửi vào máy chủ.

Nhấn nút chuột qua văn bản và di chuyển nó - chọn văn bản.

Nếu chúng tôi xử lý một sự kiện trong JavaScript, thường thì chúng tôi không muốn có các hành động của trình duyệt. May mắn thay, nó có thể được ngăn chặn.

Ngăn chặn các hành động của trình duyệt Có hai cách để nói với trình duyệt mà chúng tôi không muốn hành động: ●

Cách chính là sử dụng đối tượng sự kiện. Có một sự kiện phương thức.PreventDefault []. Nếu trình xử lý được gán bằng cách sử dụng [không phải bởi addeventListener], thì chúng ta chỉ có thể trả về sai từ nó.

Trong ví dụ dưới đây, nhấp vào các liên kết không dẫn đến thay đổi URL:

Bấm vào đây hoặc đây , that doesn’t work. Search engines follow links while indexing.

Không cần thiết để trả về đúng

Giá trị được trả về bởi một người xử lý sự kiện thường bị bỏ qua. Ngoại lệ duy nhất - là trả về sai từ một trình xử lý được gán bằng cách sử dụng. Trong tất cả các trường hợp khác, việc trả lại là không cần thiết và dù sao thì nó cũng không được xử lý.

Ví dụ: Menu Xem xét menu trang web, như thế này:

Đây là cách mà nó trông với một số CSS:

HTML

JavaScript

CSS

Các mục menu là liên kết, không phải nút. Có một số lợi ích, ví dụ: ●

Theo mặc định, trình duyệt trên sự kiện bối cảnh [nhấp chuột phải] hiển thị menu ngữ cảnh với các tùy chọn tiêu chuẩn. Chúng ta có thể ngăn chặn nó và thể hiện của riêng mình, như thế này:

Nhấp chuột phải vào menu ngữ cảnh trình duyệt

Nhấp chuột phải vào menu ngữ cảnh của chúng tôi

Nhấp chuột phải vào menu ngữ cảnh trình duyệt

Nhấp chuột phải vào menu ngữ cảnh của chúng tôi

Bây giờ, hãy để nói rằng chúng tôi muốn triển khai menu ngữ cảnh toàn tài liệu của riêng mình, với các tùy chọn của chúng tôi. Và bên trong tài liệu, chúng tôi có thể có các yếu tố khác với các menu ngữ cảnh của riêng họ:

Nhấp chuột phải vào đây cho menu ngữ cảnh tài liệu

Nhấp chuột phải vào đây cho menu ngữ cảnh nút

Nhấp chuột phải vào đây cho menu ngữ cảnh tài liệu Nhấp chuột phải vào đây cho menu ngữ cảnh nút

Vấn đề là khi chúng tôi nhấp vào ELEM, chúng tôi nhận được hai menu: mức nút và [sự kiện bong bóng lên] menu cấp tài liệu. Làm thế nào để sửa chữa nó? Một trong những giải pháp là suy nghĩ như: Chúng tôi hoàn toàn xử lý sự kiện trong trình xử lý nút, hãy để ngăn chặn nó và sử dụng Event.StopPropagation []:

Nhấp chuột phải vào menu tài liệu

Nhấp chuột phải vào menu nút [sửa bằng event.stoppropagati

Nhấp chuột phải vào menu Tài liệu Nhấp chuột phải vào menu nút [được sửa bằng Event.StopPropagation]

Bây giờ menu cấp nút hoạt động như dự định. Nhưng giá cao. Chúng tôi mãi mãi từ chối quyền truy cập vào thông tin về nhấp chuột phải cho bất kỳ mã bên ngoài nào, bao gồm cả các bộ đếm thu thập số liệu thống kê, v.v. Điều đó khá không khôn ngoan. Một giải pháp thay thế sẽ là kiểm tra trình xử lý tài liệu nếu hành động mặc định được ngăn chặn? Nếu nó là như vậy, thì sự kiện đã được xử lý và chúng tôi không cần phải phản ứng với nó.

Nhấp chuột phải vào menu tài liệu [sửa bằng event.defaultprevented]

Nhấp chuột phải vào menu nút

Nhấp chuột phải vào menu tài liệu [sửa bằng event.defaultprevented] Nhấp chuột phải vào menu nút

Bây giờ mọi thứ cũng hoạt động chính xác. Nếu chúng ta có các yếu tố lồng nhau, và mỗi phần trong số chúng có một menu ngữ cảnh của riêng nó, điều đó cũng sẽ hoạt động. Chỉ cần đảm bảo kiểm tra Event.DefaultPrevent trong mỗi trình xử lý bối cảnh.

event.stoppropagation [] và event.preventDefault []

Như chúng ta có thể thấy rõ, event.stopPropagation [] và event.preventDefault [] [còn được gọi là return false] là hai điều khác nhau. Họ không liên quan đến nhau.

event.stoppropagation [] và event.preventDefault []

Như chúng ta có thể thấy rõ, event.stopPropagation [] và event.preventDefault [] [còn được gọi là return false] là hai điều khác nhau. Họ không liên quan đến nhau.

Kiến trúc menu bối cảnh lồng nhau

Ngoài ra còn có những cách khác để thực hiện các menu bối cảnh lồng nhau. Một trong số đó là có một đối tượng toàn cầu đặc biệt với một phương thức xử lý Document.onContextMenu, và cả các phương thức cho phép lưu trữ các trình xử lý cấp độ thấp hơn khác nhau trong đó. Đối tượng sẽ bắt bất kỳ nhấp chuột phải, nhìn qua các trình xử lý được lưu trữ và chạy cái thích hợp. Nhưng sau đó, mỗi đoạn mã muốn một menu ngữ cảnh nên biết về đối tượng đó và sử dụng trợ giúp của nó thay vì trình xử lý bối cảnh riêng.

Tóm tắt Có nhiều hành động trình duyệt mặc định: ●

Mousedown - bắt đầu lựa chọn [di chuyển chuột sang chọn].

Tóm tắt Có nhiều hành động trình duyệt mặc định: ●

Tóm tắt Có nhiều hành động trình duyệt mặc định: ●

Tóm tắt Có nhiều hành động trình duyệt mặc định: ●

Tóm tắt Có nhiều hành động trình duyệt mặc định: ●

Tóm tắt Có nhiều hành động trình duyệt mặc định: ●

Mousedown - bắt đầu lựa chọn [di chuyển chuột sang chọn].

Nhấp vào - Kiểm tra/bỏ qua đầu vào.

Gửi - Nhấp vào hoặc nhấn nhập vào bên trong trường biểu mẫu khiến sự kiện này xảy ra và trình duyệt gửi biểu mẫu sau nó. Bánh xe - Lăn một sự kiện bánh xe chuột có cuộn là hành động mặc định. Keydown - Nhấn phím có thể dẫn đến việc thêm một ký tự vào một trường hoặc các hành động khác. bối cảnh-sự kiện xảy ra trên một cú nhấp chuột phải, hành động là hiển thị menu ngữ cảnh trình duyệt. …có nhiều…

Tất cả các hành động mặc định có thể được ngăn chặn nếu chúng tôi muốn xử lý sự kiện riêng bởi JavaScript.

Để ngăn chặn hành động mặc định - sử dụng một trong hai sự kiện.preventDefault [] hoặc trả về sai. Phương pháp thứ hai chỉ hoạt động cho các trình xử lý được gán với ON. Bị động: Tùy chọn thực sự của AddEventListener nói với trình duyệt rằng hành động sẽ không được ngăn chặn. Điều đó hữu ích cho một số sự kiện di động, như TouchStart và TouchMove, để nói với trình duyệt rằng không nên chờ tất cả các trình xử lý hoàn thành trước khi cuộn. Nếu hành động mặc định được ngăn chặn, giá trị của event.defaultprevented trở thành đúng, nếu không thì nó sai.

Nhiệm vụ tại sao "trả lại sai" không hoạt động? Tầm quan trọng: 3 Tại sao trong mã dưới đây trả về sai không hoạt động?

Trình duyệt sẽ truy cập W3.org

Trình duyệt sẽ truy cập W3.org

Trình duyệt theo URL trên nhấp chuột, nhưng chúng tôi không muốn nó. Làm thế nào để khắc phục? Để giải pháp

Bắt các liên kết trong tầm quan trọng của phần tử: 5 Tạo tất cả các liên kết bên trong phần tử với ID = "Nội dung" Hỏi người dùng nếu họ thực sự muốn rời đi. Và nếu họ don thì don don theo dõi. Như thế này: #Contents Làm thế nào để đọc Wikipedia hoặc truy cập w3.org và tìm hiểu về các tiêu chuẩn hiện đại?

Chi tiết: ●

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Bộ sưu tập hình ảnh Tầm quan trọng: 5 Tạo một bộ sưu tập hình ảnh trong đó hình ảnh chính thay đổi bằng cách nhấp vào hình thu nhỏ. Như thế này:

P.S. Sử dụng phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Bộ sưu tập hình ảnh Tầm quan trọng: 5 Tạo một bộ sưu tập hình ảnh trong đó hình ảnh chính thay đổi bằng cách nhấp vào hình thu nhỏ. Như thế này:

P.S. Sử dụng phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Công văn các sự kiện tùy chỉnh Chúng tôi không chỉ có thể chỉ định trình xử lý mà còn tạo các sự kiện từ JavaScript. Các sự kiện tùy chỉnh có thể được sử dụng để tạo ra các thành phần đồ họa. Chẳng hạn, một phần tử gốc của menu có thể kích hoạt các sự kiện cho biết những gì xảy ra với menu: Mở [Menu mở], chọn [một mục được chọn], v.v. Ngoài ra, chúng tôi có thể tạo ra các sự kiện tích hợp như Click, Mousedown, v.v., có thể tốt để thử nghiệm.

Sự kiện xây dựng sự kiện tạo thành một hệ thống phân cấp, giống như các lớp phần tử DOM. Root là lớp sự kiện tích hợp. Chúng ta có thể tạo các đối tượng sự kiện như thế này: LET EVEN = new Event [loại sự kiện [, Tùy chọn]];

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Bộ sưu tập hình ảnh Tầm quan trọng: 5 Tạo một bộ sưu tập hình ảnh trong đó hình ảnh chính thay đổi bằng cách nhấp vào hình thu nhỏ. Như thế này:

P.S. Sử dụng phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Công văn các sự kiện tùy chỉnh Chúng tôi không chỉ có thể chỉ định trình xử lý mà còn tạo các sự kiện từ JavaScript. Các sự kiện tùy chỉnh có thể được sử dụng để tạo ra các thành phần đồ họa. Chẳng hạn, một phần tử gốc của menu có thể kích hoạt các sự kiện cho biết những gì xảy ra với menu: Mở [Menu mở], chọn [một mục được chọn], v.v. Ngoài ra, chúng tôi có thể tạo ra các sự kiện tích hợp như Click, Mousedown, v.v., có thể tốt để thử nghiệm.

Sự kiện xây dựng sự kiện tạo thành một hệ thống phân cấp, giống như các lớp phần tử DOM. Root là lớp sự kiện tích hợp. Chúng ta có thể tạo các đối tượng sự kiện như thế này: LET EVEN = new Event [loại sự kiện [, Tùy chọn]];

Đối số: ●

Loại sự kiện-có thể là bất kỳ chuỗi nào, như "Nhấp" hoặc của chúng tôi như "Hey-ho!" .

Tùy chọn - Đối tượng có hai thuộc tính tùy chọn: ●

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

Để giải pháp

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

HTML bên trong phần tử có thể được tải hoặc tái tạo động bất cứ lúc nào, vì vậy chúng ta có thể tìm thấy tất cả các liên kết và đặt trình xử lý lên chúng. Sử dụng phái đoàn sự kiện. Nội dung có thể có thẻ lồng nhau. Các liên kết bên trong quá, như ....

Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Bộ sưu tập hình ảnh Tầm quan trọng: 5 Tạo một bộ sưu tập hình ảnh trong đó hình ảnh chính thay đổi bằng cách nhấp vào hình thu nhỏ. Như thế này:

P.S. Sử dụng phái đoàn sự kiện. Mở một hộp cát cho nhiệm vụ.

Công văn các sự kiện tùy chỉnh Chúng tôi không chỉ có thể chỉ định trình xử lý mà còn tạo các sự kiện từ JavaScript. Các sự kiện tùy chỉnh có thể được sử dụng để tạo ra các thành phần đồ họa. Chẳng hạn, một phần tử gốc của menu có thể kích hoạt các sự kiện cho biết những gì xảy ra với menu: Mở [Menu mở], chọn [một mục được chọn], v.v. Ngoài ra, chúng tôi có thể tạo ra các sự kiện tích hợp như Click, Mousedown, v.v., có thể tốt để thử nghiệm.

Xin chào cho John!

Thuộc tính chi tiết có thể có bất kỳ dữ liệu. Về mặt kỹ thuật, chúng ta có thể sống mà không có, bởi vì chúng ta có thể gán bất kỳ thuộc tính nào vào một đối tượng sự kiện mới thông thường sau khi tạo ra nó. Nhưng CustomEvent cung cấp lĩnh vực chi tiết đặc biệt để nó trốn tránh xung đột với các thuộc tính sự kiện khác. Lớp sự kiện kể một cái gì đó về loại sự kiện nào, và nếu sự kiện này là tùy chỉnh, thì chúng ta nên sử dụng Customevent chỉ để rõ ràng về nó là gì.

event.preventDefault [] chúng ta có thể gọi event.preventDefault [] trên một sự kiện do tập lệnh tạo nếu có thể hủy: thực sự được chỉ định. Tất nhiên, nếu sự kiện này có tên không chuẩn, thì nó không được trình duyệt biết đến và ở đó, không có hành động nào của trình duyệt mặc định. Nhưng mã tạo sự kiện có thể lên kế hoạch cho một số hành động sau khi DispatchEvent. Call of Event.PreventDefault [] là một cách để người xử lý gửi tín hiệu rằng những hành động đó không nên được thực hiện. Trong trường hợp đó, cuộc gọi đến elem.dispatchevent [sự kiện] trả về sai. Và mã tạo sự kiện biết rằng việc xử lý không nên tiếp tục. Chẳng hạn, trong ví dụ bên dưới có hàm ẩn []. Nó tạo ra sự kiện "ẩn" trên phần tử #Rabbit, thông báo cho tất cả các bên quan tâm rằng con thỏ sẽ ẩn.

Một người xử lý do Rabbit.addeventlistener đặt ra ['ẩn', ...] sẽ tìm hiểu về điều đó và, nếu nó muốn, có thể ngăn chặn hành động đó bằng cách gọi event.preventDefault []. Sau đó, con thỏ đã giành được sự che giấu:

| \ /| \ | _ | / /. .

Để có được văn bản, đang chờ phản hồi.Text [] thay vì. text []; // đọc phần thân phản hồi dưới dạng cảnh báo văn bản [text.slice [0, 80] + '...'];

Là một trường hợp hiển thị để đọc ở định dạng nhị phân, hãy để Fetch và hiển thị một hình ảnh [xem Chương Blob để biết chi tiết về các hoạt động trên Blobs]:

let feedback = Await fetch ['/artical/fetch/logo fetch.svg']; Đặt blob = chờ phản hồi.blob []; // Tải xuống dưới dạng đối tượng Blob // Tạo cho nó cho Img = Document.CreateEement ['IMG']; img.style = 'Vị trí: Đã sửa; Top: 10px; trái: 10px; chiều rộng: 100px'; document.body.Append [IMG]; // hiển thị nó img.src = url.createObjectUrl [blob]; setTimeout [[] => {// Ẩn sau ba giây img.remove []; url.revokeobjecturl [img.src];}, 3000];

Quan trọng:

Chúng ta chỉ có thể chọn một phương pháp phân tích cơ thể. Nếu chúng ta nhận được phản hồi với phản hồi.text [], thì about.json [] đã giành được công việc, vì nội dung cơ thể đã được xử lý.

Đặt văn bản = đang chờ phản hồi.text []; // Phản hồi cơ thể tiêu thụ Let phân tích cú pháp = đang chờ phản hồi.json []; // thất bại [đã được tiêu thụ]

Các tiêu đề có một đối tượng tiêu đề giống như bản đồ trong phản hồi.headers. Chúng ta có thể nhận được các tiêu đề riêng lẻ hoặc lặp lại chúng:

Let trả lời = Await Fetch ['//api.github.com/repos/javaScript-tutorial/en.java // Nhận một cảnh báo tiêu đề [respession.headers.get [' Content-type ']]; // Ứng dụng /json; charet = utf-8 // lặp lại tất cả các tiêu đề cho [hãy [khóa, giá trị] của phản hồi.headers] {alert [`$ {key} = $ {value}`];}

Để đặt tiêu đề, chúng ta có thể sử dụng tùy chọn tiêu đề, như thế này: let reapes = fetch [bảo vệURL, {tiêu đề: {xác thực: 'abcdef'}}];

Nhưng có một danh sách các tiêu đề HTTP bị cấm

Chấp nhận-Charset, Chấp nhận-Mã hóa

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập kiểm soát-yêu cầu phương pháp

Sự liên quan

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập kiểm soát-yêu cầu phương pháp

Sự liên quan

Thời lượng nội dung

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập kiểm soát-yêu cầu phương pháp

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập các tiêu đề yêu cầu kiểm soát

Truy cập kiểm soát-yêu cầu phương pháp

Sự liên quan

Thời lượng nội dung

Cookie, cookie2

Nộp

Ở đây, chúng tôi cũng không cần thiết lập loại nội dung theo cách thủ công, bởi vì một đối tượng blob có loại tích hợp [ở đây hình ảnh/png, như được tạo bởi toblob]. Hàm Substem [] có thể được viết lại mà không cần Async/Await như thế này: function subrow [] {canvaselem.toBlob [function [blob] {fetch ['/artical/fetch/post/post

cơ thể: blob}] .then [answer => respession.json []] .then [result => alert [json.Stringify [result, null, 2]]]}, 'hình ảnh/png']; }

Tóm tắt một yêu cầu tìm nạp điển hình bao gồm hai cuộc gọi đang chờ đợi: Let trả lời = Await Fetch [URL, Tùy chọn]; // giải quyết với các tiêu đề phản hồi cho kết quả = chờ phản hồi.json []; // đọc cơ thể là json

Hoặc, theo phong cách hứa hẹn:

Tìm nạp [URL, Tùy chọn] .then [Phản hồi => Trả lời.json []] .then [result => / * Kết quả quá trình * /]

Thuộc tính phản hồi: ●

Phản hồi.Status - Mã HTTP của phản hồi,

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.headers-Đối tượng giống như bản đồ với các tiêu đề HTTP.

Phương pháp để có được cơ thể phản hồi: ●

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.headers-Đối tượng giống như bản đồ với các tiêu đề HTTP.

Phương pháp để có được cơ thể phản hồi: ●

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.headers-Đối tượng giống như bản đồ với các tiêu đề HTTP.

Phương pháp để có được cơ thể phản hồi: ●

respons.json [] - phân tích phản hồi là đối tượng JSON,

phản hồi.text [] - trả về phản hồi dưới dạng văn bản,

reserver.formData [] - Trả về phản hồi dưới dạng đối tượng formData [mã hóa biểu mẫu/nhiều phần phản hồi dưới dạng mảngbuffer [dữ liệu nhị phân thuần túy],

Tùy chọn tìm nạp cho đến nay: ●

Phương pháp-HTTP-Method,

Tiêu đề - một đối tượng có tiêu đề yêu cầu [không cho phép bất kỳ tiêu đề nào],

Cơ thể - Chuỗi, FormData, Bộ đệm, Blob hoặc UrlSearchParams đối tượng để gửi.

Trong các chương tiếp theo, chúng tôi sẽ thấy nhiều tùy chọn hơn và sử dụng các trường hợp tìm nạp.

Nộp

Nhiệm vụ tìm nạp người dùng từ GitHub Tạo một hàm Async GetUsers [tên], nhận được một loạt các đăng nhập GitHub, tìm nạp người dùng từ GitHub và trả về một loạt người dùng GitHub. URL GitHub với người dùng Informaiterton cho tên người dùng đã cho là: //api.github.com/users/username. Có một ví dụ thử nghiệm trong hộp cát. Chi tiết quan trọng: 1. Cần có một yêu cầu tìm nạp cho mỗi người dùng. Và các yêu cầu không nên chờ đợi nhau. Để dữ liệu đến càng sớm càng tốt. 2. Nếu bất kỳ yêu cầu nào thất bại, hoặc nếu không có người dùng nào như vậy, chức năng sẽ trả lại null trong mảng kết quả. Mở một hộp cát với các bài kiểm tra.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.headers-Đối tượng giống như bản đồ với các tiêu đề HTTP.

Phương pháp để có được cơ thể phản hồi: ●

Phản hồi.OK-Đúng là trạng thái là 200-299.

Phản hồi.headers-Đối tượng giống như bản đồ với các tiêu đề HTTP.

Phương pháp để có được cơ thể phản hồi: ●

Hình ảnh:

Hình ảnh: Chọn Tệp Không chọn tệp

John

Nộp

Gửi một biểu mẫu với dữ liệu blob như chúng tôi đã thấy trong chương tìm nạp, gửi một blob được tạo động, ví dụ: Một hình ảnh, là dễ dàng. Chúng ta có thể cung cấp nó trực tiếp dưới dạng cơ thể tham số tìm nạp. Mặc dù vậy, trong thực tế, nó thường thuận tiện để gửi một hình ảnh không riêng biệt, nhưng là một phần của biểu mẫu, với các trường bổ sung, chẳng hạn như tên của tên và các siêu dữ liệu khác. Ngoài ra, các máy chủ thường phù hợp hơn để chấp nhận các hình thức được mã hóa nhiều phần, thay vì dữ liệu nhị phân thô. Ví dụ này gửi một hình ảnh từ, cùng với một số trường khác, sử dụng formdata:

Nộp

Gửi một biểu mẫu với dữ liệu blob như chúng tôi đã thấy trong chương tìm nạp, gửi một blob được tạo động, ví dụ: Một hình ảnh, là dễ dàng. Chúng ta có thể cung cấp nó trực tiếp dưới dạng cơ thể tham số tìm nạp. Mặc dù vậy, trong thực tế, nó thường thuận tiện để gửi một hình ảnh không riêng biệt, nhưng là một phần của biểu mẫu, với các trường bổ sung, chẳng hạn như tên của tên và các siêu dữ liệu khác. Ngoài ra, các máy chủ thường phù hợp hơn để chấp nhận các hình thức được mã hóa nhiều phần, thay vì dữ liệu nhị phân thô. Ví dụ này gửi một hình ảnh từ, cùng với một số trường khác, sử dụng formdata:

Xin lưu ý cách thêm blob hình ảnh: formData.Append ["Image", ImageBlob, "Image.png"];

Điều đó giống như khi có trong biểu mẫu và khách truy cập đã gửi một tệp có tên Image.png [đối số thứ 3] từ hệ thống tập tin của họ.

Tóm tắt các đối tượng FormData  Các đối tượng được sử dụng để chụp biểu mẫu HTML và gửi nó bằng cách tìm nạp hoặc phương thức mạng khác. Chúng ta có thể tạo FormData mới [biểu mẫu] từ biểu mẫu HTML hoặc tạo một đối tượng trống, sau đó nối các trường bằng các phương thức: ●

formdata.append [tên, giá trị]

formdata.append [tên, giá trị]

formdata.append [tên, giá trị]

formdata.Append [tên, blob, fileName]

formdata.set [tên, giá trị]

formdata.append [tên, giá trị]

formdata.append [tên, giá trị]

formdata.Append [tên, blob, fileName]

formdata.set [tên, giá trị]

formdata.set [tên, blob, filename]

Hai đặc thù ở đây: 1. Phương thức SET sẽ loại bỏ các trường có cùng tên, phần chen lấn không. 2. Để gửi một tệp, cần phải có cú pháp 3 đối số, đối số cuối cùng là tên tệp, thông thường được lấy từ hệ thống tập tin người dùng. Các phương pháp khác là: ●

formdata.delete [tên]

formdata.append [tên, giá trị]

formdata.Append [tên, blob, fileName]

formdata.set [tên, giá trị]

formdata.set [tên, blob, filename]

Hai đặc thù ở đây: 1. Phương thức SET sẽ loại bỏ các trường có cùng tên, phần chen lấn không. 2. Để gửi một tệp, cần phải có cú pháp 3 đối số, đối số cuối cùng là tên tệp, thông thường được lấy từ hệ thống tập tin người dùng. Các phương pháp khác là: ●

Concatenates những thứ đó, vì vậy, có một số mã để làm điều đó: 1. Chúng tôi tạo Uint8array mới [nhận được mô tả]-một mảng đồng tương tự với độ dài kết hợp. 2. Sau đó, sử dụng phương thức .set [chunk, vị trí] để sao chép từng phần khác nhau trong mảng kết quả. 5. Chúng tôi có kết quả trong chunksall. Mặc dù vậy, nó là một mảng byte, không phải là một chuỗi. Để tạo một chuỗi, chúng ta cần giải thích các byte này. Các văn bản tích hợp làm chính xác điều đó. Sau đó, chúng ta có thể json. Điều gì sẽ xảy ra nếu chúng ta cần nội dung nhị phân thay vì JSON? Điều đó thậm chí còn đơn giản hơn. Thay thế các bước 4 và 5 bằng một cuộc gọi đến một đốm màu từ tất cả các khối:

Đặt BLOB = BLOB MỚI [khối];

Cuối cùng, chúng ta có kết quả [như một chuỗi hoặc một đốm màu, bất cứ điều gì là thuận tiện] và theo dõi tiến trình trong quá trình. Một lần nữa, xin lưu ý rằng, không phải để tải lên tiến trình [không có cách nào với Fetch], chỉ để tải xuống tiến trình.

Fetch: hủy bỏ việc tìm kiếm là một chút khó khăn. Hãy nhớ rằng, lấy lại một lời hứa. Và JavaScript thường không có khái niệm về việc hủy bỏ một lời hứa. Vậy làm thế nào chúng ta có thể hủy bỏ một tìm nạp? Có một đối tượng tích hợp đặc biệt cho các mục đích như vậy: AbortControll. Việc sử dụng khá đơn giản: ●

Bước 1: Tạo bộ điều khiển:

Đặt bộ điều khiển = new AbortControll [];

Một bộ điều khiển là một đối tượng cực kỳ đơn giản. Nó có một phương thức hủy bỏ [] và một tín hiệu thuộc tính duy nhất. Khi hủy bỏ []

Đặt bộ điều khiển = new AbortControll []; Đặt tín hiệu = bộ điều khiển.signal;

// kích hoạt khi bộ điều khiển.abort [] được gọi là tín hiệu.addeventlistener ['abort', [] => alert ["hủy bỏ!"]]; bộ điều khiển.abort []; // Huỷ bỏ! cảnh báo [tín hiệu.aborted]; // Đúng [sau khi hủy bỏ]

Bước 2: Chuyển thuộc tính tín hiệu để tìm nạp tùy chọn: Đặt bộ điều khiển = new AbortControll []; tìm nạp [url, {tín hiệu: bộ điều khiển.signal}];

Bây giờ hãy tìm nạp tín hiệu. ●

Bước 3: Để hủy bỏ, gọi bộ điều khiển.abort []: bộ điều khiển.abort [];

Chúng tôi đã hoàn thành: Tìm nạp sự kiện từ tín hiệu và hủy bỏ yêu cầu. Khi một tìm nạp bị hủy bỏ, lời hứa của nó sẽ từ chối với một lỗi có tên ABURTROR, vì vậy chúng ta nên xử lý nó:

// hủy bỏ trong 1 giây LET điều khiển = new AbortControll []; setTimeout [[] => bộ điều khiển.abort [], 1000]; thử {let respession = Await fetch ['/artical/fetch-abort/demo/hang', {tín hiệu: bộ điều khiển.signal}]; } Catch [err] {if [err.name == 'aborterror'] {// xử lý hủy bỏ [] cảnh báo ["bị hủy bỏ!"]; } khác {ném err; }}

AbortControll có khả năng mở rộng, nó cho phép hủy nhiều nạp cùng một lúc. Chẳng hạn, ở đây chúng tôi tìm nạp nhiều URL song song và bộ điều khiển hủy bỏ tất cả:

Đặt urls = [...]; // Danh sách các URL để tìm nạp song song Let Trình điều khiển = new AbortControll []; Đặt fetchjobs = urls.map [url => fetch [url, {tín hiệu: bộ điều khiển.signal}]]; hãy để kết quả = Await Promise.all [fetchjobs]; // Từ nơi khác: // Trình điều khiển.abort [] dừng tất cả các tìm nạp

Nếu chúng ta có công việc riêng, khác với Fetch, chúng ta có thể sử dụng một abortcontroll duy nhất để ngăn chặn những người đó, cùng với các Fetches. Đặt urls = [...]; Đặt bộ điều khiển = new AbortControll []; Let ourJob = new Promise [[giải quyết, từ chối] => {... bộ điều khiển.signal.addeventlistener ['abort', từ chối];}]; Đặt fetchjobs = urls.map [url => fetch [url, {tín hiệu: bộ điều khiển.signal}]]; hãy để kết quả = Await Promise.all [[... fetchjobs, ourjob]]; // Từ nơi khác: // Trình điều khiển.abort [] dừng tất cả các Fetches và Ourjob

Tìm nạp: Yêu cầu có nguồn gốc chéo nếu chúng ta thực hiện một phần từ từ trang web tùy ý, điều đó có thể sẽ thất bại. Khái niệm cốt lõi ở đây là nguồn gốc - bộ ba miền/cổng/giao thức. Các yêu cầu có nguồn gốc chéo-những người được gửi đến một miền khác [thậm chí là một tên miền phụ] hoặc giao thức hoặc cổng-yêu cầu các tiêu đề đặc biệt từ phía từ xa. Chính sách đó được gọi là CORS CORS: Chia sẻ tài nguyên có nguồn gốc từ chéo. Chẳng hạn, hãy để thử tìm nạp //example.com: thử {Await fetch ['//example.com'];

} Catch [err] {alert [err]; // Không thể tìm nạp }

Fetch thất bại, như mong đợi.

Tại sao? Một lịch sử ngắn gọn bởi vì các hạn chế có nguồn gốc chéo bảo vệ Internet khỏi các tin tặc xấu xa. Nghiêm túc. Hãy để Lừa làm cho một cuộc lạc đề lịch sử rất ngắn gọn. Trong nhiều năm, một kịch bản từ một trang web không thể truy cập nội dung của một trang web khác. Quy tắc đơn giản nhưng mạnh mẽ đó là một nền tảng của bảo mật Internet. Ví dụ. Một tập lệnh từ trang hacker.com không thể truy cập hộp thư của người dùng tại gmail.com. Mọi người cảm thấy an toàn. JavaScript cũng không có bất kỳ phương pháp đặc biệt nào để thực hiện các yêu cầu mạng tại thời điểm đó. Đó là một ngôn ngữ đồ chơi để trang trí một trang web. Nhưng các nhà phát triển web yêu cầu nhiều quyền lực hơn. Một loạt các thủ thuật đã được phát minh để làm việc xung quanh giới hạn.

Sử dụng các biểu mẫu Một cách để giao tiếp với một máy chủ khác là gửi một ở đó. Mọi người đã gửi nó vào, chỉ để ở trên trang hiện tại, như thế này:

...

Vì vậy, có thể thực hiện yêu cầu GET/POST cho một trang web khác, ngay cả khi không có các phương thức kết nối mạng. Nhưng vì nó bị cấm truy cập vào nội dung của một từ một trang web khác, nên không thể đọc phản hồi. Như chúng ta có thể thấy, các biểu mẫu được phép gửi dữ liệu ở bất cứ đâu, nhưng không nhận được phản hồi. Nói chính xác, có những thủ thuật thực sự cho điều đó [yêu cầu các kịch bản đặc biệt ở cả iframe và trang], nhưng hãy để những con khủng long này yên nghỉ.

Sử dụng tập lệnh Một thủ thuật khác là sử dụng

Biểu mẫu được gửi với mã hóa dữ liệu đa dạng/hình thức. Hoặc, nếu chúng ta thích JSON hơn, thì JSON.Stringify và gửi dưới dạng chuỗi. Chỉ cần không quên đặt loại nội dung tiêu đề: Ứng dụng/JSON, nhiều khung hình phía máy chủ tự động giải mã JSON với nó:

Đặt xhr = new xmlhttprequest []; Hãy để json = json.Stringify [{name: "John", họ: "Smith"}]; xhr.open ["post", '/gửi'] xhr.setRequestHeader ['loại nội dung', 'application/json; charet = utf-8']; XHR.SEND [JSON];

Phương pháp .Send [cơ thể] là khá ăn tạp. Nó có thể gửi hầu hết mọi thứ, bao gồm các đối tượng Blob và Buffersource.

Tải lên sự kiện tiến độ chỉ hoạt động trên giai đoạn tải xuống. Đó là: Nếu chúng tôi đăng một cái gì đó, XMLHTTPREQUEST lần đầu tiên tải lên dữ liệu của chúng tôi [thân yêu cầu], sau đó tải xuống phản hồi. Nếu chúng tôi tải lên một cái gì đó lớn, thì chúng tôi chắc chắn sẽ quan tâm nhiều hơn đến việc theo dõi tiến trình tải lên. Nhưng xhr.onprotress không giúp đỡ ở đây. Có một đối tượng khác XHR.upload, không có phương thức, dành riêng cho các sự kiện tải lên. Danh sách sự kiện tương tự như các sự kiện XHR, nhưng xhr.upload kích hoạt chúng khi tải lên: ●

LoadStart - Tải lên bắt đầu.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Abort - Tải lên bị hủy bỏ.

Lỗi-lỗi không phải HTTP.

Tải - Tải lên hoàn thành thành công.

Thời gian chờ - Tải lên thời gian ra [nếu thuộc tính thời gian chờ được đặt].

Loadend - Tải lên kết thúc với thành công hoặc lỗi.

Ví dụ về người xử lý:

xhr.upload.onProTHER = function [event] {alert [`Được tải lên $ {event.loaded} của $ {event.total} byte`]; }; xhr.upload.onload = function [] {alert [`Tải lên đã hoàn thành thành công.`]; }; xhr.upload.onerror = function [] {alert [`lỗi Trong quá trình tải lên: $ {xhr.status}`]; };

Ở đây, một ví dụ thực tế: Tải lên tệp với chỉ báo tiến trình:

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Abort - Tải lên bị hủy bỏ.

Lỗi-lỗi không phải HTTP.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Tiến trình - Kích hoạt định kỳ trong quá trình tải lên.

Abort - Tải lên bị hủy bỏ.

Lỗi-lỗi không phải HTTP.

Sự kiện tiến bộ không hữu ích để tiếp tục tải lên, chúng ta cần biết có bao nhiêu được tải lên cho đến khi kết nối bị mất. Có XHR.upload.onprotress để theo dõi tiến trình tải lên. Thật không may, nó vô dụng ở đây, vì nó kích hoạt khi dữ liệu được gửi, nhưng nó có nhận được bởi máy chủ không? Trình duyệt không biết. Có thể nó được đệm bởi một proxy mạng cục bộ, hoặc có thể quy trình máy chủ từ xa đã chết và không thể xử lý chúng, hoặc nó chỉ bị mất ở giữa khi kết nối bị hỏng, và didn tiếp cận với máy thu. Vì vậy, sự kiện này chỉ hữu ích để hiển thị một thanh tiến bộ tốt đẹp. Để tiếp tục tải lên, chúng ta cần biết chính xác số lượng byte nhận được bởi máy chủ. Và chỉ có máy chủ có thể nói điều đó.

Thuật toán 1. Đầu tiên, chúng tôi tạo ID tệp, để xác định duy nhất tệp mà chúng tôi tải lên, ví dụ:

Đặt fileId = file.name + '-' + file.size + '-' + + file.LastModifiedDate;

Điều đó cần thiết để tải lên sơ yếu lý lịch, để nói với máy chủ những gì chúng tôi tiếp tục. 2. Gửi yêu cầu đến máy chủ, hỏi nó đã có bao nhiêu byte, như thế này:

let anprwain = Await fetch ['status', {tiêu đề: {'x-file-id': fileId}}];

// Máy chủ có nhiều byte cho phép startbyte = +đang chờ phản hồi.text [];

Điều này giả định rằng máy chủ theo dõi tệp tải lên bằng tiêu đề ID-File-ID. Nên được thực hiện ở phía máy chủ. 3. Sau đó, chúng ta có thể sử dụng lát Blob Phương thức để gửi tệp từ StartByte: XHR.open ["Post", "Tải lên", Đúng]; // Gửi ID tệp, để máy chủ biết tệp nào để tiếp tục XHR.SetRequestHeader ['X-File-id', FileID]; // Gửi byte mà chúng tôi đang tiếp tục, vì vậy máy chủ biết rằng chúng tôi đang tiếp tục XHR.SetRequestHeader ['X-Start-Byte', StartByte]; xhr.upload.onProTHER = [e] => {console.log [`Đã tải lên $ {startByte + e.Aloaded} của $ {startByte + e.total}`]; }; // Tệp có thể là từ input.files [0] hoặc một nguồn khác xhr.send [file.slice [startbyte]];

Ở đây chúng tôi gửi cho máy chủ cả ID tệp dưới dạng x-file-id, vì vậy nó biết tệp nào chúng tôi đang tải lên và byte bắt đầu là X-start-byte, vì vậy nó biết chúng tôi không tải lên ban đầu, nhưng lại tiếp tục. Máy chủ nên kiểm tra các bản ghi của nó và nếu có tải lên tệp đó và kích thước được tải lên hiện tại chính xác là x-start-byte, thì hãy nối dữ liệu vào nó. Tại đây, bản demo với cả mã máy khách và máy chủ, được viết trên Node.js. Nó chỉ hoạt động một phần trên trang web này, vì Node.js đứng sau một máy chủ khác có tên Nginx, các bộ đệm tải lên, chuyển chúng đến Node.js khi hoàn thành hoàn toàn. Nhưng bạn có thể tải xuống và chạy cục bộ để trình diễn đầy đủ: //plnkr.co/edit/uwihsrek1zb1nhjxdjc9?p=preview

Như bạn có thể thấy, các phương thức mạng hiện đại gần với các trình quản lý tệp trong khả năng của họ - kiểm soát các tiêu đề, chỉ báo tiến trình, gửi các phần tệp, v.v.

Bỏ phiếu dài cuộc bỏ phiếu dài là cách đơn giản nhất để có kết nối liên tục với máy chủ, điều đó không sử dụng bất kỳ giao thức cụ thể nào như WebSocket hoặc các sự kiện phía máy chủ. Rất dễ thực hiện, nó cũng đủ tốt trong rất nhiều trường hợp.

Bỏ phiếu thường xuyên Cách đơn giản nhất để có được thông tin mới từ máy chủ là bỏ phiếu. Đó là, các yêu cầu định kỳ đến máy chủ: Xin chào, tôi ở đây, bạn có bất kỳ thông tin nào cho tôi không? Ví dụ, một lần trong 10 giây. Đáp lại, máy chủ trước tiên hãy thông báo rằng máy khách đang trực tuyến và thứ hai - gửi một gói tin nhắn mà nó nhận được cho đến thời điểm đó. Điều đó hoạt động, nhưng có những nhược điểm: 1. Tin nhắn được truyền với độ trễ lên đến 10 giây. 2. Ngay cả khi không có tin nhắn, máy chủ được ném bom với các yêu cầu cứ sau 10 giây. Đó là một tải khá để xử lý cho phụ trợ, nói về hiệu suất khôn ngoan. Vì vậy, nếu chúng tôi nói về một dịch vụ rất nhỏ, cách tiếp cận có thể khả thi. Nhưng nói chung, nó cần một sự cải thiện.

Bỏ phiếu lâu dài - là một cách tốt hơn để bỏ phiếu cho máy chủ. Nó cũng rất dễ thực hiện và cung cấp tin nhắn mà không bị chậm trễ. Lưu lượng: 1. Một yêu cầu được gửi đến máy chủ. 2. Máy chủ không đóng kết nối cho đến khi nó có tin nhắn. 3. Khi một thông báo xuất hiện - máy chủ phản hồi yêu cầu với dữ liệu. 4. Trình duyệt thực hiện một yêu cầu mới ngay lập tức. Tình huống khi trình duyệt gửi yêu cầu và có kết nối đang chờ xử lý với máy chủ, là tiêu chuẩn cho phương thức này. Chỉ khi một tin nhắn được gửi, kết nối được thiết lập lại.

Ngay cả khi kết nối bị mất, vì, nói, một lỗi mạng, trình duyệt ngay lập tức gửi một yêu cầu mới. Bản phác thảo mã phía máy khách:

Hàm async Đăng ký [] {let respession = Await fetch ["/đăng ký"]; if [respons.status == 502] {// Thời gian chờ kết nối, xảy ra khi kết nối đang chờ xử lý quá dài // hãy kết nối lại đang chờ đăng ký []; } other if [respession.status! = 200] {// hiển thị lỗi showMessage [respession.statustext]; // Kết nối lại trong một giây chờ đợi lời hứa mới [resolve => setTimeout [resolve, 1000]]; đang chờ đăng ký []; } other {// có tin nhắn LET tin nhắn = đang chờ phản hồi.text []; showmessage [tin nhắn]; đang chờ đăng ký []; } } đặt mua[];

Hàm đăng ký [] tạo ra một lần tìm nạp, sau đó chờ phản hồi, xử lý nó và tự gọi lại.

Máy chủ sẽ ổn với nhiều kết nối đang chờ xử lý

Kiến trúc máy chủ phải có khả năng làm việc với nhiều kết nối đang chờ xử lý. Một số kiến ​​trúc máy chủ chạy một quá trình trên mỗi kết nối. Đối với nhiều kết nối sẽ có nhiều quy trình và mỗi quá trình mất rất nhiều bộ nhớ. Vì vậy, nhiều kết nối chỉ tiêu thụ tất cả. Đó thường là trường hợp cho các phụ trợ được viết bằng Php, ngôn ngữ Ruby, nhưng về mặt kỹ thuật không phải là một ngôn ngữ, mà là vấn đề thực hiện. Các phụ trợ được viết bằng Node.js thường không có vấn đề như vậy.

Bản demo: Một cuộc trò chuyện ở đây, một bản demo: //plnkr.co/edit/p0vxeg5miwpxpjq7lwdr?p=preview

Khu vực sử dụng bỏ phiếu dài hoạt động tuyệt vời trong các tình huống khi tin nhắn rất hiếm. Nếu các tin nhắn đến rất thường xuyên, thì biểu đồ yêu cầu các tin nhắn nhận được, được vẽ ở trên, trở nên giống như cưa. Mỗi tin nhắn là một yêu cầu riêng biệt, được cung cấp với các tiêu đề, chi phí xác thực, v.v. Vì vậy, trong trường hợp này, một phương thức khác được ưa thích, chẳng hạn như WebSocket hoặc máy chủ đã gửi các sự kiện.

WebSocket Giao thức WebSocket, được mô tả trong đặc tả RFC 6455  cung cấp một cách để trao đổi dữ liệu giữa trình duyệt và máy chủ thông qua kết nối liên tục. Khi kết nối WebSocket được thiết lập, cả máy khách và máy chủ có thể gửi dữ liệu cho nhau. WebSocket đặc biệt tuyệt vời cho các dịch vụ yêu cầu trao đổi dữ liệu liên tục, ví dụ: Trò chơi trực tuyến, hệ thống giao dịch thời gian thực, như vậy.

Một ví dụ đơn giản để mở kết nối WebSocket, chúng ta cần tạo WebSocket mới bằng giao thức đặc biệt WS trong URL: LET SOCKET = new WebSocket ["WS: //javascript.info"];

Ngoài ra còn có giao thức WSS: // được mã hóa. Nó giống như HTTPS cho WebSockets.

Luôn thích WSS: //

WSS: // Giao thức không chỉ được mã hóa mà còn đáng tin cậy hơn. Điều đó bởi vì dữ liệu WS: // không được mã hóa, có thể nhìn thấy cho bất kỳ trung gian nào. Các máy chủ proxy cũ không biết về WebSocket, họ có thể thấy các tiêu đề kỳ lạ của người Hồi giáo và hủy bỏ kết nối. Mặt khác, WSS: // là WebSocket qua TLS, [giống như HTTPS là HTTP trên TLS], lớp bảo mật vận chuyển mã hóa dữ liệu tại người gửi và giải mã tại máy thu, do đó nó được mã hóa thông qua các prox. Họ có thể nhìn thấy những gì bên trong và để nó qua.

Khi ổ cắm được tạo, chúng ta nên nghe các sự kiện trên đó. Có hoàn toàn 4 sự kiện: ●

Mở - Kết nối được thiết lập,

tin nhắn - dữ liệu nhận được,

tin nhắn - dữ liệu nhận được,

tin nhắn - dữ liệu nhận được,

Lỗi - lỗi WebSocket,

Đóng - Kết nối đóng.

Và nếu chúng tôi muốn gửi một cái gì đó, thì socket.send [dữ liệu] sẽ làm điều đó. Đây là một ví dụ:

Đặt socket = new WebSocket ["WSS: //javascript.info/article/websocket/demo/hello"]; socket.onopen = function [e] {alert ["[open] kết nối được thiết lập, gửi -> server"]; Socket.Send ["Tên tôi là John"]; }; socket.onmessage = function [event] {alert [`[message] dữ liệu nhận được: $ {event.data} {// event.data là một chuỗi [nếu văn bản] hoặc mảng

Tỷ lệ giới hạn Tưởng tượng, ứng dụng của chúng tôi đang tạo ra rất nhiều dữ liệu để gửi. Nhưng người dùng có kết nối mạng chậm, có thể trên điện thoại di động, bên ngoài một thành phố. Chúng ta có thể gọi socket.send [dữ liệu] nhiều lần. Nhưng dữ liệu sẽ được đệm [lưu trữ] trong bộ nhớ và chỉ được gửi nhanh như tốc độ mạng cho phép. Các thuộc tính của ổ cắm.bufferedamount lưu trữ số lượng byte được đệm tại thời điểm này, chờ được gửi qua mạng. Chúng tôi có thể kiểm tra nó để xem liệu ổ cắm có thực sự có sẵn để truyền hay không.

. , 100];

tin nhắn - dữ liệu nhận được,

tin nhắn - dữ liệu nhận được,

Lỗi - lỗi WebSocket,

Đóng - Kết nối đóng.

Và nếu chúng tôi muốn gửi một cái gì đó, thì socket.send [dữ liệu] sẽ làm điều đó. Đây là một ví dụ:

tin nhắn - dữ liệu nhận được,

Lỗi - lỗi WebSocket,

Đóng - Kết nối đóng.

1009 - Thông điệp quá lớn để xử lý,

1011 - Lỗi không mong muốn trên máy chủ,

…và như thế.

Vui lòng tham khảo RFC6455, §7.4.1

cho danh sách đầy đủ.

Mã WebSocket có phần giống như mã HTTP, nhưng khác nhau. Cụ thể, bất kỳ mã nào dưới 1000 đều được bảo lưu, sẽ có một lỗi nếu chúng tôi cố gắng đặt mã đó. // Trong trường hợp kết nối bị hỏng socket.onclose = event => {// event.code === 1006 // event.reason === "" // event.wasclean === false [không có khung đóng]};

Trạng thái kết nối để có trạng thái kết nối, ngoài ra còn có thuộc tính ổ cắm.

0 - kết nối ": kết nối chưa được thiết lập,

1 - “Mở”: Giao tiếp,

2 - “đóng cửa”: kết nối đang kết thúc,

3 - Đóng khép kín: Kết nối được đóng lại.

Ví dụ trò chuyện Hãy để xem xét một ví dụ trò chuyện bằng cách sử dụng API WebSocket và Node.js WebSocket mô -đun //github.com/websockets/ws. HTML: Có một để gửi tin nhắn và một tin nhắn đến:

JavaScript cũng đơn giản. Chúng tôi mở một ổ cắm, sau đó gửi biểu mẫu - Socket.Send [tin nhắn], trên tin nhắn đến - nối nó vào div#message: hãy để socket = new WebSocket ["WSS: //javascript.info/article/websocket/chat/ws "]; // Gửi tin nhắn từ tài liệu biểu mẫu.forms.publish.onsubmit = function [] {let outguidMessage = this.message.value; Ổ cắm.send [OffidingMessage]; trả lại sai; }; // Hiển thị tin nhắn trong div#message socket.onmessage = function [event] {let tin nhắn = event.data; Đặt messageLem = document.createEement ['div']; messageLem.TextContent = message; document.getEuityById ['tin nhắn']. prepend [messageLem]; }

Mã phía máy chủ là một chút ngoài phạm vi của chúng tôi ở đây. Chúng tôi sử dụng API WebSocket trình duyệt, một máy chủ có thể có một thư viện khác. Tuy nhiên, nó cũng có thể khá đơn giản. Chúng tôi sẽ sử dụng Node.js với //github.com/websockets/ws  Mô -đun cho WebSockets.

Thuật toán phía máy chủ sẽ là: 1. Tạo khách hàng = new set []-một bộ ổ cắm. 2 3. Khi một tin nhắn nhận được: Lặp lại khách hàng và gửi nó cho mọi người. 4. Khi kết nối được đóng: client.delete [ổ cắm]. const ws = yêu cầu mới ['ws']; const wss = new Ws.server [{noserver: true}]; const client = new set []; http.createserver [[req, res] => {// Ở đây chúng tôi chỉ xử lý các kết nối websocket // trong dự án thực sự, chúng tôi sẽ có một số mã khác herre để xử lý yêu cầu không websocket .alloc [0], onsocketConnect];}]; hàm onSocketConnect [ws] {client.add [ws]; ws.on ['message', function [message] {message = message.slice [0, 50]; // Độ dài tin nhắn tối đa sẽ là 50 cho [hãy để khách hàng của máy khách] {client.send [tin nhắn];}}] ; ws.on ['Đóng', function [] {client.delete [ws];}]; }

Đây là ví dụ làm việc: Gửi

Bạn cũng có thể tải xuống nó [nút trên bên phải trong iframe] và chạy cục bộ. Chỉ cần không quên cài đặt Node.js và NPM Cài đặt WS trước khi chạy.

Bản tóm tắt

WebSocket là một cách hiện đại để có các kết nối máy chủ trình duyệt liên tục. ●

WebSockets don lồng có những hạn chế về nguồn gốc chéo.

Chúng được hỗ trợ tốt trong trình duyệt.

Có thể gửi/nhận chuỗi và dữ liệu nhị phân.

API rất đơn giản. Phương pháp: ●

socket.send [dữ liệu],

Ổ cắm.close [[CODE], [Lý do]].

Sự kiện: ●

mở ,

thông điệp ,

lỗi ,

gần .

WebSocket tự nó không bao gồm kết nối lại, xác thực và nhiều cơ chế cấp cao khác. Vì vậy, có các thư viện máy khách/máy chủ cho điều đó và nó cũng có thể thực hiện các khả năng này theo cách thủ công. Đôi khi, để tích hợp WebSocket vào dự án hiện có, mọi người chạy WebSocket Server song song với máy chủ HTTP chính và họ chia sẻ một cơ sở dữ liệu duy nhất. Yêu cầu để WebSocket Sử dụng WSS: //ws.site.com, một tên miền phụ dẫn đến máy chủ WebSocket, trong khi //site.com đi đến http-server chính. Chắc chắn, những cách tích hợp khác cũng có thể. Nhiều máy chủ [như Node.js] có thể hỗ trợ cả giao thức HTTP và WebSocket.

Máy chủ đã gửi các sự kiện về các sự kiện server-sent  Thông số kỹ thuật mô tả một sự kiện lớp học tích hợp, giữ kết nối với máy chủ và cho phép nhận các sự kiện từ nó. Tương tự như WebSocket, kết nối là dai dẳng. Nhưng có một số khác biệt quan trọng: WebSocket

Sự kiện

Bi-Directional: Cả máy khách và máy chủ đều có thể trao đổi tin nhắn

Một chiều: Chỉ máy chủ gửi dữ liệu

Dữ liệu nhị phân và văn bản

Chỉ văn bản

Giao thức WebSocket

HTTP thường xuyên

Eventsource là một cách giao tiếp ít mạnh mẽ hơn với máy chủ hơn WebSocket. Tại sao một người nên sử dụng nó? Lý do chính: nó đơn giản hơn. Trong nhiều ứng dụng, sức mạnh của WebSocket hơi quá nhiều. Chúng ta cần nhận một luồng dữ liệu từ máy chủ: có thể tin nhắn trò chuyện hoặc giá thị trường hoặc bất cứ điều gì. Đó là những gì mà sự kiện là giỏi. Ngoài ra, nó hỗ trợ Autoreconnect, một cái gì đó chúng ta cần thực hiện thủ công với WebSocket. Bên cạnh đó, nó là một HTTP cũ đơn giản, không phải là một giao thức mới.

Nhận tin nhắn để bắt đầu nhận tin nhắn, chúng tôi chỉ cần tạo sự kiện mới [URL]. Trình duyệt sẽ kết nối với URL và giữ cho kết nối mở, chờ đợi các sự kiện. Máy chủ cần phản hồi với Status 200 và loại nội dung tiêu đề: luồng văn bản/sự kiện, sau đó giữ kết nối và ghi tin nhắn vào nó ở định dạng đặc biệt, như thế này:

Dữ liệu: Tin nhắn 1 Dữ liệu: Tin nhắn 2 Dữ liệu: Tin nhắn 3 Dữ liệu: của hai dòng

Một văn bản tin nhắn đi theo dữ liệu:, không gian sau dấu chấm phẩy là tùy chọn.

Một văn bản tin nhắn đi theo dữ liệu:, không gian sau dấu chấm phẩy là tùy chọn.

Một văn bản tin nhắn đi theo dữ liệu:, không gian sau dấu chấm phẩy là tùy chọn.

Tin nhắn được phân định với các đường đứt đường đôi \ n \ n.

Để gửi một dòng phá vỡ \ n, chúng ta có thể ngay lập tức thêm một dữ liệu: [tin nhắn thứ 3 ở trên].

Trong thực tế, các thông điệp phức tạp thường được gửi mã hóa JSON, do đó, các lần phá vỡ được mã hóa trong chúng. Ví dụ:

Dữ liệu: {"người dùng": "John", "tin nhắn": "dòng thứ nhất \ n dòng thứ hai"}

Vì vậy, chúng tôi có thể giả định rằng một dữ liệu: lưu chính xác một tin nhắn. Đối với mỗi tin nhắn như vậy, sự kiện tin nhắn được tạo:

Let Eventsource = new Eventsource ["/sự kiện/đăng ký"]; sự kiện // sẽ đăng nhập 3 lần cho luồng dữ liệu ở trên}; // hoặc Eventsource.AddeventListener ['Tin nhắn', ...]

Yêu cầu các miền chéo Eventsource hỗ trợ các yêu cầu có nguồn gốc chéo, như tìm nạp bất kỳ phương pháp kết nối mạng nào khác. Chúng tôi có thể sử dụng bất kỳ URL nào:

Đặt nguồn = sự kiện mới ["//another-site.com/events"];

Máy chủ từ xa sẽ nhận được tiêu đề gốc và phải trả lời với accessControl-chowally-origin để tiến hành. Để vượt qua thông tin đăng nhập, chúng tôi nên đặt tùy chọn bổ sung với các điều khoản, như thế này:

Đặt nguồn = sự kiện mới ["//another-site.com/events", {withcredentials: true}];

Vui lòng xem chương tìm nạp: Yêu cầu có nguồn gốc chéo để biết thêm chi tiết về các tiêu đề Crossdomain.

Kết nối lại khi tạo, sự kiện mới kết nối với máy chủ và nếu kết nối bị hỏng - kết nối lại. Điều đó rất thuận tiện, vì chúng tôi không phải quan tâm đến nó. Có một độ trễ nhỏ giữa các kết nối lại, một vài giây theo mặc định. Máy chủ có thể đặt độ trễ được đề xuất bằng cách sử dụng thử lại: phản hồi [tính bằng mili giây]:

Một văn bản tin nhắn đi theo dữ liệu:, không gian sau dấu chấm phẩy là tùy chọn.

Tin nhắn được phân định với các đường đứt đường đôi \ n \ n.

Để gửi một dòng phá vỡ \ n, chúng ta có thể ngay lập tức thêm một dữ liệu: [tin nhắn thứ 3 ở trên].

Trong thực tế, các thông điệp phức tạp thường được gửi mã hóa JSON, do đó, các lần phá vỡ được mã hóa trong chúng. Ví dụ:

Dữ liệu: {"người dùng": "John", "tin nhắn": "dòng thứ nhất \ n dòng thứ hai"}

Vì vậy, chúng tôi có thể giả định rằng một dữ liệu: lưu chính xác một tin nhắn. Đối với mỗi tin nhắn như vậy, sự kiện tin nhắn được tạo:

Let Eventsource = new Eventsource ["/sự kiện/đăng ký"]; sự kiện // sẽ đăng nhập 3 lần cho luồng dữ liệu ở trên}; // hoặc Eventsource.AddeventListener ['Tin nhắn', ...]

Yêu cầu các miền chéo Eventsource hỗ trợ các yêu cầu có nguồn gốc chéo, như tìm nạp bất kỳ phương pháp kết nối mạng nào khác. Chúng tôi có thể sử dụng bất kỳ URL nào:

Đặt nguồn = sự kiện mới ["//another-site.com/events"];

Máy chủ từ xa sẽ nhận được tiêu đề gốc và phải trả lời với accessControl-chowally-origin để tiến hành. Để vượt qua thông tin đăng nhập, chúng tôi nên đặt tùy chọn bổ sung với các điều khoản, như thế này:

Để gửi một dòng phá vỡ \ n, chúng ta có thể ngay lập tức thêm một dữ liệu: [tin nhắn thứ 3 ở trên].

Trong thực tế, các thông điệp phức tạp thường được gửi mã hóa JSON, do đó, các lần phá vỡ được mã hóa trong chúng. Ví dụ:

Dữ liệu: {"người dùng": "John", "tin nhắn": "dòng thứ nhất \ n dòng thứ hai"}

Vì vậy, chúng tôi có thể giả định rằng một dữ liệu: lưu chính xác một tin nhắn. Đối với mỗi tin nhắn như vậy, sự kiện tin nhắn được tạo:

Let Eventsource = new Eventsource ["/sự kiện/đăng ký"]; sự kiện // sẽ đăng nhập 3 lần cho luồng dữ liệu ở trên}; // hoặc Eventsource.AddeventListener ['Tin nhắn', ...]

Yêu cầu các miền chéo Eventsource hỗ trợ các yêu cầu có nguồn gốc chéo, như tìm nạp bất kỳ phương pháp kết nối mạng nào khác. Chúng tôi có thể sử dụng bất kỳ URL nào:

Đặt nguồn = sự kiện mới ["//another-site.com/events"];

Máy chủ từ xa sẽ nhận được tiêu đề gốc và phải trả lời với accessControl-chowally-origin để tiến hành. Để vượt qua thông tin đăng nhập, chúng tôi nên đặt tùy chọn bổ sung với các điều khoản, như thế này:

Đặt nguồn = sự kiện mới ["//another-site.com/events", {withcredentials: true}];

Vui lòng xem chương tìm nạp: Yêu cầu có nguồn gốc chéo để biết thêm chi tiết về các tiêu đề Crossdomain.

Kết nối lại khi tạo, sự kiện mới kết nối với máy chủ và nếu kết nối bị hỏng - kết nối lại. Điều đó rất thuận tiện, vì chúng tôi không phải quan tâm đến nó. Có một độ trễ nhỏ giữa các kết nối lại, một vài giây theo mặc định. Máy chủ có thể đặt độ trễ được đề xuất bằng cách sử dụng thử lại: phản hồi [tính bằng mili giây]:

Thử lại: 15000 Dữ liệu: Xin chào, tôi đặt độ trễ kết nối lại thành 15 giây

Việc thử lại: có thể đến cả hai cùng với một số dữ liệu hoặc là một thông điệp độc lập. Trình duyệt nên chờ đợi nhiều trước khi kết nối lại. Nếu kết nối mạng bị mất, trình duyệt có thể đợi cho đến khi nó được khôi phục, và sau đó thử lại. ●

Ví dụ đầy đủ ở đây, máy chủ gửi tin nhắn có 1, 2, 3, sau đó tạm biệt và phá vỡ kết nối. Sau đó trình duyệt tự động kết nối lại. //plnkr.co/edit/lmodpfhjdd3yirrghksf?p=preview

Tóm tắt đối tượng Truyền thông của Eventsource với máy chủ. Nó thiết lập một kết nối liên tục và cho phép máy chủ gửi tin nhắn qua nó. Nó cung cấp: ●

Tự động kết nối lại, với thời gian chờ thử lại có thể điều chỉnh. ID tin nhắn để tiếp tục các sự kiện, mã định danh cuối cùng được gửi trong tiêu đề ID sự kiện cuối cùng. Trạng thái hiện tại nằm trong thuộc tính ReadyState.

Điều đó làm cho Eventsource trở thành một sự thay thế khả thi cho WebSocket, vì nó Low Lowlevel hơn và thiếu các tính năng này. Trong nhiều ứng dụng thực tế, sức mạnh của sự kiện là vừa đủ. Được hỗ trợ trong tất cả các trình duyệt hiện đại [không phải IE]. Cú pháp là:

Đặt nguồn = sự kiện mới [url, [thông tin xác thực]];

Đối số thứ hai chỉ có một tùy chọn có thể: {withcredentials: true}, nó cho phép gửi thông tin đăng nhập từ miền chéo. Tổng thể bảo mật miền chéo cũng giống như đối với các phương thức tìm nạp và các phương thức mạng khác.

Thuộc tính của một đối tượng OVENTOURCE RADERSTATE Trạng thái kết nối hiện tại: hoặc ESTENSOURCE.CONNECTING [= 0], eventource.open [= 1] hoặc eventource.closed [= 2]. LastEventid id nhận được cuối cùng. Khi kết nối lại, trình duyệt gửi nó trong tiêu đề LastEvent-id.

Các phương thức đóng [] đóng kết nối kết nối.

Thông báo sự kiện nhận được, dữ liệu nằm trong event.data. Mở kết nối được thiết lập. Lỗi trong trường hợp có lỗi, bao gồm cả kết nối bị mất [sẽ tự động kết nối lại] và lỗi gây tử vong. Chúng tôi có thể kiểm tra ReadyState để xem liệu kết nối lại có được thử không. Máy chủ có thể đặt một tên sự kiện tùy chỉnh trong sự kiện:. Những sự kiện như vậy nên được xử lý bằng cách sử dụng AddEventListener, không BẬT.

Định dạng phản hồi máy chủ Máy chủ gửi tin nhắn, được phân định bởi \ n \ n. Các bộ phận tin nhắn có thể bắt đầu bằng: ●

Tự động kết nối lại, với thời gian chờ thử lại có thể điều chỉnh. ID tin nhắn để tiếp tục các sự kiện, mã định danh cuối cùng được gửi trong tiêu đề ID sự kiện cuối cùng. Trạng thái hiện tại nằm trong thuộc tính ReadyState.

Tự động kết nối lại, với thời gian chờ thử lại có thể điều chỉnh. ID tin nhắn để tiếp tục các sự kiện, mã định danh cuối cùng được gửi trong tiêu đề ID sự kiện cuối cùng. Trạng thái hiện tại nằm trong thuộc tính ReadyState.

Điều đó làm cho Eventsource trở thành một sự thay thế khả thi cho WebSocket, vì nó Low Lowlevel hơn và thiếu các tính năng này. Trong nhiều ứng dụng thực tế, sức mạnh của sự kiện là vừa đủ. Được hỗ trợ trong tất cả các trình duyệt hiện đại [không phải IE]. Cú pháp là:

Đặt nguồn = sự kiện mới [url, [thông tin xác thực]];

Đối số thứ hai chỉ có một tùy chọn có thể: {withcredentials: true}, nó cho phép gửi thông tin đăng nhập từ miền chéo. Tổng thể bảo mật miền chéo cũng giống như đối với các phương thức tìm nạp và các phương thức mạng khác.

Thuộc tính của một đối tượng OVENTOURCE RADERSTATE Trạng thái kết nối hiện tại: hoặc ESTENSOURCE.CONNECTING [= 0], eventource.open [= 1] hoặc eventource.closed [= 2]. LastEventid id nhận được cuối cùng. Khi kết nối lại, trình duyệt gửi nó trong tiêu đề LastEvent-id.

Các phương thức đóng [] đóng kết nối kết nối.

Thông báo sự kiện nhận được, dữ liệu nằm trong event.data. Mở kết nối được thiết lập. Lỗi trong trường hợp có lỗi, bao gồm cả kết nối bị mất [sẽ tự động kết nối lại] và lỗi gây tử vong. Chúng tôi có thể kiểm tra ReadyState để xem liệu kết nối lại có được thử không. Máy chủ có thể đặt một tên sự kiện tùy chỉnh trong sự kiện:. Những sự kiện như vậy nên được xử lý bằng cách sử dụng AddEventListener, không BẬT.

Định dạng phản hồi máy chủ Máy chủ gửi tin nhắn, được phân định bởi \ n \ n. Các bộ phận tin nhắn có thể bắt đầu bằng: ●

Giới hạn

Có một vài hạn chế: ●

Tên = cặp giá trị, sau khi mã hóa, không được vượt quá 4kb. Vì vậy, chúng tôi có thể lưu trữ bất cứ thứ gì lớn trong cookie. Tổng số cookie trên mỗi miền được giới hạn ở khoảng 20+, giới hạn chính xác phụ thuộc vào trình duyệt.

Cookie có một số tùy chọn, nhiều trong số chúng rất quan trọng và nên được thiết lập. Các tùy chọn được liệt kê sau khóa = giá trị, được phân định bởi; , như thế này: document.cookie = "user = john; path =/; hết hạn = Tue, ngày 19 tháng 1 năm 2038 03:14:07 GMT"

đường dẫn

Tên = cặp giá trị, sau khi mã hóa, không được vượt quá 4kb. Vì vậy, chúng tôi có thể lưu trữ bất cứ thứ gì lớn trong cookie. Tổng số cookie trên mỗi miền được giới hạn ở khoảng 20+, giới hạn chính xác phụ thuộc vào trình duyệt.

Cookie có một số tùy chọn, nhiều trong số chúng rất quan trọng và nên được thiết lập. Các tùy chọn được liệt kê sau khóa = giá trị, được phân định bởi; , như thế này: document.cookie = "user = john; path =/; hết hạn = Tue, ngày 19 tháng 1 năm 2038 03:14:07 GMT"

đường dẫn

đường dẫn =/mypath

Tiền tố đường dẫn URL, cookie sẽ có thể truy cập được cho các trang dưới đường dẫn đó. Phải là tuyệt đối. Theo mặc định, nó là đường dẫn hiện tại. Nếu cookie được đặt với Path = /admin, thì nó có thể nhìn thấy tại các trang /quản trị viên và /quản trị viên /một cái gì đó, nhưng không phải tại /home hoặc /adminpage. Thông thường, chúng ta nên đặt đường dẫn đến gốc: đường dẫn =/ để làm cho cookie có thể truy cập được từ tất cả các trang trang web.

Miền ●

Domain = site.com

Một miền mà cookie có thể truy cập được. Trong thực tế mặc dù, có những hạn chế. Chúng tôi có thể thiết lập bất kỳ miền nào. Theo mặc định, một cookie chỉ có thể truy cập tại miền đặt nó. Vì vậy, nếu cookie được đặt bởi Site.com, chúng tôi đã giành được nó. Nhưng những gì mà khó khăn hơn, chúng tôi cũng đã giành được cookie tại một diễn đàn phụ .site.com! // tại trang web.com document.cookie = "user = john" // tại forum.site.com ALERT [document.cookie]; // Không có người dùng

Không có cách nào để cho một cookie có thể truy cập từ tên miền cấp 2 khác, vì vậy khác.com sẽ không bao giờ nhận được một bộ cookie tại Site.com. Đó là một hạn chế an toàn, để cho phép chúng tôi lưu trữ dữ liệu nhạy cảm trong cookie, chỉ có sẵn trên một trang web. Nhưng nếu chúng tôi muốn cho phép các tên miền phụ như Forum.site.com có ​​được cookie, thì điều đó có thể. Khi đặt cookie tại site.com, chúng ta nên đặt tùy chọn miền một cách rõ ràng thành tên miền gốc: domain = site.com: // at site.com // Làm cho cookie có thể truy cập trên bất kỳ tên miền phụ nào *.site.com: document.cookie = "user = john; domain = site.com" // sau

// tại Forum.site.com Cảnh báo [Document.cookie]; // Có người dùng cookie = John

Vì lý do lịch sử, domain = .site.com [một dấu chấm trước trang.com] cũng hoạt động theo cùng một cách, cho phép truy cập vào cookie từ các tên miền phụ. Đó là một ký hiệu cũ, nên được sử dụng nếu chúng ta cần hỗ trợ các trình duyệt rất cũ. Vì vậy, tùy chọn miền cho phép làm cho một cookie có thể truy cập tại các tên miền phụ.

Hết hạn, theo mặc định, nếu một cookie không có một trong những tùy chọn này, nó sẽ biến mất khi trình duyệt bị đóng. Những cookie như vậy được gọi là cookie phiên của phiên bản, để cho cookie tồn tại trong trình duyệt đóng, chúng ta có thể đặt tùy chọn hết hạn hoặc độ tuổi tối đa. ●

hết hạn = Tue, ngày 19 tháng 1 năm 2038 03:14:07 GMT

Ngày hết hạn cookie, khi trình duyệt sẽ tự động xóa nó. Ngày phải chính xác ở định dạng này, trong gmt múi giờ. Chúng ta có thể sử dụng Date.ToutCString để có được nó. Chẳng hạn, chúng ta có thể đặt cookie hết hạn sau 1 ngày:

. date = date.toutcString []; document.cookie = "user = john; hết hạn =" + ngày;

Nếu chúng ta đặt hết hạn đến một ngày trong quá khứ, cookie sẽ bị xóa. ●

Max-Age = 3600

Một giải pháp thay thế để hết hạn, chỉ định hết hạn cookie trong vài giây kể từ thời điểm hiện tại. Nếu không hoặc âm, thì cookie sẽ bị xóa:

// cookie sẽ chết +1 giờ kể từ bây giờ tài liệu.cookie = "user = john; max-age = 3600"; // Xóa cookie [hãy để nó hết hạn ngay bây giờ] tài liệu.cookie = "user = john; max-age = 0";

an toàn ●

chắc chắn

Cookie chỉ nên được chuyển qua HTTPS. Theo mặc định, nếu chúng tôi đặt cookie tại //site.com, thì nó cũng xuất hiện tại //site.com và ngược lại. Đó là, cookie dựa trên miền, chúng không phân biệt giữa các giao thức. Với tùy chọn này, nếu cookie được đặt bởi //site.com, thì nó không xuất hiện khi cùng một trang web được HTTP truy cập, như //site.com. Vì vậy, nếu một cookie có nội dung nhạy cảm không bao giờ được gửi qua HTTP không được mã hóa, thì cờ là điều đúng.

Rằng gọi là một cuộc tấn công giả mạo yêu cầu chéo [hoặc XSRF]. Các ngân hàng thực sự được bảo vệ khỏi nó tất nhiên. Tất cả các biểu mẫu được tạo bởi Bank.com đều có một trường đặc biệt, vì vậy được gọi là mã thông báo bảo vệ XS XSRF, rằng một trang xấu không thể tạo ra, cũng không phải là trích xuất từ ​​một trang từ xa [nó có thể gửi một biểu mẫu ở đó, nhưng không thể nhận được dữ liệu trở lại]. Nhưng điều đó cần có thời gian để thực hiện: Chúng tôi cần đảm bảo rằng mọi biểu mẫu đều có trường mã thông báo và chúng tôi cũng phải kiểm tra tất cả các yêu cầu.

Nhập tùy chọn Cookie Samesite Tùy chọn Cookie Samesite cung cấp một cách khác để bảo vệ khỏi các cuộc tấn công đó, theo lý thuyết] không nên yêu cầu các mã thông báo bảo vệ XSRF. Nó có hai giá trị có thể: ●

Samesite = Strict [giống như Samesite không có giá trị]

Một cookie với SameSite = Strict không bao giờ được gửi nếu người dùng đến từ bên ngoài trang web. Nói cách khác, cho dù người dùng theo liên kết từ thư của họ hoặc gửi biểu mẫu từ Evil.com hay bất kỳ hoạt động nào có nguồn gốc từ miền khác, cookie không được gửi. Nếu cookie xác thực có tùy chọn Samesite, thì XSRF Attack không có cơ hội để thành công, bởi vì việc gửi từ Evil.com không có cookie. Vì vậy, Bank.com sẽ không nhận ra người dùng và sẽ không tiến hành thanh toán. Việc bảo vệ khá đáng tin cậy. Chỉ các hoạt động đến từ Bank.com sẽ gửi Cookie SameTeite. Mặc dù, có một sự bất tiện nhỏ. Khi người dùng theo một liên kết hợp pháp đến Bank.com, như từ các ghi chú của chính họ, họ sẽ ngạc nhiên khi Bank.com không nhận ra chúng. Thật vậy, samesite = cookie nghiêm ngặt không được gửi trong trường hợp đó. Chúng tôi có thể làm việc xung quanh điều đó bằng cách sử dụng hai cookie: một cho nhận dạng chung của người dùng, chỉ vì mục đích nói: Hello Hello, John, và một cái khác cho các hoạt động thay đổi dữ liệu với SAMETITE = nghiêm ngặt. Sau đó, một người đến từ bên ngoài trang web sẽ thấy được chào đón, nhưng các khoản thanh toán phải được bắt đầu từ trang web ngân hàng. ●

SAMEMITE = LAX

Một cách tiếp cận thoải mái hơn cũng bảo vệ khỏi XSRF và không phá vỡ trải nghiệm người dùng. Chế độ LAX, giống như nghiêm ngặt, cấm trình duyệt gửi cookie khi đến từ bên ngoài trang web, nhưng thêm một ngoại lệ.

Một cookie samesite = lax được gửi nếu cả hai điều kiện này là đúng: 1. Phương thức HTTP là an toàn [ví dụ: nhận, nhưng không đăng]. Danh sách đầy đủ các phương thức HTTP an toàn nằm trong đặc tả RFC7231. Về cơ bản, đây là những phương pháp nên được sử dụng để đọc, nhưng không viết dữ liệu. Họ không được thực hiện bất kỳ hoạt động thay đổi dữ liệu. Theo một liên kết luôn luôn có được, phương pháp an toàn. 2. Hoạt động thực hiện điều hướng cấp cao nhất [thay đổi URL trong thanh địa chỉ trình duyệt]. Điều đó thường đúng, nhưng nếu điều hướng được thực hiện trong một, thì nó không phải là cấp cao nhất. Ngoài ra, các yêu cầu AJAX không thực hiện bất kỳ điều hướng nào, do đó chúng không phù hợp. Vì vậy, những gì Samesite = LAX thực hiện về cơ bản cho phép một hoạt động phổ biến nhất đến URL để có cookie. Ví dụ. Mở một liên kết trang web từ các ghi chú thỏa mãn các điều kiện này. Nhưng bất cứ điều gì phức tạp hơn, như yêu cầu AJAX từ một trang web khác hoặc một biểu mẫu gửi đều mất cookie. Nếu điều đó tốt cho bạn, thì việc thêm Samesite = LAX có thể sẽ không phá vỡ trải nghiệm người dùng và thêm bảo vệ. Nhìn chung, Samesite là một lựa chọn tuyệt vời, nhưng nó có một nhược điểm quan trọng: ●

Samesite bị bỏ qua [không được hỗ trợ] bởi các trình duyệt cũ, năm 2017 hoặc lâu hơn.

Vì vậy, nếu chúng tôi chỉ dựa vào Samesite để cung cấp bảo vệ, thì các trình duyệt cũ sẽ dễ bị tổn thương. Nhưng chúng tôi chắc chắn có thể sử dụng Samesite cùng với các biện pháp bảo vệ khác, như mã thông báo XSRF, để thêm một lớp phòng thủ bổ sung và sau đó, trong tương lai, khi các trình duyệt cũ chết, chúng tôi có thể có thể loại bỏ mã thông báo XSRF.

Httponly Tùy chọn này không liên quan gì đến JavaScript, nhưng chúng tôi phải đề cập đến nó để hoàn thiện. Máy chủ web sử dụng tiêu đề Set-Cookie để đặt cookie. Và nó có thể đặt tùy chọn httponly. Tùy chọn này cấm mọi quyền truy cập JavaScript vào cookie. Chúng ta có thể thấy cookie như vậy hoặc thao túng nó bằng Document.cookie. Điều đó được sử dụng như một biện pháp phòng ngừa, để bảo vệ khỏi các cuộc tấn công nhất định khi một hacker tiêm mã JavaScript của riêng mình vào một trang và chờ người dùng truy cập trang đó.

Điều đó không thể có được, một tin tặc không thể đưa mã của họ vào trang web của chúng tôi, nhưng có thể có các lỗi cho phép tin tặc làm điều đó. Thông thường, nếu điều đó xảy ra và người dùng sẽ truy cập trang web với mã hacker, thì mã đó sẽ thực thi và truy cập vào tài liệu.cookie với cookie người dùng có chứa thông tin xác thực. Điều đó thật xấu. Nhưng nếu một cookie là httponly, thì Document.cookie không thấy nó, vì vậy nó được bảo vệ.

Phụ lục: Các chức năng cookie ở đây, một tập hợp nhỏ các chức năng để làm việc với cookie, thuận tiện hơn so với sửa đổi thủ công của tài liệu.cookie. Có nhiều thư viện cookie cho điều đó, vì vậy chúng là cho mục đích demo. Làm việc đầy đủ mặc dù.

GetCookie [tên] Cách ngắn nhất để truy cập cookie là sử dụng biểu thức chính quy. Hàm getcookie [tên] Trả về cookie với tên đã cho: // Trả về cookie với tên đã cho, // hoặc không xác định nếu không tìm thấy chức năng getCookie [tên] {let matches = document.cookie.match [regexp mới [" . + "= [[^;]*]"]]; Trở lại các trận đấu? Decodeuricomponent [khớp [1]]: không xác định; }

Ở đây regexp mới được tạo ra một cách linh hoạt, để phù hợp; Tên =. Xin lưu ý rằng giá trị cookie được mã hóa, vì vậy GetCookie sử dụng hàm giải mã tích hợp để giải mã nó.

setCookie [tên, giá trị, tùy chọn] đặt tên cookie thành giá trị đã cho với đường dẫn =/ theo mặc định [có thể được sửa đổi để thêm các mặc định khác]:

hàm setCookie [tên, giá trị, tùy chọn = {}] {tùy chọn = {path: '/', // Thêm các mặc định khác ở đây nếu cần ... tùy chọn};

if [Tùy chọn.Expires.ToutCString] {Tùy chọn.Expires = Tùy chọn.Expires.ToutCString []; } Đặt cập nhậtCookie = encodeUricomponent [name] + "=" + encodeuricomponent [value]; for [Đặt tùy chọnKey trong các tùy chọn] {UpdateDcookie + = ";" + tùy chọnKey; Đặt tùy chọnValue = Tùy chọn [OptionKey]; if [Tùy chọnValue! == true] {UpdateDcookie + = "=" + tùy chọnValue; }} document.cookie = UpdateDcookie; } // Ví dụ về việc sử dụng: setCookie ['người dùng', 'john', {an toàn: true, 'max-age': 3600}];

Deletecookie [tên] Để xóa cookie, chúng ta có thể gọi nó với ngày hết hạn âm:

hàm Deletecookie [tên] {setCookie [tên, "", {'max -age': -1}]}

Cập nhật hoặc xóa phải sử dụng cùng một đường dẫn và miền

Xin lưu ý: Khi chúng tôi cập nhật hoặc xóa cookie, chúng tôi nên sử dụng chính xác cùng một đường dẫn và tùy chọn miền như khi chúng tôi đặt nó. Cùng nhau: Cookie.js.

Phụ lục: Cookie của bên thứ ba Một cookie được gọi là bên thứ ba của bên thứ ba nếu nó được đặt bởi tên miền khác với người dùng đang truy cập. Ví dụ: 1. Một trang tại Site.com tải một biểu ngữ từ một trang web khác:. 2. Cùng với biểu ngữ, máy chủ từ xa tại AD.com có ​​thể đặt tiêu đề Set-Cookie với Cookie như ID = 1234. Cookie như vậy bắt nguồn từ ads.com

Miền và sẽ chỉ hiển thị tại AD.com:

3. Lần tới khi ADS.com được truy cập, máy chủ từ xa sẽ nhận cookie ID và nhận ra người dùng:

4. Điều gì thậm chí còn quan trọng hơn, khi người dùng chuyển từ trang web.com sang một trang khác khác.com cũng có biểu ngữ, sau đó ads.com có ​​cookie, vì nó thuộc về ads.com, do đó nhận ra khách truy cập và theo dõi anh ta Khi anh ấy di chuyển giữa các trang web:

Cookie của bên thứ ba theo truyền thống được sử dụng cho các dịch vụ theo dõi và quảng cáo, do bản chất của chúng. Chúng bị ràng buộc với miền gốc, vì vậy AD.com có ​​thể theo dõi cùng một người dùng giữa các trang web khác nhau, nếu tất cả chúng đều truy cập nó. Đương nhiên, một số người không thích bị theo dõi, vì vậy trình duyệt cho phép vô hiệu hóa các cookie như vậy. Ngoài ra, một số trình duyệt hiện đại sử dụng các chính sách đặc biệt cho các cookie như vậy: ●

Safari hoàn toàn không cho phép cookie của bên thứ ba. Firefox đi kèm với một danh sách đen của người Hồi giáo, các tên miền của bên thứ ba, nơi nó chặn cookie của bên thứ ba.

Xin lưu ý:

Nếu chúng ta tải một tập lệnh từ miền của bên thứ ba, như nhấp vào tôi

Có 4 thuộc tính để mô tả quá trình chuyển đổi CSS: ●

chuyển tiếp-tài sản

Safari hoàn toàn không cho phép cookie của bên thứ ba. Firefox đi kèm với một danh sách đen của người Hồi giáo, các tên miền của bên thứ ba, nơi nó chặn cookie của bên thứ ba.

Safari hoàn toàn không cho phép cookie của bên thứ ba. Firefox đi kèm với một danh sách đen của người Hồi giáo, các tên miền của bên thứ ba, nơi nó chặn cookie của bên thứ ba.

Safari hoàn toàn không cho phép cookie của bên thứ ba. Firefox đi kèm với một danh sách đen của người Hồi giáo, các tên miền của bên thứ ba, nơi nó chặn cookie của bên thứ ba.

Xin lưu ý:

Nếu chúng ta tải một tập lệnh từ miền của bên thứ ba, như nhấp vào tôi

Có 4 thuộc tính để mô tả quá trình chuyển đổi CSS: ●

chuyển tiếp-tài sản

Thời gian chuyển tiếp

Chuyển đổi thời gian chức năng

Transition-Delay

Chúng tôi sẽ bao gồm chúng trong một khoảnh khắc, bây giờ hãy để lưu ý rằng thuộc tính chuyển đổi chung cho phép khai báo chúng cùng nhau theo thứ tự: thời lượng thuộc tính

Độ trễ chức năng thời gian, và cũng làm động nhiều thuộc tính cùng một lúc. Chẳng hạn, nút này hoạt hình cả màu sắc và kích thước phông chữ: Nhấp vào tôi

Thời gian chuyển tiếp

Chuyển đổi thời gian chức năng

Trong ví dụ trên JavaScript thêm lớp. Một phần tử - và hoạt hình bắt đầu:

Stripe.ClassList.Add ['animate'];

Chúng ta cũng có thể bắt đầu nó từ giữa giữa, từ con số chính xác, ví dụ: tương ứng với lần thứ hai hiện tại, sử dụng độ trễ chuyển tiếp tiêu cực. Tại đây nếu bạn nhấp vào chữ số - nó bắt đầu hoạt hình từ lần thứ hai hiện tại: //plnkr.co/edit/zpqja4cejomtapuxpxwe?p=preview

JavaScript thực hiện nó bằng một dòng phụ:

stripe. title = function [] {let sec = new date []. getSeconds [] % 10; // Ví dụ, -3s ở đây bắt đầu hình ảnh động từ sọc thứ hai thứ hai.style.transitiondelay = ' -' + sec + 's'; Stripe.ClassList.Add ['animate']; };

Chức năng thời gian chuyển đổi thời gian chuyển đổi mô tả cách quá trình hoạt hình được phân phối theo thời gian. Nó sẽ bắt đầu chậm và sau đó đi nhanh hoặc vise Versa. Đó là tài sản phức tạp nhất từ ​​cái nhìn đầu tiên. Nhưng nó trở nên rất đơn giản nếu chúng ta dành một chút thời gian cho nó. Thuộc tính đó chấp nhận hai loại giá trị: một đường cong hoặc các bước. Hãy để bắt đầu từ đường cong, vì nó sử dụng thường xuyên hơn.

Đường cong Bezier Chức năng thời gian có thể được đặt thành đường cong Bezier với 4 điểm điều khiển thỏa mãn các điều kiện: 1. Điểm điều khiển đầu tiên: [0,0]. 2. Điểm kiểm soát cuối cùng: [1,1]. 3. Đối với các điểm trung gian, giá trị của x phải nằm trong khoảng 0..1, y có thể là bất cứ điều gì. Cú pháp cho một đường cong bezier trong CSS: hình khối [x2, y2, x3, y3]. Ở đây chúng ta cần chỉ định các điểm kiểm soát thứ 2 và thứ 3, vì điểm thứ nhất được cố định [0,0] và điểm thứ 4 là [1,1]. Hàm thời gian mô tả quá trình hoạt hình đi nhanh như thế nào. ●

Trục X là thời gian: 0-khoảnh khắc bắt đầu, 1-khoảnh khắc cuối cùng của thời gian chuyển tiếp. Trục y chỉ định hoàn thành quá trình: 0 - giá trị bắt đầu của thuộc tính, 1 - giá trị cuối cùng.

Biến thể đơn giản nhất là khi hoạt hình đi đồng đều, với cùng tốc độ tuyến tính. Có thể được chỉ định bởi đường cong hình khối [0, 0, 1, 1]. Đây là cách mà đường cong đó trông như thế nào:

Như chúng ta có thể thấy, nó chỉ là một đường thẳng. Khi thời gian [x] trôi qua, sự hoàn thành [y] của hoạt hình đều đặn từ 0 đến 1. Tàu trong ví dụ dưới đây đi từ trái sang phải với tốc độ vĩnh viễn [nhấp vào nó]: //plnkr.co/edit/bkxxsw1mgxizvhcpucj4?p=preview Việc chuyển đổi CSS dựa trên đường cong đó:. ; Chuyển tiếp: còn lại 5S khối-bezier [0, 0, 1, 1]; / * Bộ JavaScript còn lại thành 450px */}

JavaScript thực hiện nó bằng một dòng phụ:

stripe. title = function [] {let sec = new date []. getSeconds [] % 10; // Ví dụ, -3s ở đây bắt đầu hình ảnh động từ sọc thứ hai thứ hai.style.transitiondelay = ' -' + sec + 's'; Stripe.ClassList.Add ['animate']; };

JavaScript thực hiện nó bằng một dòng phụ:

stripe. title = function [] {let sec = new date []. getSeconds [] % 10; // Ví dụ, -3s ở đây bắt đầu hình ảnh động từ sọc thứ hai thứ hai.style.transitiondelay = ' -' + sec + 's'; Stripe.ClassList.Add ['animate']; };

Chức năng thời gian chuyển đổi thời gian chuyển đổi mô tả cách quá trình hoạt hình được phân phối theo thời gian. Nó sẽ bắt đầu chậm và sau đó đi nhanh hoặc vise Versa. Đó là tài sản phức tạp nhất từ ​​cái nhìn đầu tiên. Nhưng nó trở nên rất đơn giản nếu chúng ta dành một chút thời gian cho nó. Thuộc tính đó chấp nhận hai loại giá trị: một đường cong hoặc các bước. Hãy để bắt đầu từ đường cong, vì nó sử dụng thường xuyên hơn.

Đường cong Bezier Chức năng thời gian có thể được đặt thành đường cong Bezier với 4 điểm điều khiển thỏa mãn các điều kiện: 1. Điểm điều khiển đầu tiên: [0,0]. 2. Điểm kiểm soát cuối cùng: [1,1]. 3. Đối với các điểm trung gian, giá trị của x phải nằm trong khoảng 0..1, y có thể là bất cứ điều gì. Cú pháp cho một đường cong bezier trong CSS: hình khối [x2, y2, x3, y3]. Ở đây chúng ta cần chỉ định các điểm kiểm soát thứ 2 và thứ 3, vì điểm thứ nhất được cố định [0,0] và điểm thứ 4 là [1,1]. Hàm thời gian mô tả quá trình hoạt hình đi nhanh như thế nào. ●

Trục X là thời gian: 0-khoảnh khắc bắt đầu, 1-khoảnh khắc cuối cùng của thời gian chuyển tiếp. Trục y chỉ định hoàn thành quá trình: 0 - giá trị bắt đầu của thuộc tính, 1 - giá trị cuối cùng.

Biến thể đơn giản nhất là khi hoạt hình đi đồng đều, với cùng tốc độ tuyến tính. Có thể được chỉ định bởi đường cong hình khối [0, 0, 1, 1]. Đây là cách mà đường cong đó trông như thế nào:

Như chúng ta có thể thấy, nó chỉ là một đường thẳng. Khi thời gian [x] trôi qua, sự hoàn thành [y] của hoạt hình đều đặn từ 0 đến 1. Tàu trong ví dụ dưới đây đi từ trái sang phải với tốc độ vĩnh viễn [nhấp vào nó]: //plnkr.co/edit/bkxxsw1mgxizvhcpucj4?p=preview Việc chuyển đổi CSS dựa trên đường cong đó:. ; Chuyển tiếp: còn lại 5S khối-bezier [0, 0, 1, 1]; / * Bộ JavaScript còn lại thành 450px */}

Và làm thế nào chúng ta có thể cho thấy một chuyến tàu chậm lại? Chúng ta có thể sử dụng một đường cong bezier khác: hình khối [0,0, 0,5, 0,5, 1,0]. Đồ thị:

Như chúng ta có thể thấy, quá trình bắt đầu nhanh: đường cong tăng cao lên cao, sau đó chậm hơn và chậm hơn. Tại đây, chức năng thời gian trong hành động [nhấp vào tàu]: //plnkr.co/edit/ebbtktni1l5096shlcq8?p=preview

CSS:

CSS:

CSS:

CSS:

.Train {trái: 0; Chuyển tiếp: còn lại 5S khối-bezier [0, .5, .5, 1]; / * Bộ JavaScript còn lại thành 450px */}

Có một số đường cong tích hợp: tuyến tính, dễ dàng, dễ dàng, dễ dàng và dễ dàng. Tuyến tính là một tốc ký cho hình khối [0, 0, 1, 1]-một đường thẳng, chúng ta đã thấy nó rồi. Các tên khác là những kẻ viết tắt cho hình khối sau đây: dễ dàng *

dễ dàng trong

dễ dàng

dễ dàng-ra ngoài

Trục X là thời gian: 0-khoảnh khắc bắt đầu, 1-khoảnh khắc cuối cùng của thời gian chuyển tiếp. Trục y chỉ định hoàn thành quá trình: 0 - giá trị bắt đầu của thuộc tính, 1 - giá trị cuối cùng.

Trục X là thời gian: 0-khoảnh khắc bắt đầu, 1-khoảnh khắc cuối cùng của thời gian chuyển tiếp. Trục y chỉ định hoàn thành quá trình: 0 - giá trị bắt đầu của thuộc tính, 1 - giá trị cuối cùng.

Biến thể đơn giản nhất là khi hoạt hình đi đồng đều, với cùng tốc độ tuyến tính. Có thể được chỉ định bởi đường cong hình khối [0, 0, 1, 1]. Đây là cách mà đường cong đó trông như thế nào:

Như chúng ta có thể thấy, nó chỉ là một đường thẳng. Khi thời gian [x] trôi qua, sự hoàn thành [y] của hoạt hình đều đặn từ 0 đến 1. Tàu trong ví dụ dưới đây đi từ trái sang phải với tốc độ vĩnh viễn [nhấp vào nó]: //plnkr.co/edit/bkxxsw1mgxizvhcpucj4?p=preview Việc chuyển đổi CSS dựa trên đường cong đó:. ; Chuyển tiếp: còn lại 5S khối-bezier [0, 0, 1, 1]; / * Bộ JavaScript còn lại thành 450px */}

Và làm thế nào chúng ta có thể cho thấy một chuyến tàu chậm lại? Chúng ta có thể sử dụng một đường cong bezier khác: hình khối [0,0, 0,5, 0,5, 1,0]. Đồ thị:

Bước các bước thời gian [số bước [, bắt đầu/kết thúc]] cho phép chia hoạt hình thành các bước. Hãy cùng xem điều đó trong một ví dụ với các chữ số. Dưới đây, một danh sách các chữ số, không có bất kỳ hình ảnh động nào, giống như một nguồn

Chúng tôi sẽ làm cho các chữ số xuất hiện theo cách riêng biệt bằng cách đưa một phần của danh sách bên ngoài cửa sổ màu đỏ vô hình và chuyển danh sách sang trái với mỗi bước. Sẽ có 9 bước, một bước di chuyển cho mỗi chữ số:

#stripe.Animate {biến đổi: dịch [-90%]; Chuyển đổi: Biến đổi các bước 9s [9, bắt đầu]; }

Trong hành động: //plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Chúng tôi sẽ làm cho các chữ số xuất hiện theo cách riêng biệt bằng cách đưa một phần của danh sách bên ngoài cửa sổ màu đỏ vô hình và chuyển danh sách sang trái với mỗi bước. Sẽ có 9 bước, một bước di chuyển cho mỗi chữ số:

#stripe.Animate {biến đổi: dịch [-90%]; Chuyển đổi: Biến đổi các bước 9s [9, bắt đầu]; }

Trong hành động: //plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước [9, bắt đầu] là số bước. Biến đổi sẽ được chia thành 9 phần [mỗi phần 10%]. Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 [bước đầu tiên] ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

Trong hành động: //plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Trong hành động: //plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Trong hành động: //plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước [9, bắt đầu] là số bước. Biến đổi sẽ được chia thành 9 phần [mỗi phần 10%]. Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 [bước đầu tiên] ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

0S --10% [thay đổi đầu tiên ở đầu giây thứ nhất, ngay lập tức]

Trong hành động: //plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước [9, bắt đầu] là số bước. Biến đổi sẽ được chia thành 9 phần [mỗi phần 10%]. Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 [bước đầu tiên] ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

Trong hành động: //plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước [9, bắt đầu] là số bước. Biến đổi sẽ được chia thành 9 phần [mỗi phần 10%]. Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 [bước đầu tiên] ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

Trong hành động: //plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Trong hành động: //plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước [9, bắt đầu] là số bước. Biến đổi sẽ được chia thành 9 phần [mỗi phần 10%]. Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 [bước đầu tiên] ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

0S --10% [thay đổi đầu tiên ở đầu giây thứ nhất, ngay lập tức]

Trong hành động: //plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước [9, bắt đầu] là số bước. Biến đổi sẽ được chia thành 9 phần [mỗi phần 10%]. Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 [bước đầu tiên] ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

0S --10% [thay đổi đầu tiên ở đầu giây thứ nhất, ngay lập tức]

1S --20%

8s 8s --80% [giây cuối cùng cho thấy giá trị cuối cùng].

Kết thúc giá trị thay thế có nghĩa là sự thay đổi nên được áp dụng không phải ở đầu, mà ở cuối mỗi giây. Vì vậy, quá trình sẽ diễn ra như thế này: ●

0S - 0

1S --10% [thay đổi đầu tiên ở cuối giây thứ nhất]

2s --20%

… 9s --90%

Ở đây, bước [9, kết thúc] trong hành động [lưu ý tạm dừng giữa thay đổi chữ số đầu tiên]: //plnkr.co/edit/i3soddmnbydkxh2hefak?p=preview

Ngoài ra còn có giá trị tốc ký: ●

bước bắt đầu-giống như các bước [1, bắt đầu]. Đó là, hình ảnh động bắt đầu ngay lập tức và mất 1 bước. Vì vậy, nó bắt đầu và kết thúc ngay lập tức, như thể không có hoạt hình. Bước kết thúc-giống như các bước [1, kết thúc]: Tạo hình ảnh động trong một bước duy nhất ở cuối thời gian chuyển tiếp.

Những giá trị này hiếm khi được sử dụng, bởi vì đó không thực sự là hoạt hình, mà là một thay đổi một bước.

Trong hành động: //plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước [9, bắt đầu] là số bước. Biến đổi sẽ được chia thành 9 phần [mỗi phần 10%]. Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 [bước đầu tiên] ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

0S --10% [thay đổi đầu tiên ở đầu giây thứ nhất, ngay lập tức]

Trong hành động: //plnkr.co/edit/6vbxpjyiojjul5vx8uvs?p=preview

Đối số đầu tiên của các bước [9, bắt đầu] là số bước. Biến đổi sẽ được chia thành 9 phần [mỗi phần 10%]. Khoảng thời gian cũng được tự động chia thành 9 phần, vì vậy chuyển tiếp: 9s cho chúng ta 9 giây cho toàn bộ hoạt hình - 1 giây mỗi chữ số. Đối số thứ hai là một trong hai từ: bắt đầu hoặc kết thúc. Sự khởi đầu có nghĩa là khi bắt đầu hoạt hình, chúng ta cần thực hiện bước đầu tiên ngay lập tức. Chúng ta có thể quan sát rằng trong quá trình hoạt hình: Khi chúng ta nhấp vào chữ số, nó sẽ thay đổi thành 1 [bước đầu tiên] ngay lập tức và sau đó thay đổi ở đầu giây tiếp theo. Quá trình đang tiến triển như thế này: ●

0S --10% [thay đổi đầu tiên ở đầu giây thứ nhất, ngay lập tức]

Nhiệm vụ Animate A PBER [CSS]

Tầm quan trọng: 5 Hiển thị hình ảnh động như trên hình bên dưới [nhấp vào mặt phẳng]:

Hình ảnh phát triển khi nhấp từ 40x24px đến 400x240px [lớn hơn 10 lần].

Hình ảnh phát triển khi nhấp từ 40x24px đến 400x240px [lớn hơn 10 lần].

Hình ảnh phát triển khi nhấp từ 40x24px đến 400x240px [lớn hơn 10 lần].

Hình ảnh phát triển khi nhấp từ 40x24px đến 400x240px [lớn hơn 10 lần].

Hoạt hình mất 3 giây.

Ở đầu ra cuối cùng: đã thực hiện!

Trong quá trình hoạt hình, có thể có nhiều nhấp chuột hơn trên máy bay. Họ không nên phá vỡ bất cứ điều gì.

Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Tích hợp Tầm quan trọng của mặt phẳng bay [CSS]: 5 Sửa đổi giải pháp của nhiệm vụ trước đó làm động một mặt phẳng [CSS] để làm cho mặt phẳng phát triển nhiều hơn so với kích thước ban đầu 400x240px [nhảy ra], sau đó trở về kích thước đó. Ở đây, cách thức nhìn nó [nhấp vào máy bay]:

Hình ảnh phát triển khi nhấp từ 40x24px đến 400x240px [lớn hơn 10 lần].

Hoạt hình mất 3 giây.

Ở đầu ra cuối cùng: đã thực hiện!

Hoạt hình mất 3 giây.

Ở đầu ra cuối cùng: đã thực hiện!

Trong quá trình hoạt hình, có thể có nhiều nhấp chuột hơn trên máy bay. Họ không nên phá vỡ bất cứ điều gì.

Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Tích hợp Tầm quan trọng của mặt phẳng bay [CSS]: 5 Sửa đổi giải pháp của nhiệm vụ trước đó làm động một mặt phẳng [CSS] để làm cho mặt phẳng phát triển nhiều hơn so với kích thước ban đầu 400x240px [nhảy ra], sau đó trở về kích thước đó. Ở đây, cách thức nhìn nó [nhấp vào máy bay]:

Lấy giải pháp của nhiệm vụ trước đó làm nguồn. Để giải pháp

Tầm quan trọng của vòng tròn hoạt hình: 5 Tạo một chức năng showcircle [CX, CY, RADIUS] cho thấy một vòng tròn phát triển hoạt hình. ●

CX, CY là tọa độ tương đối cửa sổ của trung tâm của vòng tròn,

Ở đầu ra cuối cùng: đã thực hiện!

Trong quá trình hoạt hình, có thể có nhiều nhấp chuột hơn trên máy bay. Họ không nên phá vỡ bất cứ điều gì.

Mở một hộp cát cho nhiệm vụ.

Để giải pháp

Tích hợp Tầm quan trọng của mặt phẳng bay [CSS]: 5 Sửa đổi giải pháp của nhiệm vụ trước đó làm động một mặt phẳng [CSS] để làm cho mặt phẳng phát triển nhiều hơn so với kích thước ban đầu 400x240px [nhảy ra], sau đó trở về kích thước đó. Ở đây, cách thức nhìn nó [nhấp vào máy bay]:

Lấy giải pháp của nhiệm vụ trước đó làm nguồn. Để giải pháp

Tầm quan trọng của vòng tròn hoạt hình: 5 Tạo một chức năng showcircle [CX, CY, RADIUS] cho thấy một vòng tròn phát triển hoạt hình. ●

CX, CY là tọa độ tương đối cửa sổ của trung tâm của vòng tròn,

Bán kính là bán kính của vòng tròn.

Hoạt hình có cấu trúc Bây giờ chúng ta có thể tạo một chức năng hoạt hình phổ quát hơn dựa trên requestAnimationFrame:

hàm animate [{thời gian, vẽ, thời lượng}] {let start = performance.now []; requestAnimationFrame [chức năng animate [thời gian] {// thời gian chuyển từ 0 đến 1 hãy để thời gian = [thời gian - bắt đầu] / thời lượng; nếu [thời gian> 1] thời gian ] vẽ [tiến trình]; // vẽ nó nếu [thời gian

Bài Viết Liên Quan

Chủ Đề