// ==UserScript== // @name 保存图片 // @namespace sleasy_su // @match *://*/* // @grant GM_download // @grant GM_registerMenuCommand // @version 0.3 // @author - // @description alt+点击保存图片,列出页面所有图片,列出页面所有背景图 // @downloadURL none // ==/UserScript== /** * 0.2 * 1. improve saveImg() * 0.3 * 1. imporve close button style */ init(); function init(){ GM_registerMenuCommand('list bg', listBackgrounds); GM_registerMenuCommand('list img', listImages); document.body.addEventListener('click', saveImg); } function listBackgrounds(){ var nodes = document.body.querySelectorAll('*'); var backgrounds = []; var tmp = getBackground(document.body); tmp != null ? backgrounds.push(tmp) : null; backgrounds.forEach.call(nodes, v=>{ tmp = getBackground(v); tmp != null && backgrounds.includes(tmp) != true ? backgrounds.push(tmp) : null; }); showImages(backgrounds); function getBackground(node){ var bg = getComputedStyle(node).backgroundImage; if(bg.includes('url')){ return bg.replace(/.*url\("(.+)"\).*/, '$1'); }else{ return null; } } } function listImages(){ var images = getSrcs(document.images); showImages(images); } function showImages(imageSet){ var rawHTML = ''; var container = document.createElement('div'); var style = ` #userjs-image-container{width:50%; max-height: 95%; position:fixed; top:20px; box-shadow: 0 0 2px 1px #ddd; background:#fff; margin-left:25%; overflow:auto; z-index:999;} #userjs-image-list{padding:10px;} #userjs-image-list>img{max-width:80%; max-height:600px; display:block; padding:10px; margin:10px auto; border: 1px solid #ddd; border-radius:3px;} button#userjs-btn{position:absolute; top:5px; right:5px; width:2em; height:2em; line-height:2em; border:1px solid #999; background-color:#fff;}`; imageSet.forEach(v => { rawHTML += ''; }); container.innerHTML = '
' + rawHTML + '
'; container.id = 'userjs-image-container'; document.body.append(container); document.querySelector('#userjs-btn').addEventListener('click', ()=>{document.querySelector('#userjs-image-container').remove();}); addStyle(style); } function saveImg(e){ var t = e.target; if(e.altKey){ var img = null; e.preventDefault(); if(t.tagName == 'IMG'){ img = t; }else if(t.querySelectorAll('img').length > 1){ alert('当前目标有多个图片'); var images = getSrcs(t.querySelectorAll('img')); showImages(images); return; }else if(t.querySelector('img')){ img = t.querySelector('img'); }else{ alert('找不到图片,可尝试“list img”'); return; } var name = ''; if(t.alt != ''){ name = t.alt + t.src.replace(/.+\./, '.'); }else{ name = t.src.replace(/.+\//, ''); } GM_download(t.src, name); } } function getSrcs(imgs){ var urls = []; urls.forEach.call(imgs, v=>{ urls.includes(v.src) ? null : urls.push(v.src); }); return urls; } function addStyle(styleStr, mode='append', id='my-style') { var styleElement = document.getElementById(id); if (!styleElement) { styleElement = document.createElement('style'); styleElement.type = 'text/css'; styleElement.id = id; styleElement.innerHTML = styleStr; document.head.appendChild(styleElement);; } else { switch (mode) { case 'append': styleElement.innerHTML += styleStr; break; case 'override': styleElement.innerHTML = styleStr; break; } } }