vue复制链接操作

  • 给要复制的文本或者按钮加上点击事件后,并将要复制的值传过来

使用clipboard

clipboard属性

解释
read从剪贴板读取数据(比如图片)
readText从操作系统读取文
write写入任意数据至操作系统剪贴板
writeText写入文本至操作系统剪贴板

代码实现

 async copyLink(val) {
   //val 你要复制的文本
   return navigator.clipboard.writeText(val);
}
  • 成功实现

发布测试出现问题

TypeError: Cannot read properties of undefined (reading ‘writeText’)

问题分析

在这里插入图片描述

Navigator的clipboard属性是有使用限制的
像我们的本地localhost或者https都属于安全上下文
而测试的机器里,因为是自己的ip域,并不是https,所以就无法读取到clipboard

解决方案

  • 检测是否存在于安全上下文、以及clipboard是否可用
  • window.isSecureContext属性返回一个布尔值,表示当前窗口是否处在加密环境。
  • 如果是 HTTPS 协议,就是true,否则就是false。
    在这里插入图片描述
  • 代码增加兼容非安全域实现
  • 在安全域下使用 navigator.clipboard 提升效率,非安全域退回到 document.execCommand(“copy”)

最终代码实现

  if (navigator.clipboard && window.isSecureContext) {
      this.$message.success("复制成功");
      return navigator.clipboard.writeText(val);
   }else{
     // 创建text area
        const textArea = document.createElement("textarea");
        textArea.value = val;
        // 使text area不在viewport,同时设置不可见
        document.body.appendChild(textArea);
        textArea.focus();
        textArea.select();
        this.$message.success("复制成功");
        return new Promise((res, rej) => {
          // 执行复制命令并移除文本框
          document.execCommand("copy") ? res() : rej();
          textArea.remove();
        });
   }

document.execCommand扩展

调用execCommand()可以实现浏览器菜单的很多功能. 如保存文件,打开新文件,撤消、重做操作…等等.
有了这个方法,就可以很容易的实现网页中的文本编辑器.

document.execCommand(sCommand[,交互方式, 动态参数])
- sCommand为指令参数(如下例中的”2D-Position”)
- 交互方式参数如果是true的话将显示对话框,如果为false的话,则不显示对话框
- 动态参数一般为一可用值或属性值

常用例子

 <input type=button value=剪切 οnclick=document.execCommand('Cut')>
 
 <input type=button value=拷贝 οnclick=document.execCommand('Copy')>
 
 <input type=button value=粘贴 οnclick=document.execCommand('Paste')>
 
 <input type=button value=撤消 οnclick=document.execCommand('Undo')>
 
 <input type=button value=删除 οnclick=document.execCommand('Delete')>
 
 <input type=button value=黑体 οnclick=document.execCommand('Bold')>
 
 <input type=button value=斜体 οnclick=document.execCommand('Italic')>
 
 <input type=button value=下划线 οnclick=document.execCommand('Underline')>
 
 <input type=button value=停止 οnclick=document.execCommand('stop')>
 
 <input type=button value=保存 οnclick=document.execCommand('SaveAs')>
 
 <input type=button value=另存为 οnclick=document.execCommand('Saveas',false,'c:""test.htm')>
 
 <input type=button value=字体 οnclick=document.execCommand('FontName',false,fn)>
 
 <input type=button value=字体大小 οnclick=document.execCommand('FontSize',false,fs)>
 
 <input type=button value=刷新 οnclick=document.execCommand('refresh',false,0)> 

/*该function执行copy指令*/

function fn_doufucopy() {

edit.select();

document.execCommand('Copy');

}

 

/*该function执行paste指令*/

function fn_doufupaste() {

tt.focus();

document.execCommand('paste');

}

 

/*该function用来创建一个超链接*/

function fn_creatlink() {

document.execCommand('CreateLink',true,'true');//弹出一个对话框输入URL

//document.execCommand('CreateLink',false,'http://www.51js.com');

}

 

/*该function用来将选中的区块设为指定的背景色*/

 

function fn_change_backcolor() {

document.execCommand('BackColor',true,'#FFbbDD');//true或false都可以

}

 

/*该function用来将选中的区块设为指定的前景色,改变选中区块的字体大小,改变字体,字体变粗变斜*/

function fn_change_forecolor() {

//指定前景色

document.execCommand('ForeColor',false,'#BBDDCC');//true或false都可以

//指定背景色

document.execCommand('FontSize',false,7);     //true或false都可以

//字体必须是系统支持的字体

document.execCommand('FontName',false,'标楷体');     //true或false都可以

//字体变粗

document.execCommand('Bold');

//变斜体

document.execCommand('Italic');

}

 

/*该function用来将选中的区块加上不同的线条*/

function fn_change_selection()

{

//将选中的文字加下划线

document.execCommand('Underline');

//在选中的文字上划粗线

document.execCommand('StrikeThrough');

//将选中的部分文字变细

document.execCommand('SuperScript');

//将选中区块的下划线取消掉

document.execCommand('Underline');

}

 

/*该function用来将选中的区块排成不同的格式*/

function fn_format() {

//有序列排列

document.execCommand('InsertOrderedList');

//实心无序列排列

document.execCommand('InsertUnorderedList');

//空心无序列排列

document.execCommand('Indent');

}

 

/*该function用来将选中的区块剪下或是删除掉*/

function fn_CutOrDel() {

//删除选中的区块

//document.execCommand('Delete');

//剪下选中的区块

document.execCommand('Cut');

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值