Ở đây tôi có một trang web với ảnh của Oh Noes,
đang sợ hãi vì sắp tới tận thế rồi,
chỉ còn 500 giây.
Tôi muốn cải tiến trang web này hơn một chút,
bằng cách biến số này thành một số đếm ngược,
để người dùng có thể xem xem còn chính xác bao nhiêu giây nữa.
Khi tạo hình động cho một trang web,
ta cần tìm element cần động,
và thay đổi element đó đi,
như ở đây là thay đổi số giây còn lại.
Bước đầu tiên là tìm số đếm ngược đấy theo id.
Đơn giản thôi.
[gõ...]
Bước thứ 2, tôi sẽ tạo một hàm để đếm ngược về 0.
[gõ...] [typing]
Giờ ta sẽ
đặt text.Content, đặt cho bằng
số trước trừ 1.
Cái textContent này vốn thuộc kiểu string,
nên ta sẽ chuyển nó về kiểu số.
Ta đổi về kiểu số bằng hàm parseFloat().
Rồi trừ 1 từ số đó đi.
Cuối cùng ta sẽ cứ cách 1 quãng thời gian thì gọi hàm này để chạy, Okay, so finally, we want to
tức là sẽ cứ mỗi giây chạy 1 lần. which means a certain
Ta làm thế bằng hàm window.setInterval().
Hàm này sẽ nhận 2 argument:
hàm callback, và số milliseconds (0.001 giây) cần đợi
giữa mỗi lần gọi hàm callback kia.
Ta truyền hàm callback vào
cũng như lúc truyền hàm cho event listener vào: nhập tên hàm vào.
Giờ bạn thấy số đếm ngược đang nhanh quá,
bởi vì ta chưa nhập vào argument thứ 2,
tức là số millisecond cần đợi.
Ta muoosnd dợi 1 giây, nên sẽ nhập vào số 1000.
bởi vì 1000ms là 1s.
Thế là xong, giờ nó đang đếm ngược mỗi 1s rồi.
Chỉ còn có 490 giây thôi!
Còn một hàm window nữa mà ta cũng thường dùng ngoài setInterval(),
là hàm setTimeout().
Tôi sẽ sửa chỗ này đi thế, bạn xem có khác gì không.
Đợi 1 giây rồi.
Bạn thấy đây, khi dùng setTimeout
thì trình duyệt chỉ gọi hàm đó 1 lần, chứ không lặp lại.
Thế thì không hữu dụng lắm khi tạo hình động,
nhưng có thể hữu dụng trong trường hợp khác,
ví dụ như khi ta muốn trình duyệt hiện một cảnh báo ra cho người dùng
rồi sau 10s thì ẩn đi.
Tôi sẽ đổi cái này về lại setInterval.
Khi ta test hình động thế này,
ta cần kiểm tra kĩ xem từng điểm trong quá trình động sẽ thay đổi thế nào,
như là khi về 0 thì sẽ thế nào.
Mà đợi cái này về 0 thì lâu lắm,
chán ngấy ra mất, nên
ta sẽ sửa mốc ban đầu thành 5,
rồi xem xem.
4, 3, 2, 1, 0...
-1, -2,...
Thế này là không được rồi.
Khi hết giờ, tận thế rồi, thì cần có nổ "Kaboom" và không được đếm nữa.
Tức là ta sẽ cần dừng hình động này lại
khi chạm về số 0.
Ta sẽ thực hiện cái đó với điều kiện 'if' trong hàm này.
Tôi sẽ gán thời gian hiện tại vào một biến,
vì ta sẽ phải kiểm tra giá trị đó.
Tôi lấy cái này, đặt vào đây,
và sửa cái này thành currentTime.
Giờ tôi sẽ viết điều kiện if
để chỉ thay đổi dòng text nếu currentTime lớn hơn 0.
Khi lớn hơn 0 thì ta mới trừ 1 đi.
Tôi sẽ đặt cái này vào đây.
Thế này là được rồi, nhưng vẫn chưa hay lắm,
vì trình duyệt vẫn gọi hàm này 1 giây 1 lần
khi ta còn mở trang này (cho dù chữ không thay đổi nữa).
Ta không nên bắt trình duyệt làm việc thừa như thế.
Còn nhiều việc khác cần làm.
Vậy nên ta cần bảo trình duyệt là
khi về 0 rồi thì không cần gọi hàm này nữa.
Ta sẽ làm thế với hàm window.clearInterval().
Ta đặt thêm else vào đây... window.clearInterval().
Ta cần nhập vào 1 argument để nó biết là cần xoá interval nào,
bởi vì có những lúc ta lại cần xoá nhiều interval trong trang web.
Thế biết interval nào cần xoá
thì ta chỉ cần gán kết quả của setInterval() vào một biến.
Giờ là ta đã có một biến thời gian, tôi copy paste nó vào đây,
như vậy là biết được cần xoá interval nào khi về 0 rồi,
thế thì trình duyệt sẽ không gọi hàm kia nữa.
Với tất cả các hình động mà bạn viết, bạn cần để ỹ kĩ
về điều kiện để dừng chuyển động đó.
Cũng có những hình động mà bạn muốn chạy vô tận,
nhưng mà cần để ý kĩ.
Vì trình duyệt của bạn đang phải làm việc tốn tài nguyên mỗi khi gọi hàm callback về.
Tiếp teho ta sẽ cải tiến hình động này thêm nữa để cho giống tận thế thật.