怎么在火狐插件 Greasemonkey 里,写一个 js,获得粘贴板的内容,试了好多都不好使

2019-07-08 15:58:29 +08:00
 amiwrong123

用谷歌浏览器不好使,说谷歌不支持了。说用火狐可以。又用火狐,但火狐也不好使。代码如下,但总是报错 TypeError: window.clipboardData is undefined。对了,还试了 zeroclipboard,好像也不好使。本人的 js 有点菜,才会一点,求大神稍加指点了。

// ==UserScript==
// @name         谷歌翻译 粘贴板
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://translate.google.cn*
// @grant        GM_setClipboard
// @require      https://cdn.bootcss.com/clipboard.js/2.0.4/clipboard.js

// ==/UserScript==

var source = document.getElementById('source');
source.onfocus = function() {
    var w = window;
            var txt=window.clipboardData.getData("text");
            console.log(txt);

        }

代码就是想让焦点一旦到了谷歌翻译网页的左边框时,就把左边框的内容替换为粘贴板的内容。但现在根本获取不到啊。

2087 次点击
所在节点    程序员
9 条回复
amiwrong123
2019-07-08 16:21:40 +08:00
还是说,我得在火狐的配置文件里面改什么吗? about:config 里面的 clipboard.autocopy 已经被我改成 true 了,但还是不好使。
caocong
2019-07-08 17:06:19 +08:00
可以参考这个 api
https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator/clipboard
粘贴没问题
但谷歌翻译简单往 id 为 source 的 textarea 设置文本或者往 text-dummy 这个 div 里放文本都没有用
vanton
2019-07-08 17:07:03 +08:00
用法不对,事件只有 cut、copy、paste。

```js
var source = document.getElementById('source');

source.addEventListener("paste", function (e) {
if (!(e.clipboardData && e.clipboardData.items)) {
return;
}

for (var i = 0, len = e.clipboardData.items.length; i < len; i++) {
var item = e.clipboardData.items[i];

if (item.kind === "string") {
item.getAsString(function (str) {
// 字符串
console.log(str);
})
} else if (item.kind === "file") {
var pasteFile = item.getAsFile();
// 文件
console.log(pasteFile);
}
}
});
```
caocong
2019-07-08 17:13:06 +08:00
document.getElementById("source").onfocus = e => {
navigator.clipboard.readText().then(clipText => {
document.getElementById("source").value = clipText
}))}
前提要打开这个页面的剪切板权限
amiwrong123
2019-07-08 17:35:46 +08:00
@caocong
谢谢,好使了。但好使粘贴板里的内容如果是日文,好像有编码问题。我再百度百度吧。代码就是
```javascript
document.getElementById("source").onfocus = function(){
navigator.clipboard.readText().then(
clipText => {document.getElementById("source").value = clipText;})
}
```
amiwrong123
2019-07-08 17:38:34 +08:00
@caocong
我在看一下,能不能把粘贴板的内容,替换为谷歌翻译的右边框的内容(翻译后的内容)。
caocong
2019-07-08 18:09:58 +08:00
@amiwrong123
document.getElementById("source").onfocus = function(){
navigator.clipboard.readText().then(
clipText => {
document.getElementById("source").value = clipText
setTimeout(()=> navigator.clipboard.writeText(document.getElementsByClassName('tlid-translation')[0].children[0].innerText),2000)
})
}
writeText()就可以了 延时 2000ms 看你的网速了 或者用个循环取结果的值也行
amiwrong123
2019-07-08 18:22:52 +08:00
@caocong
刚才我还在想怎么解决,对话,延时就好了。谢谢大佬。
但如果左边框有换行符,有边框 tlid-translation 里面的 children 不止一个,类似于:
<span title="" class="">遷移 Transition to the Audio </span>
<br>
<span title="" class="">遷移 Transition to the Audio </span>
这个好像不好弄,看语法好像没法写循环啊
amiwrong123
2019-07-08 20:09:33 +08:00
@caocong
```javascript
document.getElementById("source").onfocus = function(){
navigator.clipboard.readText().then(
clipText => {document.getElementById("source").value = clipText;})
setTimeout(()=> {
var a = document.getElementsByClassName('tlid-translation')[0];
var result = ''
//console.log(a.children.length);
for (var i = 0; i < a.children.length; i++){
//console.log(a.children[i].tagName);
if(a.children[i].tagName == 'SPAN' )
{//console.log(a.children[i].innerText);
result += a.children[i].innerText;
}else{
result += '\n';
}
}
navigator.clipboard.writeText(result)},2000);


};
```
原来大括号可以把语句框起来,这样就可以了。这样就解决了左边框有换行的情况。再次感谢啦。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/581039

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX