您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Choose your favorite DOM node and print its innerHTML in the console.
当前为
// ==UserScript== // @name ivnote-web-clipper // @namespace http://ivnote.xyz // @version 0.2 // @description Choose your favorite DOM node and print its innerHTML in the console. // @author Ivan Jiang // @match *://*/* // @grant GM_addStyle // ==/UserScript== /* globals GM_addStyle */ GM_addStyle(` .ivnote-hover { background: rgba(124, 201, 191, .7); } .ivnote-web-clipper-icon { position: fixed; bottom: 10px; right: 10px; height: 50px; width: 50px; border-radius: 50%; background: RGBA(124, 201, 191, .6) url('//maxcdn.icons8.com/Color/PNG/96/Editing/cut-96.png') no-repeat center center / 80%; opacity: .7; cursor: pointer; transition: all .3s ease-in-out; z-index: 9999; } .ivnote-web-clipper-icon.ivnote-web-clipper-enable { opacity: 1; transform: rotate(180deg); } .ivnote-web-clipper-icon:hover { opacity: 1; transform: rotate(180deg) }`); (function() { 'use strict'; // Utils ============================================================================ var classCache = {}; var _ = { hasClass: hasClass, addClass: addClass, removeClass: removeClass, }; function hasClass(node, name) { if (!name) { return false; } return classRE(name).test(className(node)); } function addClass(node, name) { if (!name) { return node; } if (!('className' in node)) { return; } var classList = []; var cls = className(node); // get node's className name.split(/\s+/g).forEach(function(klass) { if (!hasClass(node, klass)) { classList.push(klass); } }); return classList.length && className(node, cls + (cls ? ' ' : '') + classList.join(' ')); } function removeClass(node, name) { if (!('className' in node)) { return; } if (name === undefined) { return className(node, ''); } let cls = className(node); name.split(/\s+/g) .forEach((klass) => cls = cls.replace(classRE(klass), ' ')); className(node, cls.trim()); } function classRE(name) { return name in classCache ? classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name + '(\\s|$)')); } // access className property while respecting SVGAnimatedString function className(el, value) { var klass = el.className || '', svg = klass && klass.baseVal !== undefined; // get className if (value === undefined) { return svg ? klass.baseVal : klass; } // set className return svg ? (klass.baseVal = value) : (el.className = value); } // Toggle icon ====================================================================== var toggle = document.createElement('div'); toggle.className = "ivnote-web-clipper-icon"; document.body.appendChild(toggle); var enable = false; toggle.addEventListener('click', function(e) { if (_.hasClass(toggle, 'ivnote-web-clipper-enable')) { // turn it off _.removeClass(toggle, 'ivnote-web-clipper-enable'); enable = false; } else { // turn it on _.addClass(toggle, 'ivnote-web-clipper-enable'); enable = true; } }); // Manipulate the doms ============================================================== document.addEventListener('mouseover', function(e) { if (enable) _.addClass(e.target, 'ivnote-hover'); }); document.addEventListener('mouseout', function(e) { if (enable) { _.removeClass(e.target, 'ivnote-hover'); // To be safe var select = document.querySelectorAll('.ivnote-hover'); Array.prototype.slice.call(select).forEach(function(el) { _.removeClass(el, 'ivnote-hover'); }); } }); document.addEventListener('click', function(e) { if (enable) { var el = e.target; console.log(el.outerHTML); // ====> BIU! SEND IT! } }); })();