javascript - 文档 execCommand 副本不适用于 AJAX

标签 javascript jquery ajax

无法直接复制生成的链接(不用ctrl+C) 我正在使用 document.execCommand('copy') 但它似乎没有任何效果。 如果代码没有 AJAX,那么它可以正常工作。 这是

HTML:

<div class="permalink-control"> </div>

JQUERY:

    $(".permalink-control")
          .append(
            '<div class="input-group">' +
            '    <span class="input-group-btn"><button type="button" class="btn btn-default" title="Get Permalink"><span class="glyphicon glyphicon-link"></span></button></span>' +
            '    <input type="text" class="form-control">' +
            '</div>'
          );
        $(".permalink-control input")
          .hide()
          .focus(function () {
            // Workaround for broken selection: https://stackoverflow.com/questions/5797539
            var $this = $(this);
            $this.select()
              .mouseup(function () {
                $this.unbind("mouseup");
                return false;
              });
          });
        $(".permalink-control button")
          .click(function () {
            var $this = $(this);
            $.ajax({
              url: "https://api-ssl.bitly.com/shorten",
              dataType: "jsonp",
              data: {
                longUrl: window.location.href,
                access_token: "your access token",
                format: "json"
              },
              success: function (response) {
                var longUrl = Object.keys(response.results)[0];
                var shortUrl = response.results[longUrl].shortUrl;
                if (shortUrl.indexOf(":") === 4) {
                  shortUrl = "https" + shortUrl.substring(4);
                }
                $this.parents(".permalink-control")
                  .find("input")
                  .show()
                  .val(shortUrl)
                  .focus();
              },
              async:false
            });
          });

更新:

How do I copy to the clipboard in JavaScript?

不是我的问题的答案,因为如果 AJAX 不存在,我的代码也会在不使用 ctrl+C 的情况下进行复制。 但是,当我使用 AJAX 时,document.execCommand('copy') 不起作用。

最佳答案

原因在W3 specs中有明确说明。 :

Copy and cut commands triggered through a scripting API will only affect the contents of the real clipboard if the event is dispatched from an event that is trusted and triggered by the user, or if the implementation is configured to allow this.

但是,话虽如此,我们可以尝试通过复制文本来欺骗浏览器当用户进行一些交互时

在这种情况下,由于您正在寻找 click 事件,我假设您是用户正在与 mouse 进行交互

So, what if I attach a $(window).blur() or $(document).click() event after the ajax call is resolved?

没错,因为用户必须在某个时候blur来使用复制选择,用户将启动blur() 或click()(取决于您的需要) 然后我们可以将文本复制到剪贴板。

这是 HACKY DEMO

$(document).ready(function(){
    var shortUrl;
    $(".permalink-control")
      .append(
        '<div class="input-group">' +
        '    <span class="input-group-btn"><button type="button" class="btn btn-default" title="Get Permalink"><span class="glyphicon glyphicon-link"></span></button></span>' +
        '    <input type="text" class="form-control">' +
        '</div>'
      );
     $(".permalink-control input")
      .hide()
      .focus(function () {
        // Workaround for broken selection: http://stackoverflow.com/questions/5797539
        var $this = $(this);
        $this.select();
        document.execCommand('copy');
          $this.mouseup(function () {
            $this.unbind("mouseup");
            return false;
          });
      });
    $(".permalink-control button")
      .click(function () {
        var shortUrl ="";
        var $this = $(this);
        $.ajax({
          url: "https://api-ssl.bitly.com/shorten",
          dataType: "jsonp",
          data: {
            longUrl: window.location.href,
            access_token: "48ecf90304d70f30729abe82dfea1dd8a11c4584",
            format: "json"
          },
          success: function (response) {
             var longUrl = Object.keys(response.results)[0];
            shortUrl = response.results[longUrl].shortUrl;
            if (shortUrl.indexOf(":") === 4) {
              shortUrl = "https" + shortUrl.substring(4);
            }
              $this.parents(".permalink-control")
              .find("input")
              .show()
              .val(shortUrl)
              .focus();
            } 
       }).done(function(){
            $(window).blur(function(){
							document.execCommand('copy');
              $(window).off('blur');// make sure we don't copy anything else from the document when window is foucussed out
            });
       })
    });
})
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="permalink-control"></div> 
<div class"log"></div>

P.S:这已经在 chrome 中测试过了。

关于javascript - 文档 execCommand 副本不适用于 AJAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43380921/

相关文章:

javascript - 按 Enter 键执行 jquery 函数

javascript - 如何防止 iframe 两次运行加载事件?

javascript - 乘以单元格的值不返回任何内容

javascript - 如何在服务器上保存div内容(img)

javascript - 无法获得滚动功能来显示/隐藏标题?

javascript - onkeypress 事件监听器不工作

javascript - JSONP 中未调用回调函数

jquery - 如何向 CKeditor 4.2.1 添加带有加载 gif 的 ajax 保存按钮。 [工作示例插件]

ajax - 如何使用新 API 从 Instagram 获取公共(public)数据或标签?

javascript - Action 创建者是否有必要返回 Action ?