美文网首页JsWeb前端之路让前端飞
通过 js 获取页面上图片元素的加载状态

通过 js 获取页面上图片元素的加载状态

作者: ac68882199a1 | 来源:发表于2017-10-01 19:40 被阅读77次

    我们在浏览网站的时候,会发现有的网站对于图片有一些特殊的交互效果,比如有的网站在图片加载时会显示一个加载的动画,加载完成后移除动画,而如果加载失败的话,就会出现对应的提示,并且可以点击重新加载

    这种效果是如何实现的呢?其实通过 js 实现并不复杂,因为我们可以监听到页面上图片的加载状态。本篇文章只写实现的原理,并不会提供一个完整的 demo

    Image 对象

    在 js 中有一个 Image 对象,即图片对象,使用前需要先实例化

    const image = new Image()
    

    将这个image打印出来,我们会发现它就是一个<img>标签

    console.log(image)
    // <img>
    

    于是我们就找到了页面上 img 标签与 js 代码中相对应的对象,通过Image对象我们可以实现很多功能

    Image 对象上的普通属性

    当我们创建了一个image实例后,此时的image是空的,它并没有自己的图片内容,如果想要为这个实例设置一张图片,就需要为它的src属性设置值

    image.src = '...' // 想要添加的图片的路径
    

    除了src属性,还有图片尺寸的相关属性,比如width height,但是在图片加载出来之前,这两个值都为 0

    机智的小伙伴肯定都发现了,Image 上的属性与<img>标签上的属性是相同的,我们也可以使用alt属性等

    Image 的事件属性

    图片上的事件属性一般只用到三种:加载成功、加载错误、取消加载

    // 加载成功
    image.onload = () => {...}
    
    // 加载错误
    image.onerror = () => {...}
    
    // 取消加载
    image.onabort = () => {...}
    

    在这三种事件属性中,我们可以分别定义自己想要被触发的脚本:

    1. 当图片加载完成时,控制台打印“加载完成”,同时移除图片元素上的加载动画
    2. 当图片加载出错或被取消时,控制台打印“加载失败”,同时在图片元素上提示加载失败,也可以为其添加点击事件,让这张图片重新加载

    以上,就是我们所需要用的属性和事件,下面举例监听一张图片的加载状态

    <body>
        ![](image-path)
    
        <script>
          // 获取到页面上的 img
          const image = document.getElementById('image')
          image.onload = () => {
            console.log('load success')
          }
          image.onerror = () => {
            console.log('load error')
            imageReload()
          }
          image.onabort = () => {
            console.log('load abort')
            imageReload()
          }
    
          function imageReload () {
            image.addEventListener('click', (e) => {
              // 重新定义 src 属性能够重新加载
              image.src = image.src
            })
          }
        </script>
    </body>
    

    上面的例子是针对页面上的一张图片的,但是通常页面上的图片会很多,可能也会存在很多相同的图片,这时候上面的代码肯定就不适合了,总不能一一添加id再获取,并且逐个添加点击事件吧?但是原理都是一样的,感兴趣的小伙伴们可以尝试编写一个自己的图片状态监听的小插件,实现一些自己的想要的交互,什么图片显示之前的占位图啊之类的都可以

    扫码关注前端周记公众号

    相关文章

      网友评论

      • zsr0423:image对象是新增的js API?
        ac68882199a1:@zsr0423 。。。并不是:smile:它就是img标签在js里的一种表达方式

      本文标题:通过 js 获取页面上图片元素的加载状态

      本文链接:https://www.haomeiwen.com/subject/wypaextx.html