1. <video class="player__video viewer" src="652333414.mp4"></video>
  2. video.addEventListener('click', togglePlay);
  3. video.addEventListener('play', updateButton);
  4. video.addEventListener('pause', updateButton);
  5. video.addEventListener('timeupdate', handleProgress)

HTMLElement.offsetTop

image.png
image.png


window.innerHeight

window.innerWeight

image.png


window.scrollY

image.png


debounce 防抖

  1. function debounce(fn, wait) {
  2. let timeOut;
  3. console.log(this); //windows
  4. return function cb() {
  5. console.log(this) //<div>
  6. clearTimeout(timeOut);
  7. timeOut = setTimeout(fn, wait);
  8. }
  9. }
  10. container.addEventListener('mousemove', debounce(action, 100));
  11. // debounce函数里this指向windows
  12. // 被return的cb()函数里的this才指向DOM节点
  13. // 更清晰的写法:
  14. // const myDebounce = debounce(action, 100);
  15. // container.addEventListener('mousemove', myDebounce);
  1. let counter = 1;
  2. const container = document.getElementById('container');
  3. function action(e) {
  4. container.innerHTML = counter;
  5. counter++;
  6. console.log(this);
  7. console.log(e);
  8. }
  9. function debounce(fn, wait, immediate = true) {
  10. let timeOut;
  11. return function cb() {
  12. if (timeOut) clearTimeout(timeOut);
  13. if (immediate) {
  14. let callNow = !timeOut;
  15. timeOut = setTimeout(() => timeOut = null, wait);
  16. if (callNow) fn.apply(this, arguments);
  17. } else {
  18. timeOut = setTimeout(fn.bind(this, ...arguments), wait);
  19. }
  20. }
  21. }
  22. container.addEventListener('mousemove', debounce(action, 100));
  23. // 这一小段代码里面有一万个知识点:
  24. // 1. bind, apply, call 都可以用来绑定this, 但是bind不会立即执行函数。
  25. // bind返回的是一个绑定了this函数,而不是函数的执行结果。
  26. // 由于apply和call会立即执行函数,上例中的bind如果想改写成apply,应该在func.apply的
  27. // 外面再包裹一个函数,而由于被包裹了一个函数,我们有需要从“外面“借this进来:
  28. // function debounce(func, wait) {
  29. // var timeout;
  30. //
  31. // return function () {
  32. // var context = this;
  33. // var args = arguments;
  34. //
  35. // clearTimeout(timeout)
  36. // timeout = setTimeout(function(){
  37. // func.apply(context, args)
  38. // }, wait);
  39. // }
  40. // }
  41. // 2. function.call(thisArg, arg1, arg2, ...)
  42. // function.apply(thisArg, [args])
  43. // function.bind(thisArg, arg1, arg2, ...)
  44. // 3. 每一个新的function关键词,都会开启一个新的函数作用域,都会有新的this和arguments,
  45. // 当然箭头函数另算。
  46. // 4. setTimeout里面的回调函数,只能写函数名!!!不要带括号,带括号表示立即执行,
  47. // 带了括号setTimeout函数会失效,函数会被立即执行。

throttle 节流

来一个最简单的节流吧。。比较好看出节流和防抖的区别

  1. function throttle(fn, wait) {
  2. let previous = 0;
  3. return function cb() {
  4. const now = + new Date();
  5. if (now - previous > wait) {
  6. fn.apply(this, arguments);
  7. previous = now;
  8. }
  9. }
  10. }

节流是规定每一段时间只能触发一次
防抖是,如果你一直抖,我就一直不触发。。。直到你不抖了我再触发
Visualization: http://demo.nimius.net/debounce_throttle/