当用户选中某段内容时window.getSelection()获取一个Selection对象,将这个`objSelection.tostring()`,就是选中区的内容,这里可以用` var selectionString = window.getSelection().toString()`在控制台查看,能在控制台查看说明我们就可以通过js获取到,selectionString + '自定义内容',到这里复制的原内容我们就有了。这里我们要创建一个DOM容器来存`objSelection.tostring()`,最好是可以换行的,如p、div、textarea等。
当一个HTML文档切换到设计模式时,document暴露 execCommand 方法,该方法允许运行命令来操纵可编辑内容区域的元素,这里主要用其中的copy命令来实现复制功能,听说插件Clipboard.js也是调用这个方法实现复制功能的`bool = document.execCommand(aCommandName, aShowDefaultUI, aValueArgument)`,第一个参数是命令的名称,字符串类型,后两个参数我们可以不用,返回bool值,如果是 false则表示操作不被支持或未被启用命令只介绍用到的copy命令:
>copy:拷贝当前选中内容到剪贴板。启用这个功能的条件因浏览器不同而不同,而且不同时期,其启用条件也不尽相同。使用之前请检查浏览器兼容表,以确定是否可用。
这是很重要的一步,这是复制内容的关键命令。这里我们只需要在正确的时间执行`document.execCommand('copy')`即可。
addEventListener()方法用于向指定元素添加事件句柄,这里我就抛开文档,就针对本次功能对这个HTML DOM方法进行通俗的解释了,这里主要用来规定我们自定义复制功能的有效DOM范围,来个例子:
//body中有<div id="test">content</div>
var el = document.getElementById('test')
el.addEventListener('copy', function (e){
// 触发copy事件后的处理
}
这个例子中我们实现的功能将只在id为test的DOM元素里有效,其它地方将恢复默认复制功能。
Range表示包含节点和部分文本节点的文档片段。用`var range = document.createRange()`方法创建,这里面为什么要创建Range呢,主要是用来存储Selection对象的开始位置和终点位置,因为我们是要阻止默认的copy事件,让copy的内容是用户选中的内容加上我们自定义的内容,再将这个内容放入粘贴板,形成最终的粘贴内容。`document.createRange`得到是还没有放内容的片段,我们我们还会用到`Range.setStart()`设置Range的起点和`Range.setEnd()`设置Range的终点。最终`selectionObj.removeAllRanges()`将selectionObj中的默认Range 去掉,`selectionObj.addRange(range)`,粘贴板就有了,不出意外去粘贴就会有选中的内容加自定义的内容了。
源码可以联系作者。这里有个特别注意的点,如果是原生js的话直接调用函数就可以,如果是vuejs的话图片中可以看到,我是在mounted()钩子函数里调用,而不是在created()钩子函数里调用,这里一定不能在created()钩子函数里调用,为什么呢?
因为created()执行的时候一般是在html渲染前的操作,此时el还是undefined,所以执行getElementById()就会报错,created()适合做html渲染前的数据初始化工作。而mounted()一般是在html渲染完成后的操作,此时el,data都已经加载完成,一般对dom的操作都写在mounted中,这是个要注意的点,喜欢的话就给作者点个心,谢谢
本篇文章不考虑浏览器兼容,谷歌浏览器亲测至少得88版本往上。Mac系统复制粘贴html数据,会自动加一些标签,小伙伴们自己测吧。一般需求用不着。
想要实现复制粘贴就只需要搞明白两件事就可以了。
第一就是如何往粘贴板里边存放数据,第二就是如何读取粘贴板里边的数据。
所操作的数据大致可以分为三类数据 1:字符串 2:带样式的HTML 3:图片 还有其他数据格式,还请各位小伙伴补充指教吧。
① 如果只是放普通字符串是最简单的
② 想要放入带格式的数据,比如想要往word内粘贴一个表格,跟正常写html标签加写样式是一样的
③往粘贴板内放入图片,目前只支持放png图片
其实也可以用放HTML的方式,把图片放入粘贴板内
1、最基本的复制Java代码
<script language="JavaScript">
function readTxt()
{
alert(window.clipboardData.getData("text"))
}
function setTxt()
{
var t=document.getElementById("txt")
t.select()
window.clipboardData.setData('text',t.createTextRange().text)
}
</script>
<input name="txt" value="测试">
<input type="button" value="复制" onclick="setTxt()">
<input type="button" value="读取" onclick="readTxt()">
2、扩展复制:复制表格
Java代码
<INPUT TYPE="button" value="选中测试表格" onclick="CopyTable()">
测试
<TABLE border="1" id="oTable">
<TR>
<TD>测试表格</TD>
<TD>测试表格</TD>
</TR>
<TR>
<TD>测试表格</TD>
<TD>测试表格</TD>
</TR>
</TABLE>文字
<SCRIPT LANGUAGE="JavaScript">
<!--
function CopyTable()
{
var txt = document.body.createTextRange()
txt.moveToElementText(document.getElementById('oTable'))
txt.select()
}
//-->
</SCRIPT>
、兼容IE,firefox等浏览器的复制
Java代码
<script>
function copyToClipboard(txt) {
if(window.clipboardData) {
window.clipboardData.clearData()
window.clipboardData.setData("Text", txt)
} else if(navigator.userAgent.indexOf("Opera") != -1) {
window.location = txt
} else if (window.netscape) {
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect")
} catch (e) {
alert("被浏览器拒绝!\n请在浏览器地址栏输入'about:config'并回车\n然后将'signed.applets.codebase_principal_support'设置为'true'")
}
var clip = Components.classes['@mozilla.org/widget/clipboard1'].createInstance(Components.interfaces.nsIClipboard)
if (!clip)
return
var trans = Components.classes['@mozilla.org/widget/transferable1'].createInstance(Components.interfaces.nsITransferable)
if (!trans)
return
trans.addDataFlavor('text/unicode')
var str = new Object()
var len = new Object()
var str = Components.classes["@mozilla.org/supports-string1"].createInstance(Components.interfaces.nsISupportsString)
var copytext = txt
str.data = copytext
trans.setTransferData("text/unicode",str,copytext.length*2)
var clipid = Components.interfaces.nsIClipboard
if (!clip)
return false
clip.setData(trans,null,clipid.kGlobalClipboard)
}
}
</script>
<button onclick="copyToClipboard('你好!')">复制文本“你好!”</button>
<textarea id="test"></textarea>