let imgSrcDB
let imglist = null
if(window.indexedDB){
console.log('-----支持')
let request = window.indexedDB.open('ImgLocalBase64Src', 2)
request.onerror = function (e) {
}
request.onsuccess = function (e) {
imgSrcDB = request.result
}
request.onupgradeneeded = function (e) {
imgSrcDB = e.target.result
if (!imgSrcDB.objectStoreNames.contains('imglist')) {
imglist = imgSrcDB.createObjectStore('imglist', { keyPath: 'name' })
imglist.createIndex('src', 'src', { unique: false })
}
}
function add(name, data) {
let request = imgSrcDB.transaction(['imglist'], 'readwrite')
.objectStore('imglist')
.add({ name: name, src: data });
request.onsuccess = function (e) {
}
request.onerror = function (e) {
console.log('写入失败', e)
}
}
function read(name, callback) {
let objectStore = imgSrcDB.transaction(['imglist']).objectStore('imglist');
let request = objectStore.get(name);
request.onerror = function (e) {
console.log('读取数据事务失败', e);
callback(null)
};
request.onsuccess = function (e) {
if (e.target.result && e.target.result.src) {
let res = e.target.result.src
callback(res)
} else {
callback(null)
}
};
}
Object.defineProperty(HTMLImageElement.prototype, 'src', {
set(value) {
let res = value
let name = extractNumbers(res).join('')
let _this = this
function cb(res) {
if (res) {
_this.setAttribute('src', res)
} else {
_this.setAttribute('src', value)
imgUrlToBase64(value)
}
}
read(name, cb)
},
get() {
setTimeout(()=>{
let res = this.getAttribute('src')
return res
},1000)
}
})
function imgUrlToBase64(url) {
let list = url.split('/')
if (list[0] === 'http:' || list[0] === 'https:') {
let xhr = new XMLHttpRequest()
xhr.responseType = 'blob'
xhr.onload = function () {
let fileReader = new FileReader()
fileReader.onload = () => {
let Imgbase64 = fileReader.result
saveBase64ImgByDB(url, Imgbase64)
}
fileReader.readAsDataURL(xhr.response)
}
xhr.open("GET", url);
xhr.send();
}
}
async function saveBase64ImgByDB(url, data) {
let name = extractNumbers(url).join('')
add(name, data)
}
function extractNumbers(str) {
const pattern = /\d+/g;
const matches = str.match(pattern);
return matches ? matches.map(Number) : [];
}
}