如何用GWT复制到剪贴板?

发布于 2024-08-02 04:35:35 字数 118 浏览 5 评论 0原文

通过 Google 搜索找不到任何相关信息。

有谁知道如何通过 GWT Java 代码将一些文本复制到剪贴板? 我想避免原始的 javascript 注入解决方案。

任何帮助或指示表示赞赏。

Couldn't find anything on this with a Google Search.

Does anyone know how to copy some text to the clipboard through GWT Java code?
I'd like to avoid the raw javascript injection solution.

Any help or pointers appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

以为你会在 2024-08-09 04:35:35

只需包装提供的答案https://stackoverflow.com/a/30810322/106261

因此,您将任何文本传递给 javascript 本机函数/方法,js 函数会创建一个新元素并复制到剪贴板,并在复制后删除该元素。

新浏览器不需要任何库。

所以 :

public static native void copyTextToClipboard(String text) /*-{
        var textArea = document.createElement("textarea");
        //
        // *** This styling is an extra step which is likely not required. ***
        //
        // Why is it here? To ensure:
        // 1. the element is able to have focus and selection.
        // 2. if element was to flash render it has minimal visual impact.
        // 3. less flakyness with selection and copying which **might** occur if
        //    the textarea element is not visible.
        //
        // The likelihood is the element won't even render, not even a flash,
        // so some of these are just precautions. However in IE the element
        // is visible whilst the popup box asking the user for permission for
        // the web page to copy to the clipboard.
        //

        // Place in top-left corner of screen regardless of scroll position.
        textArea.style.position = 'fixed';
        textArea.style.top = 0;
        textArea.style.left = 0;

        // Ensure it has a small width and height. Setting to 1px / 1em
        // doesn't work as this gives a negative w/h on some browsers.
        textArea.style.width = '2em';
        textArea.style.height = '2em';

        // We don't need padding, reducing the size if it does flash render.
        textArea.style.padding = 0;

        // Clean up any borders.
        textArea.style.border = 'none';
        textArea.style.outline = 'none';
        textArea.style.boxShadow = 'none';

        // Avoid flash of white box if rendered for any reason.
        textArea.style.background = 'transparent';


        textArea.value = text;

        document.body.appendChild(textArea);

        textArea.select();

        try {
            var successful = document.execCommand('copy');
        } catch (err) {
            console.log('Unable to copy');
        }
        document.body.removeChild(textArea);
    }-*/;

Just wrap the provided answer https://stackoverflow.com/a/30810322/106261.

So, you pass in any text to a javascript native function/method, the js function creates a new element and copies to clipboard, and removes the element after copying.

No need for any libs with new browsers.

so :

public static native void copyTextToClipboard(String text) /*-{
        var textArea = document.createElement("textarea");
        //
        // *** This styling is an extra step which is likely not required. ***
        //
        // Why is it here? To ensure:
        // 1. the element is able to have focus and selection.
        // 2. if element was to flash render it has minimal visual impact.
        // 3. less flakyness with selection and copying which **might** occur if
        //    the textarea element is not visible.
        //
        // The likelihood is the element won't even render, not even a flash,
        // so some of these are just precautions. However in IE the element
        // is visible whilst the popup box asking the user for permission for
        // the web page to copy to the clipboard.
        //

        // Place in top-left corner of screen regardless of scroll position.
        textArea.style.position = 'fixed';
        textArea.style.top = 0;
        textArea.style.left = 0;

        // Ensure it has a small width and height. Setting to 1px / 1em
        // doesn't work as this gives a negative w/h on some browsers.
        textArea.style.width = '2em';
        textArea.style.height = '2em';

        // We don't need padding, reducing the size if it does flash render.
        textArea.style.padding = 0;

        // Clean up any borders.
        textArea.style.border = 'none';
        textArea.style.outline = 'none';
        textArea.style.boxShadow = 'none';

        // Avoid flash of white box if rendered for any reason.
        textArea.style.background = 'transparent';


        textArea.value = text;

        document.body.appendChild(textArea);

        textArea.select();

        try {
            var successful = document.execCommand('copy');
        } catch (err) {
            console.log('Unable to copy');
        }
        document.body.removeChild(textArea);
    }-*/;
素罗衫 2024-08-09 04:35:35

我已将 ZeroClipboard 与 GWT 一起使用(按照 Alexander 的建议),但这并不简单。

请参阅http://blog.dandoy.org/2011/09/使用-zeroclipboard-with-gwt.html

I have used ZeroClipboard with GWT (as suggested by Alexander) but it was not straightforward.

See http://blog.dandoy.org/2011/09/using-zeroclipboard-with-gwt.html

饮惑 2024-08-09 04:35:35

以下代码在 Chrome 中对我来说效果很好:

public static native void copyToClipboard() /*-{
    var selection = $wnd.getSelection();
    var text =  $doc.getElementById("myElement");
    var range = $doc.createRange();
    range.selectNodeContents(text);
    selection.removeAllRanges();
    selection.addRange(range);
    $doc.execCommand('copy');
    selection.removeAllRanges();
}-*/;

The following code worked fine for me in chrome:

public static native void copyToClipboard() /*-{
    var selection = $wnd.getSelection();
    var text =  $doc.getElementById("myElement");
    var range = $doc.createRange();
    range.selectNodeContents(text);
    selection.removeAllRanges();
    selection.addRange(range);
    $doc.execCommand('copy');
    selection.removeAllRanges();
}-*/;
若能看破又如何 2024-08-09 04:35:35

GWT 本身并不支持 $doc.execCommand('copy'); 命令,但它非常简单。

首先将焦点设置在项目上,选择文本,然后复制它。

myTextBox.setFocus(true);
myTextBox.selectAll();
boolean success = copyToClipboard();

private static native boolean copyToClipboard() /*-{
    return $doc.execCommand('copy');
}-*/;

GWT doesn't natively support the $doc.execCommand('copy'); command, but it's super easy.

First set the focus on the item, select the text, then copy it.

myTextBox.setFocus(true);
myTextBox.selectAll();
boolean success = copyToClipboard();

private static native boolean copyToClipboard() /*-{
    return $doc.execCommand('copy');
}-*/;
舂唻埖巳落 2024-08-09 04:35:35

目前似乎没有任何 GWT 库提供此功能。无论如何,不​​可能在所有浏览器中都支持这一点,因为需要 Flash。 ZeroClipboard 是一个相当不错的库,它不仅仅包含了功能。

For the moment it doesn't seem like there are any GWT libraries that provide this functionality. In any case, it's impossible to support this in all browsers as Flash is needed. A rather nice library than wraps the functionality is ZeroClipboard.

荆棘i 2024-08-09 04:35:35

这里是一个没有原生 JS 的解决方案,而是 gwt elemental ,仍然受到 @SushmithaShenoy 的启发,将其留在这里以供将来参考。

前提条件:

import elemental.client.Browser;
import elemental.html.Selection;
import elemental.ranges.Range;

Label.getElement().setAttribute("id","your_element_id"); //unique ID!

现在是“真实”代码,可能放置在点击处理程序中:

final Selection selection = Browser.getWindow().getSelection();
final Range range = Browser.getDocument().createRange();
range.selectNodeContents(Browser.getDocument().getElementById(""you_elements_id"));
selection.removeAllRanges();
selection.addRange(range);
Browser.getWindow().getDocument().execCommand("copy", false, "");
selection.removeAllRanges();

Here a solution without native JS, but gwt elemental instead, still inspired by @SushmithaShenoy, leaving this here for future reference.

precondition:

import elemental.client.Browser;
import elemental.html.Selection;
import elemental.ranges.Range;

Label.getElement().setAttribute("id","your_element_id"); //unique ID!

now the 'real' code, maybe placed in a clickhandler:

final Selection selection = Browser.getWindow().getSelection();
final Range range = Browser.getDocument().createRange();
range.selectNodeContents(Browser.getDocument().getElementById(""you_elements_id"));
selection.removeAllRanges();
selection.addRange(range);
Browser.getWindow().getDocument().execCommand("copy", false, "");
selection.removeAllRanges();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文