使用javascript将所选文本设为粗体

时间:2011-03-18 11:40:55

标签: javascript jquery range

我的标记中有一个文字:

<div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Vestibulum condimentum consectetur tellus, at bibendum felis ultrices eu.
Nullam nibh urna, euismod a blandit ut, fermentum a leo. Maecenas pharetra elementum fringilla.
Quisque condimentum, nibh quis elementum porttitor, magna libero malesuada dolor, ut feugiat tortor lectus ac turpis. Integer tristique molestie enim, sit amet commodo risus tempus non.
</div>

当用户选择文本并按CTRL + Enter时,我想用<b></b>标签包装所选文本。我得到了所选文本,但无法找到如何用标记包装它。这就是我所拥有的:

function getSelectedText () {
    if (window.getSelection) {
        return window.getSelection ().toString ();
    }
    else {
        if (document.selection) {
            return document.selection.createRange ().text;
        }
    }
    return '';
}

$ (document).ready (function() {

    // User pressed a key 
    $ (document).keydown (function(e) {
        // is it CTRL+ENTER?
    if (e.which == 13 && e.ctrlKey) {
            alert('You have selected ' + getSelectedText ());
            // now I need to highlight the text I got
            // ????
    }
    });
});

请注意!简单的查找/替换不起作用,如果用户选择了一个可以在文本中找到10次的'a'字母,我想突出显示唯一的'a'他选择了。我研究了范围对象,但无法弄清楚如何实现它,请帮帮我。

请参阅jsfiddle上的演示。

3 个答案:

答案 0 :(得分:5)

也许这可以帮到你:http://code.google.com/p/rangy/

examples中的一个正是你所追求的。

答案 1 :(得分:4)

您可以使用document.execCommand()。以下是我对类似问题的回答:Javascript: how to un-surroundContents range

答案 2 :(得分:2)

这适用于(在Chrome中),但只要它只调用一次!

(在http://jsfiddle.net/HaD6k/运行代码)

$(document).keypress(function(e) {
    if (e.which == 13 && e.ctrlKey) {
        var s = getSelection();
        var i = s.baseOffset;
        var j = s.extentOffset;
        var t = $('div').text();
        var t0 = t.substring(0, i) + '<span class="b">' +
                 t.substring(i, j) + '</span>' +
                 t.substring(j);
        $('div').html(t0);
    }
});

它只运行一次的原因是因为它修改DOM以添加标记,这意味着下次选择偏移和元素不是连续的。我还在看那个......