h5 实现一键复制到粘贴板 兼容iOS

2023-11-07

效果展示

先贴上测试连接 http://cdn.foundao.com/zhaosheng/copytext

实现原理

采用 document.execCommand(‘copy’) 来实现复制到粘贴板功能

复制必须是选中input框的文字内容,然后执行document.execCommand(‘copy’)命令实现复制功能。

初步实现方案(非完整代码):

// 此代码 在iOS下有bug,完整代码在最后贴出
const input = document.querySelector('#copy-input');
    if (input) {
      input.value = text;
      if (document.execCommand('copy')) {
        input.select();
        document.execCommand('copy');
        input.blur();
        alert('已复制到粘贴板');
      }
}

兼容性问题

1、input 输入框不能 hidden 或者 display: none;

如果需要隐藏输入框可以使用定位脱离文档流,然后移除屏幕

#copy-input{
  position: absolute;
  left: -1000px;
  z-index: -1000;
}

2.ios下不能执行 document.execCommand(‘copy’)

在ios设备下alert(document.execCommand(‘copy’))一直返回false
查阅相关资料发现ios下input不支持input.select();

因此拷贝的文字必须存在,不能为空字符串,不然也不会执行复制空字符串的功能
参考这篇博客实现了ios下复制的功能 https://blog.csdn.net/VLilyV/…

主要是使用textbox.createTextRange方法选中输入框的文字

// input自带的select()方法在苹果端无法进行选择,所以需要自己去写一个类似的方法
// 选择文本。createTextRange(setSelectionRange)是input方法
function 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();
  }
}

3.ios设备上复制会触发键盘弹出事件

给 input 加上 readOnly 只读属性。

代码

踩完以上的坑,总结的代码如下

copyText (text)  {
    // 数字没有 .length 不能执行selectText 需要转化成字符串
    const textString = text.toString();
    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 = "-1000px";
      input.style.zIndex = "-1000";
      document.body.appendChild(input)
    }

    input.value = textString;
    // ios必须先选中文字且不支持 input.select();
    selectText(input, 0, textString.length);
    console.log(document.execCommand('copy'), 'execCommand');
    if (document.execCommand('copy')) {
      document.execCommand('copy');
      alert('已复制到粘贴板');
    }
    input.blur();

    // input自带的select()方法在苹果端无法进行选择,所以需要自己去写一个类似的方法
    // 选择文本。createTextRange(setSelectionRange)是input方法
    function 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以上,其他浏览器可以.
 兼容性测试网站:https://www.caniuse.com/
*/

git地址 https://github.com/zhaosheng8

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

h5 实现一键复制到粘贴板 兼容iOS 的相关文章

  • 从立即调用的匿名函数表达式返回 |它去哪里?

    如果我从立即调用的匿名函数表达式返回一个对象 它会去哪里 例如 这段代码中 foo 去了哪里 function var foo return foo 这有什么有用的应用吗 从自执行函数返回一个值而不将该返回值分配给结果变量只是一个无处可去的
  • Javascript 与 Python 关于 Python 'map()' 函数的比较

    Python中有一个函数叫做map这可以让你去 map someFunction x y z 并继续应用该功能的列表 是否有与此功能等效的 JavaScript 我现在刚刚学习Python 虽然我被告知javascript是函数式语言 但我
  • javascript 使用 onclick 创建按钮

    我正在尝试使用 javascript 创建一个具有 onclick 事件的按钮 该事件调用 head 中定义的函数 该函数接收相对于按钮的 dom 对象作为参数 我该怎么做呢 ex
  • 如何使用 axios / jest 测试失败的请求

    我创建了一个非常小的应用程序 如果您传递硬币和数量 它可以计算为某些加密货币支付的总价格 我想测试错误 但我总是收到 收到的承诺已解决而不是被拒绝 我相信这是因为如果 url 错误 axios 仍然会解决承诺 我遇到的第二个问题是 我尝试测
  • 使用闭包和自调用函数制作计数器

    我想知道为什么这段代码不起作用 var uniqueInteger function var counter 0 return function return counter console log uniqueInteger 0 cons
  • 来自 DataURL 的 Blob?

    Using FileReader s readAsDataURL 我可以将任意数据转换为数据 URL 有没有办法将数据 URL 转换回Blob使用内置浏览器 API 的实例 用户 Matt 一年前提出了以下代码 如何在javascript中
  • HTML5 服务器端事件:EventSource 与包装的 WebSocket

    HTML5 服务器发送事件 SSE API 是否只是 HTML5 WebSocket 之上的受限制的 基于事件的 API 在我看来 一个EventSource只是一个WebSocket that Cannot send data 使用tex
  • JavaScript 变量赋值与 OR 对比 if 检查[重复]

    这个问题在这里已经有答案了 在 JavaScript 中 我最近意识到你可以使用 OR 赋值的逻辑运算符 我想知道这是否被认为是不好的做法 特别是 我有一些具有可选数组输入的函数 如果输入是null or undefined我应该将它设置为
  • 是否可以将反应组件导出为非反应项目中的函数

    有没有办法在非 React 项目中将 React 组件导出为函数并传入 props 作为函数的参数 我最近用 create react app 完成了一个 React 项目 现在我想将它用于其他非 React 项目 纯 Javascript
  • 为什么将数据存储为元素的属性存在风险?

    我一直在读同样的东西 直接在 DOM 元素上存储属性值是有风险的 因为可能会发生内存泄漏 但有人可以更详细地解释这些风险吗 按属性 我假设您指的是 DOM 元素上的属性 DOM 元素上的自定义属性安全吗
  • 在 JavaScript 中比较表单中的两个数字

    当我尝试比较不同的数字时 数字发生变化 但文本部分保持不变 这只发生在较大 较小的情况下 而不会发生在 NaN 或相等的情况下 这是我的代码 function check var a document getElementById a va
  • ReactJS:从没有 onChange 事件的 props 中选择默认值?

    所以 我只是想知道我是否绝对需要在 React 中的选择组件上有一个 onChange 事件处理程序 我有一个道具传递我想要选择的选项的默认值 如果我有的话 它就没有问题
  • 将 NPM 包客户端与 nuxt 结合使用

    我对 nuxt 和 javascript 非常陌生 我正在尝试弄清楚如何在客户端使用我的应用程序的依赖项 我将它们列在我的 nuxt config js 中并使用 npm 安装 我也有一个文件 plugins导入它们的目录 不确定这是否好
  • 如何在 angularjs 中修剪()字符串?

    有角度特定的方法吗 如果没有 我应该使用内置的jquery 来做到这一点吗 如果我应该使用内置的jquery 如何在不使用 的情况下访问trim 函数 或者这是必要的 编辑 是的 我知道 str trim 对不起 我需要这个才能在 IE 8
  • Postman - 如何计算 JSON 响应中特定对象的出现次数

    我是 JSON 和 Postman 的新手 我相信我正在尝试做一些非常简单的事情 我创建了一个 GET 请求 它将获得如下所示的 JSON 响应 在下面的例子中我想得到count响应中所有 IsArchived 属性 这些属性的数量因响应而
  • Meteor.js 登录事件

    因此 我对 Meteor 框架和 JavaScript 总体来说还很陌生 但我正在使用该框架开发一个小项目 以尝试让自己达到标准 基本上我正在开发一个微博客网站 目前 用户可以通过多种服务登录 fb google 等 我通过插入所需 url
  • 使用 Lodash 的 TypeScript:_.map(["123", " 234 "], _.trim) 返回 boolean[]?

    我有一个字符串数组 它们已像这样分割 var searchValue 600 800 123 180 var groups searchValue split gt 600 800 123 180 因此项目周围可能存在空格 并且我想删除空格
  • 为什么我需要 $(document.body) 来使用 Mootools Element 方法扩展 document.body?

    因此 在尝试让我的应用程序在最新的 IE 上运行后 结果发现 IE 不喜欢以下代码 document body getElement className Firefox 和 Chrome 响应良好 但是document bodyIE 上没有
  • 有没有办法防止输入 type=“number” 获得多个点值?

    我只想得到十进制值 如 1 5 0 56 等 但它允许多个点 有什么办法可以预防吗 您可以使用pattern属性
  • 如何根据所需表单输入的值更改 CSS 样式

    我想知道如何编写 javascript 来改变所需的表单元素的样式 如果它们有价值的话就改变它们 我想要做的是当所需的文本字段为空时 在它们周围有一个彩色边框 并在它们有值时删除边框样式 我想做的是编写一个 javascript 函数来检查

随机推荐

  • 都2023年了,还有必要学SSH框架吗

    在Web开发中 框架是开发效率和代码质量的保障 SSH框架是指结合了Struts2 Spring和Hibernate3三个开源框架所形成的一种框架 那么 在2023年 我们是否仍然需要学习SSH框架呢 本文将进行探讨 分析SSH框架的优缺点
  • 高中信息技术python知识点_高中信息技术《Python语言》模块试卷

    高中信息技术 Python语言 模块试卷 由会员分享 可在线阅读 更多相关 高中信息技术 Python语言 模块试卷 3页珍藏版 请在人人文库网上搜索 1 区县 姓名 座号 密 封 线 高中信息技术Python语言模块试卷本试卷分为五大题
  • 攻防世界Web:Web_php_wrong_nginx_config

    首先进来是一个登录页面 通过御剑扫描 发现了robots txt 打开发现两个php文件 hint php Hack php是跳转到登录页面 抓包看看Hack php 发现了可疑的点Cookie isLogin 0 不妨修改为1 进入控制中
  • Docker 自动启动和容器自动启动

    一 docker 服务启动启动 开启 docker 自启动 systemctl enable docker service 关闭 docker 自启动 systemctl disable docker service 二 docker 容器
  • C++ 线程局部变量thread_local

    本文转自 https blog csdn net aguoxin article details 103968031 Linux中的线程局部存储 一 本章节转自 https blog csdn net cywosp article deta
  • 北京大学肖臻老师《区块链技术与应用》公开课笔记13——BTC匿名性篇2(零知识证明)

    北京大学肖臻老师 区块链技术与应用 公开课笔记 比特币回顾问答篇 对应肖老师视频 click here 全系列笔记请见 click here About Me 点击进入我的Personal Page 匿名性部分第一节 匿名性分析请见 cli
  • UncaughtExceptionHandler异常处理机制

    解释 UncaughtExceptionHandler类是java1 5里新增的 Thread类里面的一个函数式接口类的 类名意思为 未捕获的异常处理 该类的注释接口意思 接口处理器时调用线程突然终止 由于未捕获到异常 当一个线程要终止由于
  • mysql json字段长度_mysql5.7 新增的json字段类型

    一 我们先创建一个表 准备点数据 CREATE TABLE json test id int 11 unsigned NOT NULL AUTO INCREMENT COMMENT ID json json DEFAULT NULL COM
  • java什么场景使用克隆,Java设计模式----原型模式(克隆模式)

    场景 思考一下 克隆技术是怎么样的过程 JavaScript语言中的 继承怎么实现 那里面也有prototype 原型模式 通过new产生一个对象需要繁琐的数据准备或访问权限 则可以使用原型模式 就是java中的克隆技术 以某个对象为原型
  • Qt 搜索框

    一 前言 用户需要输入文本时 可使用QLineEdit控件进行编辑输入 缺点是样式相对单一 在使用百度搜索输入框时 发觉比较人性化 故采用QLineEdt QPushButton通过css样式实现自定义搜索框控件 包含如下功能 1 可设置占
  • 用 ChatGPT 解锁生成式游戏#StoryGames.AI

    生成式游戏 AI 是一种基于人工智能技术 自动生成游戏故事情节 关卡 角色等内容的游戏 AI ChatGPT 的发展生成式游戏 AI 产生了重要影响 为游戏开发者提供了更加灵活 自由的创作方式 每个人都有机会开发自己的专属游戏 StoryG
  • 调试最长的一帧(第16天)

    终于到达绘制了 先看总体流程阶段 然而 从并行堆栈上看 已经有渲染线程开启了 跟着电子书走 先是介绍 抄一抄 加深印象 osg的场景渲染过程可以简单地分为三个阶段 用户APP阶段 更新用户数据 负责场景对象的运动和管理等 筛选cull阶段
  • 这是基于maven管理的SpringBoot项目的mongodb测试笔记,只测试了最基本的增删改查和一些踩过的坑。

    这是基于maven管理的SpringBoot项目的mongodb测试笔记 只测试了最基本的增删改查和一些踩过的坑 一 项目的依赖配置
  • 小米万兆路由器安装homeassistant并接入homekit教程

    1 做好准备工作 正常运行docker并启动docker命令行 参考参考链接中的b站视频 2 拉取homeassistant docker pull homeassistant home assistant 3 设置homeassistan
  • 浅谈依赖注入

    最近几天在看一本名为Dependency Injection in NET 的书 主要讲了什么是依赖注入 使用依赖注入的优点 以及 NET平台上依赖注入的各种框架和用法 在这本书的开头 讲述了软件工程中的一个重要的理念就是关注分离 Sepa
  • mysql数据库的优缺点

    优点1 通常存储过程 标题有助于提高应用程序的性能 因为当你创建他的时候就已经编译了 只不过是按需编译的 2 存储过程有助于减少应用程序和数据库服务器之间的流量 因为应用程序不必发送多个冗长的SQL语句 而只能发送存储过程的名称和参数 3
  • IDEA卡死解决

    找到IDEA的安装目录bin 修改这个文件 修改为 Xms128m Xmx1024m XX MaxPermSize 250m XX ReservedCodeCacheSize 150m
  • STM32外部中断

    参考正点原子视频 外部中断概述 外部中断是单片机实时地处理外部事件的一种内部机制 当某种外部事件发生时 单片机的中断系统将迫使CPU暂停正在执行的程序 转而去进行中断事件的处理 中断处理完毕后 又返回被中断的程序处 继续执行下去 STM32
  • 大疆无人机的新玩法?Payload SDK 了解一下

    一则小新闻 两个新产品 美国时间 3 月 28 日 大疆在加州门洛帕克的消防局总局低调发布了两款新的产品 一款是此前与 FLIR 合作开发的热成像相机 Zenmuse XT 的升级产品 Zenmuse XT2 另一款则是钟德夫更为关注并且会
  • h5 实现一键复制到粘贴板 兼容iOS

    效果展示 先贴上测试连接 http cdn foundao com zhaosheng copytext 实现原理 采用 document execCommand copy 来实现复制到粘贴板功能 复制必须是选中input框的文字内容 然后