如何创建一键复制链接?

时间:2014-06-07 00:30:05

标签: javascript greasemonkey clipboard tampermonkey

对于此linkify plus脚本,我正在尝试使用hrefGM_Setclipboard链接一键复制到剪贴板。

如果相关网页仅查找并“链接”一个文本字符串,则脚本可以正常工作。如果它链接两个字符串,则单击复制功能适用于两个链接,但只会复制最后一个字符串以进行“链接”。

我甚至不确定我想要做什么是可能的。找到了一些使用flash + jQuery + zeroClipboard的类似问题/解决方法。但不确定我是否可以将其实现为Greasemonkey脚本。

// ==UserScript==
// @name        1Click_COPY
// @include     http*://www.w3schools.com/*
// $Revision: #2 $
// ==/UserScript==
// Originally written by Anthony Lieuallen of http://www.arantius.com/
// Licensed for unlimited modification and redistribution as long as this notice is kept intact.
//
// If possible, please contact me regarding new features, bugfixes
// or changes that I could integrate into the existing code instead of
// creating a different script.  Thank you

(function (){
    function linkify () {
        try {
            var notInTags=['a', 'head', 'noscript', 'option', 'script', 'style', 'title', 'textarea'];
            var res = document.evaluate("//text()[not(ancestor::"+notInTags.join(') and not(ancestor::')+")]",
                document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
            var i, el, l, m, p, span, txt, urlRE, linky;

            //The string you want to find using reg ex. This finds http to create links.
            urlRE=/\b(https?:\/\/[^\s+\"\<\>]+)/ig.

            for (i=0; el=res.snapshotItem(i); i++) {
                //grab the text of this element and be sure it has a URL in it
                txt=el.textContent;
                span=null;
                p=0;
                while (m=urlRE.exec(txt)) {
                    if (null==span) {
                        //create a span to hold the new text with links in it
                        span=document.createElement('span');
                    }

                    //get the link without trailing dots
                    l=m[0].replace(/\.*$/, '');
                    //put in text up to the link
                    span.appendChild(document.createTextNode(txt.substring(p, m.index)));
                    //create a link and put it in the span
                    a=document.createElement('a');
                    a.className='linkifyplus';
                    a.appendChild(document.createTextNode(l));

                    a.setAttribute('href', l);

                    //a.setAttribute('onclick', "return false");
                    //linky=a.getAttritube('href');
                    //a.setAttritube("onclick", function() { GM_setClipboard(l, 'text')
 } );
                    //copy text to clipboard

                    a.onclick = function() { GM_setClipboard(l, 'text'); return false};

                    span.appendChild(a);

                    p=m.index+m[0].length;
                }

                // This removes the non linked text
                if (span) {
                    //take the text after the last link
                    span.appendChild(document.createTextNode(txt.substring(p, txt.length)));
                    //replace the original text with the new span
                    el.parentNode.replaceChild(span, el);
                }
            }
        }
        catch(e) {dump('Linkify Plus Error ('+e.lineNumber+'): '+e+'\n');}
    }

    window.addEventListener("load", linkify, false);
} ) ();

2 个答案:

答案 0 :(得分:0)

使用Anthony Lieuallen最新的脚本v2.0.2。 GM_setClipboard现在就像魅力一样。见下文:

// ==UserScript==
// @name        Linkify Plus
// @version     2.0.2
// @namespace   http://arantius.com/misc/greasemonkey/
// @description Turn plain text URLs into links.    Supports http, https, ftp, email addresses.
// @grant GM_setClipboard
// ==/UserScript==

/*******************************************************************************
Loosely based on the Linkify script located at:
  http://downloads.mozdev.org/greasemonkey/linkify.user.js

Originally written by Anthony Lieuallen of http://arantius.com/
Licensed for unlimited modification and redistribution as long as
this notice is kept intact.

If possible, please contact me regarding new features, bugfixes
or changes that I could integrate into the existing code instead of
creating a different script.  Thank you.

Version history:
 Version 2.0.3:
  - Fix infinite recursion on X(HT)ML pages.
 Version 2.0.2:
  - Limit @include, for greater site/plugin compatibility.
 Version 2.0.1:
  - Fix aberrant 'mailto:' where it does not belong.
 Version 2.0:
  - Apply incrementally, so the browser does not hang on large pages.
  - Continually apply to new content added to the page (i.e. AJAX).
 Version 1.1.4:
  - Basic "don't screw up xml pretty printing" exception case
 Version 1.1.3:
  - Include "+" in the username of email addresses.
 Version 1.1.2:
  - Include "." in the username of email addresses.
 Version 1.1:
  - Fixed a big that caused the first link in a piece of text to
    be skipped (i.e. not linkified).
*******************************************************************************/

var notInTags=[
    'a', 'head', 'noscript', 'option', 'script', 'style', 'title', 'textarea'
];
var textNodeXpath=
    ".//text()[not(ancestor::ns:"+notInTags.join(') and not(ancestor::ns:')+")]";

//Insert Your personal Regex below.  (My example: ip + port in "xxx.xxx.xxx.xxx PORT" format)
var urlRE=/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s\d{1,5}\b/gi;

var queue=[];

/******************************************************************************/

linkifyContainer(document.body);
document.body.addEventListener('DOMNodeInserted', function(event) {
    linkifyContainer(event.target);
}, false);

/******************************************************************************/

function linkifyContainer(container) {
    var xpathResult=document.evaluate(
        textNodeXpath,
        container,
        { lookupNamespaceURI: function(prefix) { return container.namespaceURI; } },
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null
    ); 

    var i=0;
    function continuation() {
        var node, counter=0;
        while (node=xpathResult.snapshotItem(i++)) {
            linkifyTextNode(node);

            if (++counter>50) {
                return setTimeout(continuation, 0);
            }
        }
    }
    setTimeout(continuation, 0);
}

function linkifyTextNode(node) {
    var i, l, m;
    var txt=node.textContent;
    var span=null;
    var p=0;
    while (m=urlRE.exec(txt)) {
        if (null==span) {
            //create a span to hold the new text with links in it
            span=document.createElement('span');
        }

        //get the link without trailing dots
        l=m[0].replace(/\.*$/, '');
        //put in text up to the link
        span.appendChild(document.createTextNode(txt.substring(p, m.index)));
        //create a link and put it in the span
        a=document.createElement('a');
        a.appendChild(document.createTextNode(l));
        //if (l.match(/^www/i)) {
        //  l='http://'+l;
        //} else if (-1==l.indexOf('://')) {
        //  l='mailto:'+l;
        //}
        a.setAttribute('href', l);
        a.onclick = function() { GM_setClipboard(l, 'text'); return false};
        span.appendChild(a);
        //track insertion point
        p=m.index+m[0].length;
    }
    if (span) {
        //take the text after the last link
        span.appendChild(document.createTextNode(txt.substring(p, txt.length)));
        //replace the original text with the new span
        try {
            node.parentNode.replaceChild(span, node);
        } catch (e) {
            console.error(e);
            console.log(node);
        }
    }
}

答案 1 :(得分:-1)

http://www.htmlgoodies.com/beyond/javascript/article.php/3458851

看看这是否有帮助。 我现在正在打电话,所以不能探索太多。一旦我上系统,我会尝试。