## 前言
今天来谈谈一个小小的需求:
产品:说给我这个添加一个复制功能,点一下把内容给我复制到粘贴板上。
我:好嘞
我:说上就上,5分钟搞定,部署上去看一下,美滋滋,又是一天
5分钟过去了...
测试:测试通过,可以了
产品:复制提示成功了,但是没有在粘贴板上呢!!!
我和测试:蒙蔽了,咋会呢
产品:我的是苹果电脑
我和测试:靠,产品这么豪吗?都没想BUG,一心想着,自己那破电脑...
我:没办法了,只能看一下什么问题了...
我:又是5分钟过去了,发现:input自带的select()方法在苹果端无法进行选择,问题找出了,那就干吧。
...
### 先看看我5分钟CV出来的代码
``` js
// 点击复制到剪贴板函数
copyToClipboard(content) {
if (window.clipboardData) {
window.clipboardData.setData('text', content)
} else {
(function(content) {
document.oncopy = function(e) {
e.clipboardData.setData('text', content)
e.preventDefault()
document.oncopy = null
}
})(content)
document.execCommand('Copy')
}
```
* 注:ios下不能执行document.execCommand('copy')
在ios设备下`alert(document.execCommand('copy'))`一直返回`false`
查阅相关资料发现ios下input不支持`input.select();`
* 其他兼容问题:
input 输入框不能`hidden`或者`display: none`; 如果需要隐藏输入框可以使用定位脱离文档流,然后移除屏幕
### 解决input自带的select()方法在苹果端无法进行选择
直接上完整代码,看着就比较简单了
``` js
copyText(text) {
const textString = text.toString() // 数字没有 .length 不能执行selectText 需要转化成字符串
let input = document.querySelector('#copy-input')
if (!input) {
input = document.createElement('input')
input.id = 'copy-input'
input.readOnly = 'readOnly' // 防止ios聚焦触发键盘事件
input.style.position = 'absolute'
input.style.left = '-2000px'
input.style.zIndex = '-2000'
document.body.appendChild(input)
}
input.value = textString
// ios必须先选中文字且不支持 input.select();
this.selectText(input, 0, textString.length)
if (document.execCommand('copy')) {
document.execCommand('copy')
this.$message.success('复制成功!')
} else {
this.$message.success('复制失败!')
}
input.blur()
}
```
### input自带的select()方法在苹果端无法进行选择,所以需要自己去写一个类似的方法
``` js
// 选择文本。createTextRange(setSelectionRange)是input方法
selectText(textbox, startIndex, stopIndex) {
if (textbox.createTextRange) {
// ie
const range = textbox.createTextRange()
range.collapse(true)
range.moveStart('character', startIndex) // 起始光标
range.moveEnd('character', stopIndex - startIndex) // 结束光标
range.select() // 不兼容苹果
} else {
// firefox/chrome
textbox.setSelectionRange(startIndex, stopIndex)
textbox.focus()
}
}
```
## 兼容性补充:
必须手动触发 点击事件或者其他事件,不能直接使用js调用!!!
copyText('h5实现一键复制到粘贴板 兼容ios')
* 移动端:
安卓手机:微信(chrome)和几个手机浏览器都可以用;
苹果手机:微信里面和sarafi浏览器里也都可以;
* PC:
sarafi版本必须在10.2以上,其他浏览器可以。
## 总结
1.坑都是一步步填过来的,不要把没做过作为理由,犯了就改,这就是经验了,虽然表面上不是什么大问题,但是小心总是好的;
2.做事情需要考虑全面,不要让“所谓得小事”而不放在心上,小事如果多了,性质就不一样了
3.做事谨慎、谨慎、谨慎,重要得事情要说三次。
- 首页
- 2021年
- 基础知识
- 同源策略
- 跨域
- css
- less
- scss
- reset
- 超出文本显示省略号
- 默认滚动条
- 清除浮动
- line-height与vertical-align
- box-sizing
- 动画
- 布局
- JavaScript
- 设计模式
- 深浅拷贝
- 排序
- canvas
- 防抖节流
- 获取屏幕/可视区域宽高
- 正则
- 重绘重排
- rem换算
- 手写算法
- apply、call和bind原理与实现
- this的理解-普通函数、箭头函数
- node
- nodejs
- express
- koa
- egg
- 基于nodeJS的全栈项目
- 小程序
- 常见问题
- ec-canvas之横竖屏切换重绘
- 公众号后台基本配置
- 小程序发布协议更新
- 小程序引入iconfont字体
- Uni-app
- 环境搭建
- 项目搭建
- 数据库
- MySQL数据库安装
- 数据库图形化界面常用命令行
- cmd命令行操作数据库
- Redis安装
- APP
- 控制缩放meta
- GIT
- 常用命令
- vsCode
- 常用插件
- Ajax
- axios-services
- 文章
- 如何让代码更加优雅
- 虚拟滚动
- 网站收藏
- 防抖节流之定时器清除问题
- 号称破解全网会员的脚本
- 资料笔记
- 资料笔记2
- 公司面试题
- 服务器相关
- 前端自动化部署-jenkins
- nginx.conf配置
- https添加证书
- shell基本命令
- 微型ssh-deploy前端部署插件
- webpack
- 深入理解loader
- 深入理解plugin
- webpack注意事项
- vite和webpack区别
- React
- react+antd搭建
- Vue
- vue-cli
- vue.config.js
- 面板分割左右拖动
- vvmily-admin-template
- v-if与v-for那个优先级高?
- 下载excel
- 导入excel
- Echart-China-Map
- vue-xlsx(解析excel)
- 给elementUI的el-table添加骨架
- cdn引入配置
- Vue2.x之defineProperty应用
- 彻底弄懂diff算法的key作用
- 复制模板内容
- 表格操作按钮太多
- element常用组件二次封装
- Vue3.x
- Vue3快速上手(第一天)
- Vue3.x快速上手(第二天)
- Vue3.x快速上手(第三天)
- vue3+element-plus搭建项目
- vue3
- 脚手架
- vvmily-cli
- TS
- ts笔记
- common
- Date
- utils
- axios封装
- 2022年
- HTML
- CSS基础
- JavaScript 基础
- 前端框架Vue
- 计算机网络
- 浏览器相关
- 性能优化
- js手写代码
- 前端安全
- 前端算法
- 前端构建与编译
- 操作系统
- Node.js
- 一些开放问题、智力题