【问题标题】:Can I change the HTML of the selected text?我可以更改所选文本的 HTML 吗?
【发布时间】:2012-07-28 22:42:08
【问题描述】:

我们可以使用 javascript 更改网页选定部分的 HTML 或其属性吗?

例如, 有一个随机网页:(显示了一部分)

HTML 为

...<p>Sample paragraph</p>..

可以获取已被here回答的选中文本的HTML。

但是,我可以更改所选文本的 html 吗?比如,在段落标签中添加一个类或 id 属性。

【问题讨论】:

  • 我不明白这怎么可能......只有当用户选择文本然后按下按钮?
  • @slm_92 即使用户选择并按下按钮,怎么可能?
  • Rangy to the rescue.(不需要 jQuery。)
  • Rangy 看起来不错。

标签: javascript jquery


【解决方案1】:

jQuery wrapselection 插件听起来像您正在寻找的 http://archive.plugins.jquery.com/project/wrapSelection 。你所要求的不是直接可能的,插件通过在周围的文本周围添加额外的节点来工作,这可能不是 100% 可靠的(特别是在 IE6-8 中)

【讨论】:

  • 谢谢。我一直在寻找类似的东西。但是是否可以更改 id 属性?
【解决方案2】:

这是一个没有插件的工作示例。

http://jsfiddle.net/9HTPw/2/

function getSel() {
    var sel = null;
    if (
    typeof document.selection != "undefined" && document.selection 
                                   && document.selection.type == "Text") {
        sel = document.selection;
    } else if (
    window.getSelection && window.getSelection().rangeCount > 0) {
        sel = window.getSelection();
    }
    return sel;
}

var getSelectionStart = (function () {

    function createRangeFromSel(sel) {
        var rng = null;
        if (sel.createRange) {
            rng = sel.createRange();
        } else if (sel.getRangeAt) {
            rng = sel.getRangeAt(0);
            if (rng.toString() == "") rng = null;
        }
        return rng;
    }

    return function (el) {
        var sel = getSel(),
            rng, r2, i = -1;
        if (sel) {
            rng = createRangeFromSel(sel);
            if (rng) {

                if (rng.parentElement) {
                    if (rng.parentElement() == el) {
                        r2 = document.body.createTextRange();
                        r2.moveToElementText(el);
                        r2.collapse(true);
                        r2.setEndPoint("EndToStart", rng);
                        i = r2.text.length;
                    }
                } else {
                    if ( rng.startContainer && rng.endContainer 
                   &&  rng.startContainer == rng.endContainer 
                   && rng.startContainer == rng.commonAncestorContainer 
                   && rng.commonAncestorContainer.parentNode == el) {

                        //make sure your DIV does not have any inner element,
                        //otherwise more code is required in order to filter
                        //text nodes and count chars

                        i = rng.startOffset;
                    }
                }
            }
        }
        return i;
    };

})();


$("#content").on('mousedown', function () {
    $("#content").html(content)
});

var content = $("#content").html();

$("#content").on('mouseup', function () {
    var start = getSelectionStart(this);
    var len = getSel().toString().length;


    $(this).html(
            content.substr(0, start) + 
            '<span style=\"background-color: yellow;\">' +
            content.substr(start, len) + 
            '</span>' +
            content.substr(Number(start) + Number(len), content.toString().length));
});

参考资料: http://bytes.com/topic/javascript/answers/153164-return-selectionstart-div

【讨论】:

  • 在突出显示的文本之外单击时文本应该消失,还是这是一个错误?
  • 哦,是的,这只是一个错误。我相信你可以弄清楚如何解决它;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2011-09-13
  • 2012-09-07
  • 2022-07-19
  • 2013-10-11
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多