我的标记中有一个文字:
<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上的演示。
答案 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以添加标记,这意味着下次选择偏移和元素不是连续的。我还在看那个......