如何使用 jquery/javascript 在 safari 中复制到剪贴板?

2024-01-18

我研究了一堆答案和文章,它们展示了如何通过 jquery 在按钮单击时复制文本,但没有一个对我有用。我通过 ajax 将一个值附加到 DOM 中,我希望通过单击按钮来复制该值。

所有这些解决方案都可以在 chrome 上运行,如果使用 jsfiddle/codepen,则它们可以在 safari 中运行(版本:13.0.5),但是当通过单独的 html 和 js 文件使用时,它们不能在 safari 中运行,就我而言,无论如何。

首先,我尝试使用位置:绝对和左侧:-99999 进行不可见输入,并使用 jquery 选择其中的文本并使用 execCommand("copy");。这不起作用。 我也尝试过这里提到的答案:Safari 上的 Javascript 复制到剪贴板? https://stackoverflow.com/questions/40147676/javascript-copy-to-clipboard-on-safari

我还尝试了下面提到的两个功能,但没有成功。除了这些功能之外,我还尝试了我能找到的所有 javascript 插件,但这些插件也不起作用。

功能1:

function copy(value, showNotification, notificationText) {
  var $temp = $("<input>");
  $("body").append($temp);
  $temp.val(value).select();
  document.execCommand("copy");
  $temp.remove();
  $(".copyfrom").val(value)
  $(".copyfrom").select();
  document.execCommand("copy");

  //trigger animation---
  if (typeof showNotification === 'undefined') {
    showNotification = true;
  }
  if (typeof notificationText === 'undefined') {
    notificationText = "Copied to clipboard";
  }

  var notificationTag = $("div.copy-notification");
  if (showNotification && notificationTag.length == 0) {
    notificationTag = $("<div/>", { "class": "copy-notification", text: notificationText });
    $("body").append(notificationTag);

    notificationTag.fadeIn("slow", function () {
      setTimeout(function () {
        notificationTag.fadeOut("slow", function () {
          notificationTag.remove();
        });
      }, 1000);
    });
  }
}

功能2:

function copyToClipboard(textToCopy) {
  var textArea;

  function isOS() {
    return navigator.userAgent.match(/ipad|iphone/i);
  }

  function createTextArea(text) {
    textArea = document.createElement('textArea');
    textArea.readOnly = true;
    textArea.contentEditable = true;
    textArea.value = text;
    document.body.appendChild(textArea);
  }

  function selectText() {
    var range, selection;

    if (isOS()) {
      range = document.createRange();
      range.selectNodeContents(textArea);
      selection = window.getSelection();
      selection.removeAllRanges();
      selection.addRange(range);
      textArea.setSelectionRange(0, 999999);
    } else {
      textArea.select();
    }
  }

  function copyTo() {
    document.execCommand('copy');
    document.body.removeChild(textArea);
  }

  createTextArea(textToCopy);
  selectText();
  copyTo();

  //trigger animation---
  if (typeof showNotification === 'undefined') {
    showNotification = true;
  }
  if (typeof notificationText === 'undefined') {
    notificationText = "Copied to clipboard";
  }

  var notificationTag = $("div.copy-notification");
  if (showNotification && notificationTag.length == 0) {
    notificationTag = $("<div/>", { "class": "copy-notification", text: notificationText });
    $("body").append(notificationTag);

    notificationTag.fadeIn("slow", function () {
      setTimeout(function () {
        notificationTag.fadeOut("slow", function () {
          notificationTag.remove();
        });
      }, 1000);
    });
  }
}

这是我的 ajax 和 html:

$(".fa-link").on("click", function () {
  var mlink = $(".boxmlink").attr("href").trim()
  var fetchWallID = new XMLHttpRequest()
  fetchWallID.open("POST", db, true);
  fetchWallID.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  fetchWallID.onload = function () {
    if (this.status == 200) {
      var url = $(location).attr("href").split("?")
      var id = (this.responseText).trim()
      var windowurl = url[0].trim()
      var finalurl = (windowurl + '?wallid=' + id).trim().replace("#", '')
      //copy(finalurl, true)
      //copyToClipboard(finalurl)
    }
  }
  fetchWallID.send("mlinkID=" + mlink)
})

html:

<a href="#" class="fa fa-link"></a>

创建一个textarea元素,选择它然后将文本附加到它应该可以解决问题。在 Safari 版本 12.0.3 上测试。您的版本似乎执行相同的操作,但步骤更多。请确保它的每个部分都能正常工作。

function copy(str) {
  const el = document.createElement('textarea');
  el.value = str;
  document.body.appendChild(el);
  el.select();
  document.execCommand('copy');
  document.body.removeChild(el);
};

document.getElementById('button').addEventListener('click', evt => {
  copy(document.getElementById('test').innerHTML);
});
<span id=test>Hello World!</span>
<button id=button>Copy Text</button>
<input placeholder='Paste in Me!'/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 jquery/javascript 在 safari 中复制到剪贴板? 的相关文章

随机推荐

  • 这是使用 thenFetch() 加载多个集合的正确方法吗?

    我正在尝试使用急切地加载所有集合NHibernate 3 阿尔法 1 http nhforge org media p 690 aspx 我想知道这是否是使用 thenFetch 的正确方法 具有复数名称的属性是集合 其他的只是一个单一的对
  • Django 如何使用 django.contrib.auth 添加注销成功消息?

    我没有使用all auth 我正在使用标准身份验证系统和 url 提供的django contrib auth 我还确保注销时用户会自动重定向到登录页面 LOGOUT REDIRECT URL login 我想添加一条消息 以便用户知道他们
  • IntelliJ 检查给出“无法解析符号”,但仍编译代码

    平台 IntelliJ社区版10 0 3SDK jdk1 6 0 21操作系统 Windows 7 所以我在使用 IntelliJ 时遇到了一个奇怪的情况 这让我完全陷入困境 我设置了一个 Maven 项目 并将 log4j 添加为 pom
  • 尝试使用selenium截屏时出现空指针异常[重复]

    这个问题在这里已经有答案了 我编写了一个Java类 它使用selenium webdriver来快速浏览网站并测试各种功能 我还编写了一个单独的类 它将用于执行 takeScreenshot 方法 一旦测试命中执行截图方法的代码 浏览器就会
  • 无法创建推力装置矢量

    所以我尝试开始 GPU 编程并使用 Thrust 库来简化事情 我创建了一个测试程序来使用它并查看它是如何工作的 但是每当我尝试创建具有非零大小的推力 device vector时 程序就会崩溃并显示 运行时检查失败 3 变量 结果 正在使
  • 汇编vim语法高亮

    默认的程序集语法文件不能很好地工作 在网上搜索有关 Gas 程序集的信息时 我没有找到任何有关 vim 的 Gas AT T 语法文件的信息 有人发现这个吗 我无法编写自己的语法文件 http img168 imageshack us im
  • 如何在R中将时间格式转换为数字

    示例如下所示 A tibble 10 x 3 trip id start time end time
  • SonarQube 在代码分析中忽略 getter/setter

    SonarQube 仪表板中是否有允许忽略 getter 和 setter 的设置 这听起来是一个比在代码库中的每个方法上编码 nopmd 更好的选择 我的代码库有很多这样的东西 它们极大地降低了 Sonarqube 仪表板中报告的单元测试
  • 更改 Electron 中可拖动区域上的光标

    我正在 Electron 中制作一个应用程序 我有一个无框窗口 我有一些顶部区域 webkit app region drag但当我这样做时 不会改变 显然它在这个片段中是不可拖动的 因为它不是一个电子应用程序 但基本上光标在可拖动的元素上
  • 使用matlab配色方案将float转换为RGB

    例如 如果我有一个浮动0 568 浮动保证是0 gt 1 有没有办法将其转换为 RGB 值 双精度 1 0 1 0 1 0 or int 255 255 255 在当前的 matlab 配色方案 即正常 热 HSV 等 下 你可以试试这个
  • Intel x86 - 中断服务例程责任

    我没有真正意义上的问题 但我会尽力澄清内容问题 假设我们有一个微内核 PC Intel x86 32 位保护模式 中断描述符表 IDT and 中断服务程序 ISR 对于每个CPU异常 ISR 被成功调用 例如Division by Zer
  • 从 C 矩阵到现代 OpenGL 中的纹理?

    Problem 我正在尝试使用 OpenGL 用 C 编写一个简单的程序 这将允许 绘制 2D C 数组 int 32 位整数 根据调色板 目前 我还没有做到这一点 还很远 我正在学习如何将 32 位有符号整数数组发送到 GPU 并以某种方
  • {{ }} 和 {!! 之间有什么区别? !!} 在 Laravel Blade 文件中?

    在laravel框架中我们可以使用blade在html文件中添加PHP代码 我们正在使用两者 and Laravel 的 Blade 文件中的语法 它们之间有什么区别 Blade 语句通过PHP的htmlentities函数自动发送 以防止
  • 制作 PIE 对象时,不能使用针对符号“G8”的重定位 R_X86_64_32;使用-fPIE重新编译

    我正在尝试将 lambda 表达式从 schema 编译为 llvm ir 但在处理与位置无关的代码时遇到了问题 source lambda x display x target bunch of declares define SObj
  • 更新Map字段-Flutter

    如何更新 isVerified Boolean 字段的数据 个人信息是地图包含地址 然后经过验证 更新isVerified 您必须执行以下操作 Firestore instance collection collection Name do
  • 我们可以在 Spring Boot 中使用多个 kafka 模板吗?

    在我的 spring boot kafka 发布者应用程序中 我想提供对以 String json 或字节格式发布消息的支持 因为我想同时提供对 json 和 avro 的支持 但是 Spring Boot 中的 Kafka 模板让我们只定
  • 有没有办法在 R 中为 Word 制作漂亮的表格?

    我问我的问题 这是我最后的希望 我必须用 Word 制作一份报告 我从事 R Markdown 工作 必须生成许多表格 我希望我的桌子很漂亮 但我尝试过的一切 pander KableExtra flextable 不工作 我的结果来自co
  • 尝试使用 Angular 中的 Google People API 获取生日和性别

    我已经花了几个小时尝试这样做 但我永远无法获得我想要获得的数据 我需要以其他方式提出请求吗 这是我的代码 doGoogleLogin return new Promise
  • 是否有 jquery 下拉年份选择器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有一个 jQuery 插件可以自动创建下拉年份选择器 这是一个 选择 元素 填充了从当前开始并追溯
  • 如何使用 jquery/javascript 在 safari 中复制到剪贴板?

    我研究了一堆答案和文章 它们展示了如何通过 jquery 在按钮单击时复制文本 但没有一个对我有用 我通过 ajax 将一个值附加到 DOM 中 我希望通过单击按钮来复制该值 所有这些解决方案都可以在 chrome 上运行 如果使用 jsf