微信小程序實例:image組件的binderror事件處理

微信公眾平臺關于image組件的講解都挺詳細的,至于在binderror錯誤事件處理上并沒有詳細說明。那么如果我們在獲取網(wǎng)絡圖片出現(xiàn)404 nofound的情況下要怎么處理呢?如果是單張和循環(huán)內的某張圖片出錯的情況下又該如何處理呢?

首先,我們都知道html的img組件自帶一個onerror圖片出錯事件處理機制,寫法就如同js一樣。語法如下:

<img src="xxx" onerror="this.src='./img/default.png'"/>  

但是,我嘗試在小程序里的image組件也做這樣的處理,卻發(fā)現(xiàn)并不能實現(xiàn),反而要提示APP-SERVICE-Engine錯誤信息。后來重新翻看文檔,找到類似的事件處理binderror,文檔支出可以通過event.detail打印出具體的出錯信息,并沒有給出出錯后的具體解決方案。通過和前輩溝通得到的解決方案如下:

通過dataset屬性將image組件的src變量值存入。binderror事件通過獲取屬性變量值改變data的數(shù)據(jù)。當然這個有個弊端,就是image組件的src是動態(tài)的值而不能是直接指向某張圖片的情況下。

那么具體處理代碼如下:
demo.wxml::
單張圖片:

<image src="{{testImg}}" binderror="errImg" bindload="loadImg" data-err-img="testImg" />  

多張圖片的情況:

<view class="bd-left-item" wx:for="{{classicArr}}">  
  <image src="{{item.img}}" class="item-img" binderror="errImg" data-err-img="classicArr[{{index}}].img" />  
  <view class="bd-left-item-bottom">  
    <view class="title">{{item.title}}</view>  
    <view class="addr">{{item.addr}}</view>  
    <view class="tag" wx:for-items="{{item.tags}}" wx:for-item="tag">{{tag}}</view>  
  </view>  
</view>  

demo.js::

Page( {  
  data: {  
    classicArr: [  
      {  
        img: "../../img/01.png",  
        title: "現(xiàn)實世界的桃花源",  
        addr: "福建省南安市東田鎮(zhèn)香草世界",  
        tags: ["攝影", "PS"]  
      },  
      {  
        img: "../../img/default.png",  
        title: "南普陀",  
        addr: "福建省廈門市南普陀",  
        tags: ["攝影1", "PS"]  
      },  
      {  
        img: "../../img/default.png",  
        title: "武夷山",  
        addr: "福建省....",  
        tags: ["攝影", "PS2"]  
      }  
    ],  
    testImg: "../img/01.png"  
  },  
  errImg: function(e){  
    var _errImg=e.target.dataset.errImg;  
    var _objImg="'"+_errImg+"'";  
    var _errObj={};  
    _errObj[_errImg]="../../img/01.png";  
    console.log( e.detail.errMsg+"----"+ _errObj[_errImg] + "----" +_objImg );  
    this.setData(_errObj);//注意這里的賦值方式...  
  }  
});  

去掉dataset屬性,展示的是一片空白



加入dataset屬性后,結合binderror事件處理圖片

但是這樣存在一個情況就是每個頁面都寫這個程序不是很臃腫,那么我們考慮怎么把他寫入到模塊js文件里面呢?

解決方案::先把this對象傳入到js函數(shù)里面,就可以直接修改外面的data數(shù)據(jù)了。具體函數(shù)如下:
commons.js::

//遠程圖片no found情況下指引  
function errImgFun(e, that){  
  var _errImg=e.target.dataset.errImg;  
  var _errObj={};  
  _errObj[_errImg]="../../img/01.png";  
  console.log( e.detail.errMsg+"----" + "----" +_errImg );  
  that.setData(_errObj);    
}  
module.exports = {  
  sayHello: sayHello,  
  errImgFun: errImgFun  
}  

index.js::

var comm=require('../../common/common.js');  
  
Page({  
  errImg: function(ev){  
    //需要訪問當前頁面的數(shù)據(jù)對象傳遞到其它頁面上  
    var _that=this;  
    comm.errImgFun(ev, _that);  
  },  
})  
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,523評論 25 708
  • 昨天看了一下微信小程序官方文檔,總結一下自己學習的個人心得. 首先從官方文檔給的框架說起,微信小程序官方文檔給出了...
    Mr大大大閱讀 47,270評論 9 68
  • 一、制定合理的學習計劃 1、制定的一般步驟:第一步是要分析現(xiàn)有的條件,即個人所處的具體環(huán)境和自身已經(jīng)具備的條件;第...
    心羽海韻閱讀 1,610評論 0 0
  • 有好幾次輸入了一段又一段的話,然后再一段一段的給清空。已經(jīng)有好幾年沒有再寫過東西了,也許印象最深的還是高中那會學校...
    張大大餅閱讀 162評論 0 1
  • 蘋果認為雖然電視成為各大企業(yè)的爭奪重地,但由于更換周期短很難做到盈利,因此目前只在機頂盒、OTT盒子上開發(fā)了市場,...
    py_sama閱讀 411評論 0 0