您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
划词翻译
当前为
// ==UserScript== // @name translator // @namespace https://lufei.so // @supportURL https://github.com/intellilab/translator.user.js // @description 划词翻译 // @version 1.5.5 // @run-at document-start // @grant GM_addStyle // @grant GM_xmlhttpRequest // ==/UserScript== function play(query, type) { audio.src = 'http://dict.youdao.com/dictvoice?audio=' + window.encodeURIComponent(query) + '&type=' + type } function htmlEntities(s) { var o = { '<': '<', '&': '&', } return s.replace(/[<&]/g, function (c) { return o[c] }) } function render(o) { // variable var us, uk, x, i // element var header, explains, web, translation if (o.errorCode) return panelBody.innerHTML = '' if (o.basic) { us = htmlEntities(o.basic['us-phonetic'] || '') uk = htmlEntities(o.basic['uk-phonetic'] || '') query = o.query || '' header = document.createElement('div') header.className = randKey + ' ' + randKey + '-header' header.innerHTML = '<span style="color: #333">' + htmlEntities(query) + '</span>' + '<span data-type="1">uk:[' + uk + ']</span>' + '<span data-type="2">us:[' + us + ']</span>' panelBody.appendChild(header) header.addEventListener('click', function(e) { e.target.dataset.type && play(query, e.target.dataset.type) }) if (o.basic.explains) { explains = document.createElement('ul') explains.className = randKey + ' ' + randKey + '-detail' for (i = 0; i < o.basic.explains.length; i++) { x = document.createElement('li') x.className = randKey x.innerHTML = o.basic.explains[i] explains.appendChild(x) } panelBody.appendChild(explains) } } else if (o.translation) { translation = document.createElement('div') translation.className = randKey translation.innerHTML = o.translation[0] panelBody.appendChild(translation) } } function translate(e) { var sel = window.getSelection() var text = sel.toString() if (/^\s*$/.test(text)) return if (['input', 'textarea'].indexOf(document.activeElement.tagName.toLowerCase()) < 0 && !document.activeElement.contains(window.getSelection().getRangeAt(0).startContainer)) return GM_xmlhttpRequest({ method: 'GET', url: 'https://fanyi.youdao.com/openapi.do?relatedUrl=http%3A%2F%2Ffanyi.youdao.com%2Fopenapi%3Fpath%3Dweb-mode&keyfrom=test&key=null&type=data&doctype=json&version=1.1&q=' + window.encodeURIComponent(text), onload: function (res) { var data = JSON.parse(res.responseText) var w = window.innerWidth, h = window.innerHeight if (!data.errorCode) { render(data) if (e.clientY > h * .5) { panel.style.top = 'auto' panel.style.bottom = h - e.clientY + 10 + 'px' } else { panel.style.top = e.clientY + 10 + 'px' panel.style.bottom = 'auto' } if (e.clientX > w * .5) { panel.style.left = 'auto' panel.style.right = w - e.clientX + 'px' } else { panel.style.left = e.clientX + 'px' panel.style.right = 'auto' } document.body.appendChild(panel) } } }) } var panel, panelBody, panelPos, audio audio = document.createElement('audio') audio.autoplay = true var randKey = 'it-' + Math.random().toString(16).slice(2, 8) GM_addStyle( '.' + randKey + '{' + [ 'margin: 0', 'padding: 0', 'box-sizing: border-box', ].join(';') + '}' + '.' + randKey + '-panel{' + [ 'position: fixed', 'max-width: 300px', 'z-index: 10000', ].join(';') + '}' + '.' + randKey + '-body{' + [ 'position: relative', 'padding: 8px', 'border-radius: 4px', 'border: 1px solid #eaeaea', 'line-height: 24px', 'color: #555', 'background-color: #fff', 'font-family: monospace, consolas', 'font-size: 14px', 'text-align: left', 'word-break: break-all', ].join(';') + '}' + '.' + randKey + '-header{' + [ 'padding: 0 0 8px', 'border-bottom: 1px dashed #aaa', ].join(';') + '}' + '.' + randKey + '-header>[data-type]{' + [ 'margin-left: 8px', 'color: #7cbef0', 'cursor: pointer', 'font-size: 13px' ].join(';') + '}' + '.' + randKey + '-detail{' + [ 'margin: 8px 0 0', 'line-height: 22px', 'list-style: none', 'font-size: 13px' ].join(';') + '}' ) panel = document.createElement('div') panel.className = randKey + ' ' + randKey + '-panel' panelBody = document.createElement('div') panelBody.className = randKey + ' ' + randKey + '-body' panel.appendChild(panelBody) document.addEventListener('mousedown', function (e) { if (panel.contains(e.target)) return panel.parentNode && panel.parentNode.removeChild(panel) panelBody.innerHTML = '' }, true) document.addEventListener('mouseup', function (e) { if (panel.contains(e.target)) return setTimeout(translate, 0, e) }, true)