< Return to Video

Animating DOM with setInterval (Video Version)

  • 0:01 - 0:04
    Ở đây tôi có một trang web với ảnh của Oh Noes,
  • 0:04 - 0:08
    đang sợ hãi vì sắp tới tận thế rồi,
  • 0:08 - 0:10
    chỉ còn 500 giây.
  • 0:10 - 0:13
    Tôi muốn cải tiến trang web này hơn một chút,
  • 0:13 - 0:17
    bằng cách biến số này thành một số đếm ngược,
  • 0:17 - 0:21
    để người dùng có thể xem xem còn chính xác bao nhiêu giây nữa.
  • 0:21 - 0:24
    Khi tạo hình động cho một trang web,
  • 0:24 - 0:27
    ta cần tìm element cần động,
  • 0:27 - 0:29
    và thay đổi element đó đi,
  • 0:29 - 0:33
    như ở đây là thay đổi số giây còn lại.
  • 0:33 - 0:38
    Bước đầu tiên là tìm số đếm ngược đấy theo id.
  • 0:38 - 0:39
    Đơn giản thôi.
  • 0:39 - 0:44
    [gõ...]
  • 0:48 - 0:52
    Bước thứ 2, tôi sẽ tạo một hàm để đếm ngược về 0.
  • 0:52 - 0:55
    [gõ...]
    [typing]
  • 0:55 - 0:57
    Giờ ta sẽ
  • 0:57 - 1:01
    đặt text.Content, đặt cho bằng
  • 1:01 - 1:04
    số trước trừ 1.
  • 1:04 - 1:07
    Cái textContent này vốn thuộc kiểu string,
  • 1:07 - 1:10
    nên ta sẽ chuyển nó về kiểu số.
  • 1:10 - 1:13
    Ta đổi về kiểu số bằng hàm parseFloat().
  • 1:13 - 1:16
    Rồi trừ 1 từ số đó đi.
  • 1:16 - 1:22
    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
  • 1:22 - 1:25
    tức là sẽ cứ mỗi giây chạy 1 lần.
    which means a certain
  • 1:25 - 1:30
    Ta làm thế bằng hàm window.setInterval().
  • 1:30 - 1:34
    Hàm này sẽ nhận 2 argument:
  • 1:34 - 1:38
    hàm callback, và số milliseconds (0.001 giây) cần đợi
  • 1:38 - 1:41
    giữa mỗi lần gọi hàm callback kia.
  • 1:41 - 1:43
    Ta truyền hàm callback vào
  • 1:43 - 1:47
    cũng như lúc truyền hàm cho event listener vào: nhập tên hàm vào.
  • 1:47 - 1:49
    Giờ bạn thấy số đếm ngược đang nhanh quá,
  • 1:49 - 1:52
    bởi vì ta chưa nhập vào argument thứ 2,
  • 1:52 - 1:55
    tức là số millisecond cần đợi.
  • 1:55 - 1:59
    Ta muoosnd dợi 1 giây, nên sẽ nhập vào số 1000.
  • 1:59 - 2:02
    bởi vì 1000ms là 1s.
  • 2:02 - 2:05
    Thế là xong, giờ nó đang đếm ngược mỗi 1s rồi.
  • 2:05 - 2:10
    Chỉ còn có 490 giây thôi!
  • 2:10 - 2:15
    Còn một hàm window nữa mà ta cũng thường dùng ngoài setInterval(),
  • 2:15 - 2:17
    là hàm setTimeout().
  • 2:17 - 2:22
    Tôi sẽ sửa chỗ này đi thế, bạn xem có khác gì không.
  • 2:22 - 2:24
    Đợi 1 giây rồi.
  • 2:24 - 2:28
    Bạn thấy đây, khi dùng setTimeout
  • 2:28 - 2:34
    thì trình duyệt chỉ gọi hàm đó 1 lần, chứ không lặp lại.
  • 2:34 - 2:39
    Thế thì không hữu dụng lắm khi tạo hình động,
  • 2:39 - 2:42
    nhưng có thể hữu dụng trong trường hợp khác,
  • 2:42 - 2:46
    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
  • 2:46 - 2:48
    rồi sau 10s thì ẩn đi.
  • 2:48 - 2:53
    Tôi sẽ đổi cái này về lại setInterval.
  • 2:53 - 2:57
    Khi ta test hình động thế này,
  • 2:57 - 3:00
    ta cần kiểm tra kĩ xem từng điểm trong quá trình động sẽ thay đổi thế nào,
  • 3:00 - 3:02
    như là khi về 0 thì sẽ thế nào.
  • 3:02 - 3:05
    Mà đợi cái này về 0 thì lâu lắm,
  • 3:05 - 3:07
    chán ngấy ra mất, nên
  • 3:07 - 3:11
    ta sẽ sửa mốc ban đầu thành 5,
  • 3:11 - 3:13
    rồi xem xem.
  • 3:13 - 3:17
    4, 3, 2, 1, 0...
  • 3:17 - 3:19
    -1, -2,...
  • 3:19 - 3:22
    Thế này là không được rồi.
  • 3:22 - 3:26
    Khi hết giờ, tận thế rồi, thì cần có nổ "Kaboom" và không được đếm nữa.
  • 3:26 - 3:30
    Tức là ta sẽ cần dừng hình động này lại
  • 3:30 - 3:33
    khi chạm về số 0.
  • 3:33 - 3:36
    Ta sẽ thực hiện cái đó với điều kiện 'if' trong hàm này.
  • 3:36 - 3:42
    Tôi sẽ gán thời gian hiện tại vào một biến,
  • 3:42 - 3:45
    vì ta sẽ phải kiểm tra giá trị đó.
  • 3:45 - 3:48
    Tôi lấy cái này, đặt vào đây,
  • 3:48 - 3:51
    và sửa cái này thành currentTime.
  • 3:51 - 3:56
    Giờ tôi sẽ viết điều kiện if
  • 3:56 - 4:01
    để chỉ thay đổi dòng text nếu currentTime lớn hơn 0.
  • 4:01 - 4:05
    Khi lớn hơn 0 thì ta mới trừ 1 đi.
  • 4:05 - 4:10
    Tôi sẽ đặt cái này vào đây.
  • 4:10 - 4:15
    Thế này là được rồi, nhưng vẫn chưa hay lắm,
  • 4:15 - 4:19
    vì trình duyệt vẫn gọi hàm này 1 giây 1 lần
  • 4:19 - 4:22
    khi ta còn mở trang này (cho dù chữ không thay đổi nữa).
  • 4:22 - 4:25
    Ta không nên bắt trình duyệt làm việc thừa như thế.
  • 4:25 - 4:28
    Còn nhiều việc khác cần làm.
  • 4:28 - 4:31
    Vậy nên ta cần bảo trình duyệt là
  • 4:31 - 4:36
    khi về 0 rồi thì không cần gọi hàm này nữa.
  • 4:36 - 4:40
    Ta sẽ làm thế với hàm window.clearInterval().
  • 4:40 - 4:47
    Ta đặt thêm else vào đây... window.clearInterval().
  • 4:47 - 4:52
    Ta cần nhập vào 1 argument để nó biết là cần xoá interval nào,
  • 4:52 - 4:56
    bởi vì có những lúc ta lại cần xoá nhiều interval trong trang web.
  • 4:56 - 4:59
    Thế biết interval nào cần xoá
  • 4:59 - 5:03
    thì ta chỉ cần gán kết quả của setInterval() vào một biến.
  • 5:03 - 5:08
    Giờ là ta đã có một biến thời gian, tôi copy paste nó vào đây,
  • 5:08 - 5:11
    như vậy là biết được cần xoá interval nào khi về 0 rồi,
  • 5:11 - 5:16
    thế thì trình duyệt sẽ không gọi hàm kia nữa.
  • 5:16 - 5:19
    Với tất cả các hình động mà bạn viết, bạn cần để ỹ kĩ
  • 5:19 - 5:22
    về điều kiện để dừng chuyển động đó.
  • 5:22 - 5:26
    Cũng có những hình động mà bạn muốn chạy vô tận,
  • 5:26 - 5:29
    nhưng mà cần để ý kĩ.
  • 5:29 - 5:34
    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ề.
  • 5:34 - 0:00
    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.
Title:
Animating DOM with setInterval (Video Version)
Description:

more » « less
Video Language:
English
Duration:
05:39

Vietnamese subtitles

Incomplete

Revisions