偶尔会写一些 TamperMonkey
的脚本, 但每次间隔时间久了之后, 就经常忘记要怎么写了, 所以在这里记录一下一些常用的代码段, 有需要的时候可以直接拿来使用。
使用 insertAdjacentHTML
添加 HTML
代码
1 2 3 4 5 6 7 8 9 10 11
| let style = `<style> .sidebar { display: none !important; } .content{ margin: 0 !important; } </style>`;
document.head.insertAdjacentHTML('beforeend', style);
|
insertAdjacentHTML()
方法将指定的文本解析为 Element
元素,并将结果节点插入到 DOM
树中的指定位置
添加外部样式文件
1 2 3 4 5 6 7 8 9 10 11 12 13
|
function addLinkCss(href) { let link = document.createElement('link'); link.type = 'text/css'; link.rel = 'stylesheet'; link.href = href; document.head.appendChild(link); }
|
添加样式使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| let style = ` .acme-button{ position:fixed; bottom: 20px; right: 20px; color: red; padding: 15px; }
.acme-speed{ display: none; }
.acme-button:hover{ color: green; width: 300px; height: 200px; }
.acme-button:hover .acme-speed{ display:inline; }
.acme-shadow { box-shadow: 0 2px 12px 2px rgba(0, 0, 0, 0.1); border-radius: 8px; border: 1px solid #ebeef5; background-color: #fff; color: #303133; transition: 0.3s; }`;
document.head.insertAdjacentHTML('beforeend', style);
let htmL =` <div class="acme-button acme-shadow"> <span>show</span> <select name="speedx" class="acme-speed"> <option value="16">16.0x</option> <option value="12">12.0x</option> <option value="8">8.0x</option> <option value="6">6.0x</option> <option value="4">4.0x</option> <option value="2">2.0x</option> <option value="1">1.0x</option> <option value="0.5">0.5x</option> </select> </div> `;
document.body.insertAdjacentHTML('beforeend', html);
|
添加外部 JavaScript 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
function addLinkScript(src, cb, onerror) { let script = document.createElement("script"); script.type = "text/javascript"; script.src = src; console.log("addScript", script) document.querySelector('head').appendChild(script); script.onload = typeof cb === "function" ? cb : function () { }; script.onerror = typeof onerror === "function" ? onerror : function () { }; }
|
查找嵌套的 iframe
中的元素
如果网页内包含的 iframe
元素时, 其内部元素不能被直接定位查找, 查找iframe
内部元素方法如下:
1 2 3 4 5 6 7
| document.querySelectorAll('iframe').forEach( item => console.log(item.contentWindow.document.body.querySelectorAll('a')) );
document.querySelector("iframe").contentWindow.document.querySelector("button") ;
|
等待指定的时间
1 2 3 4 5 6 7 8 9 10 11 12
|
async function waitTime(s) { return new Promise((resolve, reject) => { setTimeout(() => { return resolve(); }, s * 1000); }); }
|
延迟查找元素
有一些网页元素不能被直接定位查找, 例如使用 JavaScript
框架渲染或是从服务器读取数据后渲染的网页(如Vue.js
)、 部分添加了反爬虫
措施的网页(故意等待几秒钟后才显示内容)等。这些网页的脚本可以在等到某个特定元素出现后再开始执行, 方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
async function untilLoaded(selector, parent = document, timeout = 10 * 1000) { return new Promise((resolve) => {
let result = parent.querySelector(selector); if (result) { return resolve(result); } let timer;
const observer = new MutationObserver((mutations) => { for (let mutation of mutations) { for (let addedNode of mutation.addedNodes) { if (addedNode instanceof Element) { result = addedNode.matches(selector) ? addedNode : addedNode.querySelector(selector); if (result) { observer.disconnect(); timer && clearTimeout(timer); return resolve(result); } } } } }); observer.observe(parent, { childList: true, subtree: true, }); timer = setTimeout(() => { observer.disconnect(); timer && clearTimeout(timer); console.log('查找元素超时, 找不到目标元素:', selector); return resolve(null); }, timeout); }); }
|
事件劫持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| const oldEventListener = EventTarget.prototype.addEventListener; EventTarget.prototype.addEventListener = function (...args) {
const events = ['visibilitychange', 'blur', 'copy', 'contextmenu', 'selectstart']; console.log('args:', args); if(window.onblur!==null){ window.onblur=null; } if(window.oncopy!==null){ window.oncopy=null; } if(window.oncontextmenu!==null){ window.oncontextmenu=null; } if(window.onselectstart!==null){ window.onselectstart=null; }
if (args.length !== 0 && events.includes(args[0])) { console.log(`劫持 ${args[0]} 事件成功! `) return; }
return oldEventListener.call(this, ...args) }
|