【问题标题】:Copy to clipboard text output from database从数据库复制到剪贴板文本输出
【发布时间】:2012-11-22 01:05:47
【问题描述】:

我有一个搜索表单,可以将商家详细信息(每个商家的姓名、电话、电子邮件地址)输出到表格中。
我希望在每个字段旁边都有一个复制按钮,以便用户可以单击它并将其复制到剪贴板(复制时文本会突出显示)。我的用户将仅使用 IE9 浏览。

问题是可能有不止一组结果,所以脚本不能像我在下面使用 textarea 所做的那样调用特定编号的函数:

function highlightmetasearch01() {
    document.copydata01.text2copy01.select();
     document.copydata01.text2copy01.focus(); 
}
function copymetasearch01() {
    highlightmetasearch01();
    textRange = document.copydata01.text2copy01.createTextRange();
    textRange.execCommand("RemoveFormat");
    textRange.execCommand("Copy");
}

function highlightmetasearch02() {
    document.copydata02.text2copy02.select();
    document.copydata02.text2copy02.focus(); 
}
function copymetasearch02() {
    highlightmetasearch02();
    textRange = document.copydata02.text2copy02.createTextRange();
    textRange.execCommand("RemoveFormat");
    textRange.execCommand("Copy");
}

HTML:

<textarea name="text2copy01">The first textarea.</textarea>
<br />
<button onclick="copymetasearch01();return false;">COPY</button>

<textarea name="text2copy02">The second textarea.</textarea>
<br />
<button onclick="copymetasearch02();return false;">COPY</button>

我想知道这是否可能? ...

<td><span>Name from DB here</span> <button onclick="<!--copy and highlight text within most recent span tag-->">COPY</button></td>

<td><span>Phone from DB here</span> <button onclick="<!--copy and highlight text within most recent span tag-->">COPY</button></td>

<td>Other text here that shouldn't be highlighted or copied <span>Email address from DB here</span> <button onclick="<!--copy and highlight text within most recent span tag-->">COPY</button></td>

或者有没有更有效的方法来解决这个问题?

【问题讨论】:

  • 忘记实际的一面,您想要一个网站来控制您的剪贴板吗?我会认为该网站很粗鲁,并且将来可能会避免使用它。我还想,如果他们(试图)这样做,他们还试图在我不知道的情况下做些什么。

标签: javascript


【解决方案1】:

这个问题:

How do I copy to the clipboard in JavaScript?

...包含一个关于使用 JavaScript 将文本复制到剪贴板的相当长的讨论。最受好评(在我看来是正确的)答案实际上并没有进行复制,而是利用弹出窗口显示一个带有已选择文本的文本框,允许用户简单地 CTRL+C 进行复制。

这背后的原因是,网站控制用户剪贴板上的内容可能是危险的,并且对用户来说是不受欢迎的。了解到您在这里获得了用户的许可,但仍然......如果您想采用上述帖子中的答案并将其应用到您的网站,也许包括一个自动选择要复制的文本的按钮旁边的字段。有关在字段中选择文本的信息,请参阅此帖子:Programmatically selecting partial text in an input field

【讨论】:

    【解决方案2】:

    由于您似乎已经找到了复制方法并且只需要一种访问动态生成元素的方法,因此请使用document.getElementById('text2copy02').createTextRange() 而不是document.copydata02.text2copy02.createTextRange()。请参阅下面的示例代码。希望我正确理解了您的问题。

    html:

    <td><span id="copyMe1">Name from DB here</span> <button onclick="copyMeToClipboard('copyMe1')">COPY</button></td>
    
    <td><span id="copyMe2">Phone from DB here</span> <button onclick="copyMeToClipboard('copyMe2')">COPY</button></td>
    

    js:

    function copyMeToClipboard(elementId) {
        document.getElementById(elementId).select();
        document.getElementById(elementId).focus(); 
        textRange = document.getElementById(elementId).createTextRange();
        textRange.execCommand("RemoveFormat");
        textRange.execCommand("Copy");
    }
    

    【讨论】:

      【解决方案3】:

      我将插入jQuery 作为解决您问题的好方法。我知道问题中没有提到它,但是通过让您使用 CSS 样式的选择器,它使遍历 DOM 树变得非常容易。将此与单击事件处理程序结合起来,您会得到“我想知道这是否可能?”解决方案:

      // Give your copy buttons the "copier" class
      // This will add a click event handler:
      $('.copier').click(function() {
          // Find the nearest-parent td to the clicked button:
          var row = $(this).closest('td');
      
          // Find the first span within that td:
          var txt = row.find('span:first');
      
          // Do the copying:
          window.clipboardData.setData('Text', txt.text());
      
          // And the highlighting:
          var range = document.body.createTextRange();
          range.moveToElementText(txt[0]);
          range.select();
      });
      

      现在我留下了副本和突出显示代码(编辑: 除了现在我没有),因为它有点长,但你可以在其他地方找到一些好的(跨浏览器)实现关于堆栈溢出:

      希望有帮助!

      【讨论】:

      • 谢谢大家,我试过了,但它不起作用。对不起,我在这里有点菜鸟...
      • @Zuno - 我更新了示例代码。未经测试,因为我没有 IE,但它应该可以工作。在这些链接的示例中,有几件事会阻止复制粘贴的代码运行:变量str 对您不存在,range.moveToElement() 需要一个本机 DOM 节点,而不是它的 jQuery 包装器(正方形括号展开它,可以这么说)。
      • 非常感谢,但我认为我在这里有点愚蠢。将 .copier 更改为 .copy 并在上面的代码中使用此 HTML,但无效:
      • @Zuno - 嗯。看起来不错...您确定在运行事件绑定脚本时按钮已经存在吗?如果没有,请将其移至文件底部或将其包装在 $(document).ready(function() { /* Do it here! */});
      • 我应该在这里引用一个 jquery 库吗?我问是因为我已经以几乎所有可能的方式尝试过这个。我将脚本放在顶部和底部,让它在搜索结果生成时生成(在顶部和底部),然后按照您的建议更改脚本并重复这些测试。所有这些,在单击按钮时,什么也没做。
      猜你喜欢
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多