开发者问题收集

使用 Javascript 将页面中的样式文本复制到剪贴板

2011-02-22
3019

我创建了一个简单的工具,以便员工可以个性化他们的公司电子邮件签名。此工具会创建一些带有粗体字体和一些颜色的样式文本,没有什么特别的。如果我选​​择文本并将其复制并粘贴到我的 Gmail 签名字段中,一切都会顺利进行。它保留了格式。但是,我更希望让用户选择单击“复制”按钮,将格式化的内容复制到剪贴板上。

我目前正在使用 ZeroClipboard 添加“复制到剪贴板”功能,效果很好。问题是我不知道如何获取格式化的文本。它只是不断复制未格式化的版本。我尝试过的一件事是向 ZeroClipboard 添加一个 mouseDown 侦听器,以选择这样的文本:

function selectText() {
    if (document.selection) {
        var range = document.body.createTextRange();
        range.moveToElementText(document.getElementById('clicktocopy'));
        range.select();
    }
    else if (window.getSelection) {
        var range = document.createRange();
        range.selectNode(document.getElementById('clicktocopy'));
        window.getSelection().addRange(range);
    }
}

然后返回这样的选择:

function getText() {
    if (window.getSelection) {
        var range = window.getSelection();
        return range.toString();
    }
    else {
        if (document.selection.createRange) {
            var range = document.selection.createRange();
            return range.text;
        }
    }
}

但是,这只会复制未格式化的文本。是否可以复制格式化的文本?

我的格式化文本位于 id 为“results”的 div 中。

1个回答

如果您想要一个表示当前选择的 HTML 字符串,以下函数将执行此操作(替换您的 getText() 函数):

function getSelectionHtml() {
    var html = "";
    if (typeof window.getSelection != "undefined") {
        var sel = window.getSelection();
        if (sel.rangeCount) {
            var container = document.createElement("div");
            for (var i = 0, len = sel.rangeCount; i < len; ++i) {
                container.appendChild(sel.getRangeAt(i).cloneContents());
            }
            html = container.innerHTML;
        }
    } else if (typeof document.selection != "undefined") {
        if (document.selection.type == "Text") {
            html = document.selection.createRange().htmlText;
        }
    }
    return html;
}
Tim Down
2011-02-23