这个问题与SO中关于复制到剪贴板的其他问题不同,因为我想在小书签中运行一个函数,然后将结果复制到剪贴板。而且,如果没有外部库,是否可以在bookmarklet Javascript中执行此操作?

下面的小书签会从当前页面创建一个HTML链接,然后打开一个新的浏览器选项卡,并将HTML链接放入可以用键盘复制的文本区域。

但是,我如何跳过打开窗口并进行复制的步骤,而直接转到剪贴板呢?通过使用document.execCommand('copy')?其他方法?是否可以在没有外部库的情况下做到这一点,并通过bookmarklet Javascript做到?

在新标签中创建页面链接的书签:

javascript:function htmlEscape(s){s=s.replace(/&/g,'&');s=s.replace(/>/g,'>');
s=s.replace(/</g,'<');return s;} function linkEscape(s){s=s.replace(/&/g,'&');
s=s.replace(/"/,'"');return s} h = '<a href="' + linkEscape(location.href) + '" target="_blank">
<span class="tooltip" title="' + htmlEscape(document.title) + '">' + htmlEscape(document.title)
 + '</span></a>'; with(window.open().document){write(h+'<form name=f>
<textarea  name=a rows=5 cols=80 wrap=hard>'+htmlEscape(h)+'</textarea></form>');
close(); f.a.select(); } void 0


我可以看到生成HTML的部分出现在名为h的变量中:

javascript:function htmlEscape(s){s=s.replace(/&/g,'&');s=s.replace(/>/g,'>');
s=s.replace(/</g,'<');return s;} function linkEscape(s){s=s.replace(/&/g,'&');
s=s.replace(/"/,'"');return s} h =


我可以看到打开新窗口的函数部分:

with(window.open().document){write(h+'<form name=f><textarea  name=a rows=5
cols=80 wrap=hard>'+htmlEscape(h)+'</textarea></form>'); close(); f.a.select(); } void 0


如何将函数的内容(HTML链接)直接写到剪贴板?

最佳答案

问题Copy text to clipboard from bookmarklet没有指定是否允许使用外部库,所有现有答案都需要外部库。

想要在没有外部库的情况下执行此操作的其他限制要求使用其他方法。我也提供了以下有关其他问题的答案,但由于它不使用外部库,因此它也适用于这种情况。

Github Gist中有一个不错的小书市,它做the core of what you want -复制到剪贴板。它不使用任何外部库,我认为这是一个优势。

在编写时,它会复制一些静态文本,但是在底部,它讨论将其适应其他用途,例如复制页面标题。

原始的香草版本在Chrome 61上进行了任何修改,都非常适合我。但是请确保您已阅读评论;有些人对如何使其在其他浏览器和方案中正常运行提出了建议。

这是我测试过的代码,已经缩小并且可以转换为小书签:

javascript:!function(a){var b=document.createElement("textarea"),c=document.getSelection();b.textContent=a,document.body.appendChild(b),c.removeAllRanges(),b.select(),document.execCommand("copy"),c.removeAllRanges(),document.body.removeChild(b)}("Text To Copy");


吉斯特(Gist)也具有预先缩小的代码。

关于javascript - 如何在没有外部库的情况下从Javascript小书签复制到剪贴板?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40943812/

10-12 07:37