0

我有以下使用 rangy 的代码,它允许用户将类应用于选定的文本:

<div><span>This is some text that users can select</span></div>

当用户选择文本并应用一个类时,代码变成:

 <div><span>This is some <span class='someclass'>text</span> users can select</span</div>

我需要一种方法先结束前一个 span 标签,然后再创建一个新标签:

<div><span>This is some </span><span class='someclass'>text</span><span> users can select</span</div>

rangy 库没有内置的方法来执行此操作。我尝试使用:

$('.someclass').before("</span>")

$('.someclass').after("<span>")

但这没有用。

有任何想法吗?

4

3 回答 3

3

最快的方法是将处理 span 类插入的代码更改为:

在选择之前插入

</span><span class='someclass'>

和选择后

</span><span>

使用范围和环绕内容:

var spanparent = $('div > span').get(0);
var range = document.createRange();

// create <span>This is some </span>
var startSpan = document.createElement("span");
range.setStart(spanparent,0);
range.setEnd(spanparent,1);
range.surroundContents(startSpan);

// create <span> users can select</span>
var endSpan = document.createElement("span");
range.setStart(spanparent,2);
range.setEnd(spanparent,3);
range.surroundContents(endSpan);

//result:
//<div>
//  <span>
//      <span>This is some </span>
//      <span class="someclass">text</span>
//      <span> users can select</span>
//  </span>
//</div>

// remove the outer span
var contents = $(spanparent).html();
$(spanparent).replaceWith(contents);
于 2013-06-25T14:27:34.230 回答
1

这样的事情会做

$('.someclass').parent().each(function(){
    $(this).contents().each(function(){
        if(this.nodeType == 3){
            $(this).wrap('<span />')
        }
    });
    $(this).contents().unwrap()
})

演示:小提琴

于 2013-06-26T03:52:09.810 回答
0

希望这可以帮助

给 div 一个 id 让我们说 myDiv。

$(function(){
   var selectedText = ""; // Store the selected text in this variable
   var indexOfText = $("#myDiv").text().indexOf(selectedText);
   var originalString = $("#myDiv").text();
   var part1 = originalString.substring(0, indexOfText);
   var part2 = originalString.substring(indexOfText + selectedText.length, originalString.length - 1);
   var newString = "<span>" + part1 + "</span><span>" + selectedText + "</span><span>" + part2 + "</span>";
   $("#myDiv").empty();
   $("#myDiv").html(newString);
});
于 2013-06-25T14:04:57.663 回答