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!
}
});
})();