我有以下代码来替换选定的文本:(在选定的文本之前和之后分别推入“1”和“2”):var content=$("#text").html();if (window.getSelection) { // not IE case var selObj = window.getSelection(); var selRange = selObj.getRangeAt(0); content2 = content.substring(0,selRange.startOffset) + "1" + content.substring(selRange.startOffset,selRange.endOffset) + "2" + content.substring(selRange.endOffset,content.length); $("#content").html(content2); selRange.removeAllRanges();} else if (document.selection && document.selection.createRange && document.selection.type != "None") { // IE case range = document.selection.createRange(); var selectedText = range.text; var newText = '1' + selectedText + '2'; document.selection.createRange().text = newText;}和HTML:<div id="text">aaa as asd das d</div>这适用于“纯”文本,但是如果我的HTML看起来像这样(纯文本)<div id="text">aaa as <b>asd</b> das d</div>它在Firefox中崩溃,因为selRange.startOffset对象未返回所需的位置...还有另一个问题...在IE中,这对于加粗的“正常”文本来说可以很好地工作,但是由于对于IE,我不使用jquery html()函数-不能用HTML代码替换文本。因此,如果我想使用“”和“”而不是“1”和“2”,则文本不会像Firefox中那样加粗。这两个问题可以解决吗? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 startOffset和endOffset是当前节点中的偏移量,要获取它,您需要range.startContainer和range.endContainer。编辑:如果startContainer和endContainer在同一级别(保留DOM树结构),则效果很好。EDIT2:现在,它将每个选定的文本设为粗体。我也重写了IE部分,现在它可以在HTML上运行,所以很好。 http://jsfiddle.net/FYJtN/11/if (window.getSelection) { // not IE case var selObj = window.getSelection(); var selRange = selObj.getRangeAt(0); var newElement = document.createElement("b"); var documentFragment = selRange.extractContents(); newElement.appendChild(documentFragment); selRange.insertNode(newElement); selObj.removeAllRanges();} else if (document.selection && document.selection.createRange && document.selection.type != "None") { // IE case var range = document.selection.createRange(); var selectedText = range.htmlText; var newText = '<b>' + selectedText + '</b>'; document.selection.createRange().pasteHTML(newText);} (adsbygoogle = window.adsbygoogle || []).push({});