带有复制到剪贴板纯 JS 的自定义 select 函数
Custom select function with copy to clipboard pure JS
当前代码附加一个按钮以快速 select <pre>
标签中的一些代码。我想添加的是将该内容复制到剪贴板并将按钮文本更改为 "copied" 的功能。
如何通过修改下面的当前工作代码来实现它?我不介意使用 clipboard.js、jQuery 位或仅自 Chrome 43 以来引入的原生 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;
}
}
由于某种原因,在 jsfiddle 上重现案例时确实找不到您的 selectPre
函数。 Jsfiddle 可能会摆脱它认为是死代码的东西,或者为了缩小而重命名它。
但是如果它所做的是选择 <pre>
标签的内容,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.
});
它模仿您的 selectPre(this.parentNode.nextSibling)
,您不再需要附加到按钮的 onclick
属性。
演示:http://jsfiddle.net/5k60nm1y/
请注意,我不得不猜测您的 table 结构是什么。它可能与您实际的 table 不同,因此您可能需要微调 newdiff
分配给正确单元格的方式。
如果您需要比 <pre>
标签的内部内容更复杂的东西,您可以通过将自定义函数传递给 text
属性 的剪贴板构造函数选项,而不是使用 target
属性。检查剪贴板主页,这是不言自明的。
正如 Zac 所提到的,如果您可以分享您的 HTML table,您会让人们的任务变得更容易(并且您可能会更快地收到解决方案)。我不需要猜测和创造一个假的。此外,我提供给您的代码将直接适用于您的真实 table,而现在它可能仍需要定制。希望我猜对了,我的 table 和你的很接近。
我将此资源 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;
}
}
当前代码附加一个按钮以快速 select <pre>
标签中的一些代码。我想添加的是将该内容复制到剪贴板并将按钮文本更改为 "copied" 的功能。
如何通过修改下面的当前工作代码来实现它?我不介意使用 clipboard.js、jQuery 位或仅自 Chrome 43 以来引入的原生 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;
}
}
由于某种原因,在 jsfiddle 上重现案例时确实找不到您的 selectPre
函数。 Jsfiddle 可能会摆脱它认为是死代码的东西,或者为了缩小而重命名它。
但是如果它所做的是选择 <pre>
标签的内容,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.
});
它模仿您的 selectPre(this.parentNode.nextSibling)
,您不再需要附加到按钮的 onclick
属性。
演示:http://jsfiddle.net/5k60nm1y/
请注意,我不得不猜测您的 table 结构是什么。它可能与您实际的 table 不同,因此您可能需要微调 newdiff
分配给正确单元格的方式。
如果您需要比 <pre>
标签的内部内容更复杂的东西,您可以通过将自定义函数传递给 text
属性 的剪贴板构造函数选项,而不是使用 target
属性。检查剪贴板主页,这是不言自明的。
正如 Zac 所提到的,如果您可以分享您的 HTML table,您会让人们的任务变得更容易(并且您可能会更快地收到解决方案)。我不需要猜测和创造一个假的。此外,我提供给您的代码将直接适用于您的真实 table,而现在它可能仍需要定制。希望我猜对了,我的 table 和你的很接近。
我将此资源 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;
}
}