【问题标题】:Copy to clipboard on firefox and google chrome在 Firefox 和 google chrome 上复制到剪贴板
【发布时间】:2010-12-03 09:52:39
【问题描述】:

因为我环顾四周,找不到任何将 firefox 或 chrome 上的文本复制到剪贴板的好解决方案。但是,我已经尝试了 Firefox 在其开发人员站点中提供的一些代码,但仍然无法正常工作,并且出现了一个权限被拒绝的错误。这是我最后一分钟尝试的代码。

var copytext = "Text to copy";  
var str      = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);  
str.data     = copytext; 

有没有人有很好的解决方案来解决这个问题?我会很感激你的分享。谢谢。

【问题讨论】:

  • 可能出于安全原因,这些浏览器已禁用此功能(将剪贴板设置为任意 JavaScript 字符串)。

标签: javascript security firefox google-chrome clipboard


【解决方案1】:

我认为它不仅仅是为了您观看?

如果没有,您可以在 Firefox 浏览器中调整 about:config 中的设置。在过滤器中查找 'signed',并将单个结果设置为 DISABLED。

但是,如果您想要整个事情的代码,那就比较麻烦了,因为 Firefox 可以很好地保护它。一种棘手的方法是使用 Flash 对象将字符串传递给,然后使用 Flash 复制到剪贴板:)

【讨论】:

  • @Boomerangertanger 感谢您发现这一点,它曾经是一个有效的网站,现在看起来像是垃圾:( 我从答案中删除了它。
【解决方案2】:

我找到了下一个解决方案:

在按键处理程序上创建“pre”标签。设置要复制到此标签的内容。在此标记上进行选择并在处理程序中返回 true。此调用 chrome 的标准处理程序并复制选定的文本。

如果您需要,可以为恢复先前选择的功能设置超时。我在 Mootools 上的实现:

   function EnybyClipboard() {
        this.saveSelection = false;
        this.callback = false;
        this.pastedText = false;

        this.restoreSelection = function () {
            if (this.saveSelection) {
                window.getSelection().removeAllRanges();        
                for (var i = 0; i < this.saveSelection.length; i++) {
                    window.getSelection().addRange(this.saveSelection[i]);
                }
                this.saveSelection = false;
            }
        };

        this.copyText = function (text) {
            var div = $('special_copy');
            if (!div) {
                div = new Element('pre', {'id' : 'special_copy', 'style': 'opacity: 0;position: absolute;top: -10000px;right: 0;'});
                div.injectInside(document.body);
            }
            div.set('text', text);
            if (document.createRange) {
                var rng = document.createRange();
                rng.selectNodeContents(div);
                this.saveSelection = [];
                var selection = window.getSelection();
                for (var i = 0; i < selection.rangeCount; i++) {
                    this.saveSelection[i] = selection.getRangeAt(i);
                }
                window.getSelection().removeAllRanges();
                window.getSelection().addRange(rng);
                setTimeout(this.restoreSelection.bind(this), 100);
            } else
                return alert('Copy not work. :(');
        };

        this.getPastedText = function () {
            if (!this.pastedText) 
                alert('Nothing to paste. :(');
            return this.pastedText;
        };

        this.pasteText = function (callback) {
            var div = $('special_paste');
            if (!div) {
                div = new Element('textarea', {'id' : 'special_paste', 'style': 'opacity: 0;position: absolute;top: -10000px;right: 0;'});
                div.injectInside(document.body);
                div.addEvent('keyup', function() {
                    if (this.callback) {
                        this.pastedText = $('special_paste').get('value');
                        this.callback.call(this.pastedText);
                        this.callback = false;
                        this.pastedText = false;
                        setTimeout(this.restoreSelection.bind(this), 100);
                    }
                }.bind(this));
            }
            div.set('value', '');
            if (document.createRange) {
                var rng = document.createRange();
                rng.selectNodeContents(div);
                this.saveSelection = [];
                var selection = window.getSelection();
                for (var i = 0; i < selection.rangeCount; i++) {
                    this.saveSelection[i] = selection.getRangeAt(i);
                }
                window.getSelection().removeAllRanges();
                window.getSelection().addRange(rng);
                div.focus();
                this.callback = callback;
            } else
                return alert('Fail to paste. :(');
        };
    }

用法:

enyby_clip = new EnybyClipboard(); //init 

enyby_clip.copyText('some_text'); // place this in CTRL+C handler and return true;

enyby_clip.pasteText(function callback(pasted_text) {
        alert(pasted_text);
}); // place this in CTRL+V handler and return true;

粘贴它的创建文本区域并工作相同。

抱歉英语不好 - 不是我的母语。

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 2011-06-01
    • 2015-11-14
    • 2012-02-03
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2021-09-23
    • 2014-06-06
    相关资源
    最近更新 更多