【问题标题】:Custom select function with copy to clipboard pure JS自定义选择功能与复制到剪贴板纯 JS
【发布时间】:2016-01-18 00:06:26
【问题描述】:

当前代码附加了一个按钮,用于快速选择<pre> 标记中的一些代码。我要添加的是能够将该内容复制到剪贴板并将按钮文本更改为“已复制”。

如何通过修改下面的当前工作代码来实现它?我不介意使用自 Chrome 43 以来引入的 clipboard.js、jQuery 位或仅支持原生 JS。我只是不知道如何从这里继续添加我需要的内容。

function selectPre(e) {
    if (window.getSelection) {
        var s = window.getSelection();
        if (s.setBaseAndExtent) {
            s.setBaseAndExtent(e, 0, e, e.innerText.length - 1);
        }
        else {
            var r = document.createRange();
            r.setStart(e.firstChild, 0);
            r.setEnd(e.lastChild, e.lastChild.textContent.length);
            s.removeAllRanges();
            s.addRange(r);
        }
    }
    else if (document.getSelection) {
        var s = document.getSelection();
        var r = document.createRange();
        r.selectNodeContents(e);
        s.removeAllRanges();
        s.addRange(r);
    }
    else if (document.selection) {
        var r = document.body.createTextRange();
        r.moveToElementText(e);
        r.select();
    }
}
var diff = document.getElementById('diff_table').getElementsByTagName('tr');
var difflen = diff.length;
for(i=0; i<difflen; i++) {
    var newdiff = diff[i].childNodes[1];
    if (newdiff.className && (newdiff.className == 'added' || newdiff.className == 'modified')) {
        newdiff.className += ' diff-select';
        newdiff.innerHTML = '<div class="btnbox"><button class="btn btn-default btn-xs" onclick="selectPre(this.parentNode.nextSibling)">Select</button></div>' + newdiff.innerHTML;
    }
} 

【问题讨论】:

  • 能否添加相关的html示例?
  • 请添加与实际尝试使用clipboard.js 或您提到的其他解决方案之一相关的相关代码。现在看起来就像你把代码交给我们并要求我们向其中注入解决方案。
  • 是的,这就是目的。如果我有解决方案,我就不会在这里 :) 当前代码有效(它在点击时选择代码),我缺少的是复制到剪贴板的内容和点击时“复制”的文本。
  • 我尝试复制一个 jsfeedle 但它不起作用。它出现时未定义。但是代码在我的服务器上运行良好。

标签: javascript jquery html clipboard.js


【解决方案1】:

由于某种原因,在 jsfiddle 上复制案例时确实找不到您的 selectPre 函数。 Jsfiddle 可能会摆脱它认为是死代码或重命名它以缩小规模。

但是,如果它所做的是选择 &lt;pre&gt; 标记的内容,则 clipboard.js 库(您可以使用)已经可以自行完成。

因此,您最终需要正确配置剪贴板对象。使用那个:

new Clipboard('.btn', {
    // The targeting to the correct content is done here.
    target: function(trigger) {
        return trigger.parentNode.nextSibling;
    }
    // clipboard.js will take the entire inner content of the <pre>,
    // I think this is what you are trying to do in your "selectPre"
    // function, but I am not sure.
});

它模仿了您不再需要附加到按钮的 onclick 属性的 selectPre(this.parentNode.nextSibling)。

演示:http://jsfiddle.net/5k60nm1y/

请注意,我必须猜测您的表结构是什么。它可能与您的实际表格不同,因此您可能需要微调 newdiff 分配给正确单元格的方式。

如果您需要比&lt;pre&gt; 标记的内部内容更复杂的内容,您可以通过将自定义函数传递给剪贴板构造函数选项的text 属性来微调剪贴板对象的行为,而不是使用target 属性。检查剪贴板主页,它是不言自明的。

正如 Zac 所提到的,如果您可以共享您的 HTML 表格,您就会使人们的任务变得更容易(并且您可能会更快地收到解决方案)。我不需要猜测和创造一个假的。此外,我为您提供的代码将直接适用于您的真实表,而现在它可能仍需要自定义。希望我猜对了,我的桌子离你很近。

【讨论】:

  • 我设法适应了它并让它发挥作用。非常感谢!
【解决方案2】:

我将此资源How do I copy to the clipboard in JavaScript? 中的一段代码应用于您的代码,以便您轻松了解如何完成。

我还将您的onclick="selectPre(...)" 修改为onclick="selectPre(this)",并在“selectPre”函数中添加了几个变量。

这里也是Fiddle demo

function selectPre(b) {
    var s;                               // added - selection variable
    var e = b.parentNode.nextSibling;    // added - parent sibling element
    if (window.getSelection) {
        var s = window.getSelection();
        if (s.setBaseAndExtent) {
            s.setBaseAndExtent(e, 0, e, e.innerText.length - 1);
        }
        else {
            var r = document.createRange();
            r.setStart(e.firstChild, 0);
            r.setEnd(e.lastChild, e.lastChild.textContent.length);
            s.removeAllRanges();
            s.addRange(r);
        }
    }
    else if (document.getSelection) {
        var s = document.getSelection();
        var r = document.createRange();
        r.selectNodeContents(e);
        s.removeAllRanges();
        s.addRange(r);
    }
    else if (document.selection) {
        var s = document.body.createTextRange();
        s.moveToElementText(e);
        s.select();
    }

    // added - copy and change button text
    if (s) {
        try {
            var successful = document.execCommand('copy');
            // var msg = successful ? 'successful' : 'unsuccessful';
            // console.log('Copying text command was ' + msg);
            if (successful) {
                b.innerHTML = "Copied";
            }
        } catch (err) {
            // console.log('Oops, unable to copy');
        }
    }
}
var diff = document.getElementById('diff_table').getElementsByTagName('tr');
var difflen = diff.length;
for(i=0; i<difflen; i++) {
    var newdiff = diff[i].childNodes[1];
    if (newdiff.className && (newdiff.className == 'added' || newdiff.className == 'modified')) {
        newdiff.className += ' diff-select';

        // altered - onclick handler
        newdiff.innerHTML = '<div class="btnbox"><button class="btn btn-default btn-xs" onclick="selectPre(this)">Select</button></div>' + newdiff.innerHTML;
    }
}

【讨论】:

  • 我喜欢你在这里所做的,这个解决方案也很有效。当我第一次阅读时,我最终选择了上面的那个。
  • 我的回答是让您“了解”它的工作原理,使其更容易理解,然后从中学习如何/可以做什么,所以我很高兴它起作用了。 ..然后你选择最适合你的。
猜你喜欢
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多