V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
amiwrong123
V2EX  ›  程序员

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

  •  
  •   amiwrong123 · 2019-07-08 15:58:29 +08:00 · 2081 次点击
    这是一个创建于 1752 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用谷歌浏览器不好使,说谷歌不支持了。说用火狐可以。又用火狐,但火狐也不好使。代码如下,但总是报错 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);
    
            }
    

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

    9 条回复    2019-07-08 20:09:33 +08:00
    amiwrong123
        1
    amiwrong123  
    OP
       2019-07-08 16:21:40 +08:00
    还是说,我得在火狐的配置文件里面改什么吗? about:config 里面的 clipboard.autocopy 已经被我改成 true 了,但还是不好使。
    caocong
        2
    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
        3
    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
        4
    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
        5
    amiwrong123  
    OP
       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
        6
    amiwrong123  
    OP
       2019-07-08 17:38:34 +08:00
    @caocong
    我在看一下,能不能把粘贴板的内容,替换为谷歌翻译的右边框的内容(翻译后的内容)。
    caocong
        7
    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
        8
    amiwrong123  
    OP
       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
        9
    amiwrong123  
    OP
       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);


    };
    ```
    原来大括号可以把语句框起来,这样就可以了。这样就解决了左边框有换行的情况。再次感谢啦。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1003 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:54 · PVG 03:54 · LAX 12:54 · JFK 15:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.