forked from nsjcy/frontEnd/nsjcy

liyj
2020-02-03 7a4d973140ee0168f509098b52745c8a7947ca74
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/**
 * 图片预加载组件
 *
 */
 
class ImgLoader {
  /**
   * 初始化方法,在页面的 onLoad 方法中调用,传入 Page 对象及图片加载完成的默认回调
   */
  constructor(pageContext, defaultCallback) {
    this.page = pageContext
    this.defaultCallback = defaultCallback || function () { }
    this.callbacks = {}
    this.imgInfo = {}
 
    this.page.data.imgLoadList = [] //下载队列
    this.page._imgOnLoad = this._imgOnLoad.bind(this)
    this.page._imgOnLoadError = this._imgOnLoadError.bind(this)
  }
 
  /**
   * 加载图片
   *
   * @param  {String}   src      图片地址
   * @param  {Function} callback 加载完成后的回调(可选),第一个参数个错误信息,第二个为图片信息
   */
  load(src, callback) {
    if (!src) return;
 
    let list = this.page.data.imgLoadList,
      imgInfo = this.imgInfo[src]
 
    if (callback)
      this.callbacks[src] = callback
 
    //已经加载成功过的,直接回调
    if (imgInfo) {
      this._runCallback(null, {
        src: src,
        width: imgInfo.width,
        height: imgInfo.height
      })
 
      //新的未在下载队列中的
    } else if (list.indexOf(src) == -1) {
      list.push(src)
      this.page.setData({ 'imgLoadList': list })
    }
  }
 
  _imgOnLoad(ev) {
    let src = ev.currentTarget.dataset.src,
      width = ev.detail.width,
      height = ev.detail.height
 
    //记录已下载图片的尺寸信息
    this.imgInfo[src] = { width, height }
    this._removeFromLoadList(src)
 
    this._runCallback(null, { src, width, height })
  }
 
  _imgOnLoadError(ev) {
    let src = ev.currentTarget.dataset.src
    this._removeFromLoadList(src)
    this._runCallback('Loading failed', { src })
  }
 
  //将图片从下载队列中移除
  _removeFromLoadList(src) {
    let list = this.page.data.imgLoadList
    list.splice(list.indexOf(src), 1)
    this.page.setData({ 'imgLoadList': list })
  }
 
  //执行回调
  _runCallback(err, data) {
    let callback = this.callbacks[data.src] || this.defaultCallback
    callback(err, data)
    delete this.callbacks[data.src]
  }
}
 
module.exports = ImgLoader