您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Ctrl + q 复制页签标题;Alt + q 复制页签标题及链接,生成 markdown 格式
当前为
// ==UserScript== // @name Copy title // @name:zh-CN 便捷复制页签 title // @namespace http://tampermonkey.net/Henry // @version 1.0.1 // @description use Ctrl + q copy title; Alt + q copy title and url, create markdown // @description:zh-CN Ctrl + q 复制页签标题;Alt + q 复制页签标题及链接,生成 markdown 格式 // @author Henry // @icon https://tsz.netlify.app/img/favicon.png // @match http*://*/* // @license MIT // @resource css https://gitee.com/mirrors/jsMessage/raw/master/codebase/themes/message_solid.css // @grant GM_addStyle // @grant GM_getResourceText // ==/UserScript== (function () { 'use strict'; GM_addStyle(GM_getResourceText('css')); document.addEventListener('keydown', listener, false); function listener(event) { const { keyCode, ctrlKey, altKey } = event; if (keyCode === 81 && ctrlKey) { event.preventDefault(); event.stopPropagation(); copyTextToClipboard(document.title); return false; } if (keyCode === 81 && altKey) { event.preventDefault(); event.stopPropagation(); copyTextToClipboard(`[${document.title}](${location.href})`); return false; } } function copyTextToClipboard(text) { if (!navigator.clipboard) { fallbackCopyTextToClipboard(text); return; } navigator.clipboard.writeText(text).then( function () { wrapperMsg('Copying: ' + text); }, function (err) { wrapperMsg('Oops, unable to copy'); } ); } function wrapperMsg(input) { window.dhtmlx.message(input); } function fallbackCopyTextToClipboard(text) { let textArea = document.createElement('textarea'); textArea.value = text; // Avoid scrolling to bottom textArea.style.top = '0'; textArea.style.left = '0'; textArea.style.position = 'fixed'; document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { var successful = document.execCommand('copy'); var msg = successful ? text : ''; wrapperMsg('Copying: ' + msg); } catch (err) { wrapperMsg('Oops, unable to copy'); } document.body.removeChild(textArea); } })(); if(!window.dhtmlx) window.dhtmlx = {}; (function(){ var _dhx_msg_cfg = null; function callback(config, result){ var usercall = config.callback; modality(false); config.box.parentNode.removeChild(config.box); _dhx_msg_cfg = config.box = null; if (usercall) usercall(result); } function modal_key(e){ if (_dhx_msg_cfg){ e = e||event; var code = e.which||event.keyCode; if (dhtmlx.message.keyboard){ if (code == 13 || code == 32) callback(_dhx_msg_cfg, true); if (code == 27) callback(_dhx_msg_cfg, false); } if (e.preventDefault) e.preventDefault(); return !(e.cancelBubble = true); } } if (document.attachEvent) document.attachEvent("onkeydown", modal_key); else document.addEventListener("keydown", modal_key, true); function modality(mode){ if(!modality.cover){ modality.cover = document.createElement("DIV"); //necessary for IE only modality.cover.onkeydown = modal_key; modality.cover.className = "dhx_modal_cover"; document.body.appendChild(modality.cover); } var height = document.body.scrollHeight; modality.cover.style.display = mode?"inline-block":"none"; } function button(text, result){ return "<div class='dhtmlx_popup_button' result='"+result+"' ><div>"+text+"</div></div>"; } function info(text){ if (!t.area){ t.area = document.createElement("DIV"); t.area.className = "dhtmlx_message_area"; t.area.style[t.position]="5px"; document.body.appendChild(t.area); } t.hide(text.id); var message = document.createElement("DIV"); message.innerHTML = "<div>"+text.text+"</div>"; message.className = "dhtmlx-info dhtmlx-" + text.type; message.onclick = function(){ t.hide(text.id); text = null; }; if (t.position == "bottom" && t.area.firstChild) t.area.insertBefore(message,t.area.firstChild); else t.area.appendChild(message); if (text.expire > 0) t.timers[text.id]=window.setTimeout(function(){ t.hide(text.id); }, text.expire); t.pull[text.id] = message; message = null; return text.id; } function _boxStructure(config, ok, cancel){ var box = document.createElement("DIV"); box.className = " dhtmlx_modal_box dhtmlx-"+config.type; box.setAttribute("dhxbox", 1); var inner = ''; if (config.width) box.style.width = config.width; if (config.height) box.style.height = config.height; if (config.title) inner+='<div class="dhtmlx_popup_title">'+config.title+'</div>'; inner+='<div class="dhtmlx_popup_text"><span>'+(config.content?'':config.text)+'</span></div><div class="dhtmlx_popup_controls">'; if (ok) inner += button(config.ok || "OK", true); if (cancel) inner += button(config.cancel || "Cancel", false); if (config.buttons){ for (var i=0; i<config.buttons.length; i++) inner += button(config.buttons[i],i); } inner += '</div>'; box.innerHTML = inner; if (config.content){ var node = config.content; if (typeof node == "string") node = document.getElementById(node); if (node.style.display == 'none') node.style.display = ""; box.childNodes[config.title?1:0].appendChild(node); } box.onclick = function(e){ e = e ||event; var source = e.target || e.srcElement; if (!source.className) source = source.parentNode; if (source.className == "dhtmlx_popup_button"){ var result = source.getAttribute("result"); result = (result == "true")||(result == "false"?false:result); callback(config, result); } }; config.box = box; if (ok||cancel) _dhx_msg_cfg = config; return box; } function _createBox(config, ok, cancel){ var box = config.tagName ? config : _boxStructure(config, ok, cancel); if (!config.hidden) modality(true); document.body.appendChild(box); var x = config.left||Math.abs(Math.floor(((window.innerWidth||document.documentElement.offsetWidth) - box.offsetWidth)/2)); var y = config.top||Math.abs(Math.floor(((window.innerHeight||document.documentElement.offsetHeight) - box.offsetHeight)/2)); if (config.position == "top") box.style.top = "-3px"; else box.style.top = y+'px'; box.style.left = x+'px'; //necessary for IE only box.onkeydown = modal_key; box.focus(); if (config.hidden) dhtmlx.modalbox.hide(box); return box; } function alertPopup(config){ return _createBox(config, true, false); } function confirmPopup(config){ return _createBox(config, true, true); } function boxPopup(config){ return _createBox(config); } function box_params(text, type, callback){ if (typeof text != "object"){ if (typeof type == "function"){ callback = type; type = ""; } text = {text:text, type:type, callback:callback }; } return text; } function params(text, type, expire, id){ if (typeof text != "object") text = {text:text, type:type, expire:expire, id:id}; text.id = text.id||t.uid(); text.expire = text.expire||t.expire; return text; } dhtmlx.alert = function(){ var text = box_params.apply(this, arguments); text.type = text.type || "confirm"; return alertPopup(text); }; dhtmlx.confirm = function(){ var text = box_params.apply(this, arguments); text.type = text.type || "alert"; return confirmPopup(text); }; dhtmlx.modalbox = function(){ var text = box_params.apply(this, arguments); text.type = text.type || "alert"; return boxPopup(text); }; dhtmlx.modalbox.hide = function(node){ while (node && node.getAttribute && !node.getAttribute("dhxbox")) node = node.parentNode; if (node){ node.parentNode.removeChild(node); modality(false); } }; var t = dhtmlx.message = function(text, type, expire, id){ text = params.apply(this, arguments); text.type = text.type||"info"; var subtype = text.type.split("-")[0]; switch (subtype){ case "alert": return alertPopup(text); case "confirm": return confirmPopup(text); case "modalbox": return boxPopup(text); default: return info(text); break; } }; t.seed = (new Date()).valueOf(); t.uid = function(){return t.seed++;}; t.expire = 4000; t.keyboard = true; t.position = "top"; t.pull = {}; t.timers = {}; t.hideAll = function(){ for (var key in t.pull) t.hide(key); }; t.hide = function(id){ var obj = t.pull[id]; if (obj && obj.parentNode){ window.setTimeout(function(){ obj.parentNode.removeChild(obj); obj = null; },2000); obj.className+=" hidden"; if(t.timers[id]) window.clearTimeout(t.timers[id]); delete t.pull[id]; } }; })();