ZeroClipboard:程序化的setText()不起作用

igo*_*gor 6 clipboard zeroclipboard

我试图让ZeroClipboard API工作,但看起来setText()函数没有任何效果.

提供的简单示例> here <工作正常,但是当我想以编程方式调用setText()时,它不起作用.能帮帮我,这段代码有什么问题?

<html>
<body>
<script type="text/javascript" src="/resources/ZeroClipboard.js"></script>

<button id="my-button">Copy to Clipboard</button>

<script language="JavaScript">

    ZeroClipboard.setDefaults({ moviePath: "/resources/ZeroClipboard.swf" });

    var clip = new ZeroClipboard( $("button#my-button") );

    clip.setText('This will be copied into the clipboard'); //this should be in my clipboard, but it is not...

</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

非常感谢

小智 9

由于安全问题,Flash无法访问剪贴板,除非操作源自使用flash对象的单击(或用户交互).

因此,只调用clip.setText将永远不会工作.即使从随机按钮的onclick处理程序调用它也行不通,因为它不是点击flash对象.

就是那样子.

所以ZeroClipboard所做的就是"粘合"或向你感兴趣的对象添加一个不可见的flash元素.当你单击该元素时,你没有触发该元素的正常javascript onclick,你正在触发flash视频的onclick事件.

希望有道理.

因此,要将ZeroClipboard"粘合"到元素上,您可以像您所做的那样做,这是正确的,或者您可以调用:

clip.glue(element);
Run Code Online (Sandbox Code Playgroud)

你可以粘贴到多个元素没问题.

因此,要设置文本,操作必须来自对flash对象的单击.根据文档,有三种方法可以做到这一点.

使用数据剪贴板文本

您可以将按钮的"data-clipboard-text"属性设置为您喜欢的任何文本,这将自动复制.

例如,为您的示例(复制"复制此文本!"):

<button id="my-button" data-clipboard-text="copy this text!">Copy to Clipboard</button>
Run Code Online (Sandbox Code Playgroud)

使用data-clipboard-target

或者你可以将"data-clipboard-target"设置为任何元素的id,而ZeroClipboard将尝试获取该元素的innerText;

例如(复制"复制到剪贴板")

<button id="my-button" data-clipboard-target="my-button">Copy to Clipboard</button>
Run Code Online (Sandbox Code Playgroud)

使用dataRequested事件

最后,您可以在回调中复制文本.如果这两个属性都没有设置,那么将调用dataRequested回调,您可以在其中将文本设置为您想要的任何内容.

例如(复制"在回调中设置文本......")

<html>
<body>
<script src="js/jquery-1.9.1.js"></script>
<script type="text/javascript" src="zc/ZeroClipboard.js"></script>
<button id="my-button">Copy to Clipboard</button>

<script language="JavaScript">

    ZeroClipboard.setDefaults({ moviePath: "zc/ZeroClipboard.swf" });

    var clip = new ZeroClipboard( $("button#my-button") );

    clip.on( 'dataRequested', function ( client, args ) {

        clip.setText("Setting the text in a callback...");

        // Don't make this mistake, alert seems to prevent it from working
        // alert("Clipboard should be set from click on " + this.id);
    });

    // Will never work
    // clip.setText('This will be copied into the clipboard'); //this should be in my clipboard, but it is not...

</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

在回调中保持警报会因某些原因阻止它为我工作,所以请注意它.

结论

请注意,在所有三个示例中,复制事件来自对flash对象的单击.据我所知,没有用户交互只能从javascript复制它.

有关详细信息,请查看ZeroClipboard说明:https://github.com/zeroclipboard/zeroclipboard/blob/master/docs/instructions.md