• 一些JavaScript中原理的简单实现


    实现一个双向数据绑定

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。通过这个属性可以实现简单的双向数据绑定,当前版本的的Vue数据绑定也是基于这个方法来实现的。

    let obj = {}
    let input = document.getElementById('input')
    let span = document.getElementById('span')
    // 数据劫持
    Object.defineProperty(obj, 'text', {
      configurable: true,
      enumerable: true,
      get() {
        console.log('获取数据了')
        return obj['text']
      },
      set(newVal) {
        console.log('数据更新了')
        input.value = newVal
        span.innerHTML = newVal
      }
    })
    // 输入监听
    input.addEventListener('keyup', function(e) {
      obj.text = e.target.value
    })
    

    实现图片的懒加载

    图片的懒加载原理是通过监听scroll事件来显示图片,这种技术通常用在需要加载大量的图片时,通过事件的监听将所有图片的src属性设置成默认的链接,真实的图片链接设置在data-origin里面,当出现在视口区域时将图片的src属性替换成data-origin实现懒加载。

    <ul>
      <li><img src="./imgs/default.png" data="./imgs/1.png" alt=""></li>
      <li><img src="./imgs/default.png" data="./imgs/2.png" alt=""></li>
      <li><img src="./imgs/default.png" data="./imgs/3.png" alt=""></li>
      <li><img src="./imgs/default.png" data="./imgs/4.png" alt=""></li>
      <li><img src="./imgs/default.png" data="./imgs/5.png" alt=""></li>
      <li><img src="./imgs/default.png" data="./imgs/6.png" alt=""></li>
      <li><img src="./imgs/default.png" data="./imgs/7.png" alt=""></li>
      <li><img src="./imgs/default.png" data="./imgs/8.png" alt=""></li>
      <li><img src="./imgs/default.png" data="./imgs/9.png" alt=""></li>
      <li><img src="./imgs/default.png" data="./imgs/10.png" alt=""></li>
    </ul>
    
    let imgs =  document.querySelectorAll('img')
    // 可视区高度
    let clientHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
    function lazyLoad () {
      // 滚动卷去的高度
      let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
      for (let i = 0; i < imgs.length; i ++) {
        // 得到图片顶部距离可视区顶部的距离
        let x = clientHeight + scrollTop - imgs[i].offsetTop
        // 图片在可视区内
        if (x > 0 && x < clientHeight+imgs[i].height) {
          imgs[i].src = imgs[i].getAttribute('data')
        } 
      }      
    }
    // addEventListener('scroll', lazyLoad) or setInterval(lazyLoad, 1000)
    
  • 相关阅读:
    码农提高工作效率 (转)
    Python快速教程 尾声
    C#基础——谈谈.NET异步编程的演变史
    [C#]動態叫用Web Service
    零极限 核心中的核心和详解
    项目经理应该把30%的时间用在编程上
    高效能程序员的七个习惯
    我们如何进行代码审查
    工作经常使用的SQL整理,实战篇(二)
    C# Socket网络编程精华篇 (转)
  • 原文地址:https://www.cnblogs.com/yuanchao-blog/p/11222032.html
Copyright © 2020-2023  润新知