js获取剪切板内容
应用场景
在企业微信内部嵌入的网页需要获取剪切板的内容。
剪切板内容获取
读取剪切板navigator.clipboard
兼容性
navigator.clipboard.readText().then(
clipText => {
console.log("复制内容:",clipText);
})
腾讯会议获取会议时间、会议链接和会议号
navigator.clipboard.readText().then(
clipText => {
console.log("复制内容:",clipText);
//两个正则都可以只是第二个正则更方便我取值
//const time = /([0-9]{4}[\/][0-9]{2}[\/][0-9]{2})[\x20]([0-9|:|-]+)/;
const time = /([0-9]{4}[\/][0-9]{2}[\/][0-9]{2})[\x20]([0-9|:]+)([-])([0-9|:]+)/;
const url = /(http:\/\/|https:\/\/)((\w|=|\?|\.|\/|&|-)+)/;
const code = /(?<=\u4f1a\u8bae\u0020\u0049\u0044\uff1a)([0-9\x20]+)/;
time.exec(clipText)&&console.log("time结果:",time.exec(clipText)[0])
url.exec(clipText)&&console.log("url结果:",url.exec(clipText)[0])
code.exec(clipText)&&console.log("code结果:",code.exec(clipText)[0])
});
更新=========================
因为特殊原因无法使用微信提供的调试工具,所以使用的google浏览器进行调试。上面的代码在Google浏览器是没有任何问题的,但是在移动端使用时navigator没有clipboard的方法。
企业微信页面剪切板内容读取
微信提供的API
wx.getClipboardData({
success: function(res) {
console.log(res.data)
}
})
使用前记得通过config接口注入权限验证配,详细内容查看企业微信API文档
调用企业微信的获取剪切板内容的API后对数据进行解析,任然使用上文使用过的正则。
wx.getClipboardData({
success: function(res) {
console.log(res.data)
const url = /(http:\/\/|https:\/\/)((\w|=|\?|\.|\/|&|-)+)/;
const code = /(?<=\u4f1a\u8bae\u0020\u0049\u0044\uff1a)([0-9\x20]+)/;
url.exec(res.data)&&console.log("url结果:",url.exec(res.data)[0])
code.exec(res.data)&&console.log("code结果:",code.exec(res.data)[0])
}
})
iPhone无法进入页面
以上代码在安卓上可以正常运行,并且截取内容正确,但是iPhone却出现空白,无法进入页面,(这是真的坑,因为连页面也进不去完全不知道哪里错了,排查问题排查了一下午,TAT)最后发现问题是IOS不支持零宽断言
零宽断言
接下来的四个用于查找在某些内容的之前或之后的东西,但是有不包含这些内容本身的时候,零宽断言就起到作用了。也就是说它们像\b
,^
,$
那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言1
上文中使用到的(?<=exp)
就是零宽度正预测先行断言
所以iPhone直接挂了,(优秀)
修改正则
wx.getClipboardData({
success: function(res) {
console.log(res.data)
const url = /(http:\/\/|https:\/\/)((\w|=|\?|\.|\/|&|-)+)/;
const code = /([0-9]{3}[\x20][0-9]{3}[\x20][0-9]{3})|([0-9]{3}[-][0-9]{3}[-][0-9]{3})/;
url.exec(res.data)&&console.log("url结果:",url.exec(res.data)[0])
code.exec(res.data)&&console.log("code结果:",code.exec(res.data)[0])
}
})
去掉零宽断言就可以了
更新=========================
iPhone时间对比兼容问题
iPhone真的问题多多,在对比会议时间是否过期的时候遇到的时间对比异常的问题。
时间的格式是YYYY-MM-DD HH:MM:SS
,对比是否早于当前时间代码如下:
if(new Date('2021-12-22 10:55:00')>new Date){
console.log("没有过期");
}esle{
console.log("过期了");
}
以上代码在安卓和Google浏览器运行判断是正常的,但是在iPhone无论是什么情况返回都是false。因为iPhone识别的格式为YYYY/MM/DD HH:MM:SS
。
let time = '2021-12-22 10:55:00';
if(navigator.userAgent.includes("iPhone")){
time.replace(/-/g,"/");
}
if(new Date(time)>new Date){
console.log("没有过期");
}esle{
console.log("过期了");
}