bug問題:
近期公司檢視圖檔的插件總是bug異常,上司發令更換這個“燈箱效果”,在網上像爬蟲一下尋覓了好久,終于找到一個漂亮的插件:強大的jQuery圖檔檢視器插件Viewer.js
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yMxYTOzUWY1gTMhJjZ4EjMzYzXyAjMyYTM0EzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
感覺技術沒啥問題——咨詢上司意見——上司回報ok——開始移植——本地移植成功(開心,小問題不要慌)——移交後端大佬測試:内容頁面成功實作燈箱效果,但是我們首頁和清單頁有個類似知乎目前頁加載内容的效果,然後就卡坑了!
事先聲明:我用的是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,插件自定義了屬性,卻沒有用
用這個插件還有另外一個問題:他的用法是父級包含所有的圖檔,然後插件把所有圖檔周遊到一起,在燈箱出現的時候調用,很顯然我的内容中還有頭像圖檔和圖示也被周遊了,在圖檔切換的時候,同樣會被加載出來,這不是我想要的結果!!!
那我是怎麼改的呢?
解決方案:
在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的才會有燈箱效果。