本身運營了一個公衆號,在發文章的時候,須要在網上找一些圖,而有些網站的圖片可能隱藏在屬性或者背景圖中,要下載的時候常常審查元素,查看源碼,不太方便,最近在看一些谷歌插件的api,便順手作了一個插件Image downloader。源碼放到了github上,順便學習並用了一下git。地址:https://github.com/yeyuqiudeng/imageDownloaderhtml
Image downloader有下面幾個功能:git
收集全部的img標籤src的圖片連接github
收集全部的背景圖片連接json
能夠根據定義的規則,收集標籤屬性中的連接segmentfault
支持圖片大小篩選api
顯示圖片的原始大小數組
插件用到谷歌插件中的content script和popup。content script是注入到頁面中的js,須要在manifest.json配置注入頁面的規則,和注入那些js進入頁面。在這個插件中,個人manifest.json是這樣的:微信
{ "manifest_version": 2, "name": "Image downloader", "description": "圖片下載器,能夠自定義屬性下載規則", "version": "1.0", "browser_action": { "default_icon": "icon16.png", "default_popup": "/popup/popup.html" }, "permissions": [ "tabs", "downloads" ], "icons": { "16": "icon16.png", "48": "icon48.png", "128": "icon128.png" }, "content_scripts": [{ "matches": ["http://*/*", "https://*/*"], "js": ["common.js", "inject.js"] }] }
content_scripts的配置表示要將common.js和inject.js注入到全部http和https的網站dom
在common裏我定義了兩個方法,一個用來顯示錯誤信息,一個方法將圖片的相對路徑補全,在cdn地址前面加上http。學習
方法以下:
// 顯示錯誤信息 const showMsg = (msg) => { let myDate = new Date(); let now = myDate.toLocaleString(); console.log(now + "【" + msg + "】"); }; // 拼接相對路徑及cdn const concatUrl = (url, domain) => { let fullPath = url if (/^\/[^\/]+/.test(url)) { // 是否爲相對路徑 fullPath = domain + url } if (/^\/\//.test(url)) { // 是否爲cdn fullPath = 'http:' + url } return fullPath }
不太熟悉正則,也不知道寫得對不對。
其實這裏不須要再要一個common.js的文件,只是上一次寫插件的時候,公共的方法比較多,此次也將common.js留了下來。
在注入頁面的JS中,主要是三個方法,分別用來收集img標籤的src地址,元素的背景圖片和自定義屬性規則的屬性值
收集img標籤的src值代碼以下:
const getImgUrl = function() { // 獲取全部圖片的src值 const allImg = document.querySelectorAll('img') const allImgUrl = [] allImg.forEach((img) => { allImgUrl.push(concatUrl(img.src, domain)) }) return allImgUrl }
其實就是獲取img標籤的集合,遍歷集合並獲取src的值,若是爲相對路徑或cdn路徑,用concatUrl方法拼接成絕對路徑,最後組成一個由url地址組成的數組。
獲取背景圖片的代碼以下:
const getBackgroundImage = function() { // 獲取背景圖片 const allDoms = document.querySelectorAll('*') const allBgImageUrl = [] allDoms.forEach((element) => { let url = window.getComputedStyle(element)['background-image'].match(/url\("(.+)"\)$/) if (url && url[1]) { allBgImageUrl.push(concatUrl(url[1], domain)) } }) return allBgImageUrl }
經過getComputedStyle方法來獲取全部元素的backgroundImage屬性值,並將url地址提取出來,若是一個backgroundImage中有多個url,只取第一個,後面的就捨棄了。這個方法也是返回一個由地址組成的數組。
獲取配置屬性值的代碼以下:
let configAttr = ['data-src'] // 配置的屬性 const getConfigAttrUrl = function() { // 獲取全部配置屬性的值 const attrUrl = [] if (configAttr.length > 0) { configAttr.forEach((attr) => { attrUrl.push(...getAllAttr(attr)) }) } return attrUrl } const getAllAttr = function(attr) { // 獲取對應屬性的值 const attrs = [] const allDoms = document.querySelectorAll('[' + attr + ']') allDoms.forEach((dom) => { const attrValue = dom.getAttribute(attr) attrs.push(concatUrl(attrValue, domain)) }) return attrs }
configAttr用來配置須要獲取元素屬性的規則,這裏用了數組來接收多個配置規則,默認收集全部元素的data-src屬性值。爲何會內置這個規則呢?由於不少網站都用了這個屬性啊。
getAllAttr是根據傳進來的屬性獲取屬性值,getConfigAttrUrl是遍歷屬性規則,收集全部屬性規則下的全部屬性值,返回一個屬性值數組。
圖片不會在進入頁面後立刻就進行收集,只會在用戶點擊插件時纔開始收集當前頁面的圖片,並將收集到的數據發送給popup處理。content script怎樣與popup交互,下一篇文章再說。
最後,全部文章都會同步發送到微信公衆號上,歡迎關注,歡迎提意見: