天天看點

viewerjs圖檔預覽插件ajax動态加載圖檔不出現-【已解決】

bug問題:

近期公司檢視圖檔的插件總是bug異常,上司發令更換這個“燈箱效果”,在網上像爬蟲一下尋覓了好久,終于找到一個漂亮的插件:強大的jQuery圖檔檢視器插件Viewer.js

viewerjs圖檔預覽插件ajax動态加載圖檔不出現-【已解決】

感覺技術沒啥問題——咨詢上司意見——上司回報ok——開始移植——本地移植成功(開心,小問題不要慌)——移交後端大佬測試:内容頁面成功實作燈箱效果,但是我們首頁和清單頁有個類似知乎目前頁加載内容的效果,然後就卡坑了!

viewerjs圖檔預覽插件ajax動态加載圖檔不出現-【已解決】

事先聲明:我用的是jquery版插件,vue版插件同樣問題解決方案在底部。

解決之路:

搗鼓半天之後,插件js内:ready,init,build等地方打斷點測試,終于找到原因了:動态加載的之前插件都已經周遊過圖檔了,這…

那就隻能在ajax動态加載資料後面再一次:

$('.ppbox').viewer({
url: 'data-original'
});      

這樣就可以了,出現了黑色的彈框,咦,我圖檔呢?圖檔沒有加載,why?無意中點選“上一張”和“下一張”按鈕,窩草,圖檔又出來了,就是動态加載之後沒有出現,.net技術大佬推斷是trigger委托事件沒有觸發,我就陷入了修改trigger之路,改為on和delegate的誤區,但是知道離成功越來越近了。

第二天上班,我深入研究了trigger,發現它本身就是一個委托事件,應該不是這個地方的問題,我就懷疑:是不是聲明的函數程式看到之後,比較懶,發現有資料,就沒有更新?

然後,在本地模拟動态加載:

$(".ppbox .btn").click(function(){
var html = '<img data-original="../../static/pic/tj-ad.png" src="../../static/pic/tj-ad.png">';
$('.ppbox').append(html); 
aa();
})
function aa(){
  $('.ppbox0').viewer({
    url: 'data-original'
  });
}      

咦,有效,這次終于出現了,我動态頁面第一次$(’.ppbox’).viewer()和第二次(’.ppbox0’).viewer()差別就在于class不一樣了,js程式就又一次跑了起來,效果就實作了!然後,讓大佬動态添加class名字,每次都不一樣,終于結束了此次bug之路:Viewer.js不支援動态加載圖檔,無法出圖的問題。

VUE版解決方案: 同樣問題在vue版的插件中也存在,解決方案在2017年傷心的桔子嘎就提出了解決方案,需要再動态加載的時候重新聲明一下viewer,并viewer.update()更新一次:

var viewer = new Viewer(document.getElementById('scenePhoto'),{
  show: function (){
viewer.update();
  }  
});      

bug2:其實算是bug,插件自定義了屬性,卻沒有用

用這個插件還有另外一個問題:他的用法是父級包含所有的圖檔,然後插件把所有圖檔周遊到一起,在燈箱出現的時候調用,很顯然我的内容中還有頭像圖檔和圖示也被周遊了,在圖檔切換的時候,同樣會被加載出來,這不是我想要的結果!!!

那我是怎麼改的呢?

viewerjs圖檔預覽插件ajax動态加載圖檔不出現-【已解決】

解決方案:

在u.prototype原型初始化init的函數中,将“n = s ? e : e.find(E)”修改成了“n = s ? e : e.find(‘img[data-original]’)”,大概意思就是由找所有圖示改成了找帶有data-original自定義屬性的圖檔;

代碼解壓之後大概在130行

n = s ? e : e.find('img[data-original]')      

這樣就限定了,圖檔隻能是帶有自定義屬性data-original的才會有燈箱效果。