在span vanilla中包装单词Javascript

时间:2016-01-20 09:31:26

标签: javascript html

我有一个功能,回复给我一个单词列表(与前一个和下一个qord)。我能够使用RegEx正确地找到文本中的单词,并且知道前一个和下一个单词(所以我只找到一次单词而不是全部相同)。我实际上使用Javascript的替换功能将其包装在SPAN中:

var re = RegExp("(?:^\\W*|(" + 
    motBefore.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + ")\\W+)" +
    motErreur.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + "(?:\\W+(" +
    motAfter.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + ")|\\W*$)", "g");
document.getElementById('edth_corps').innerHTML =
    document.getElementById('edth_corps').innerText
        .replace(re, motBefore + " " + '<span id="' + nbId +
        '" class="erreurOrthographe" ' +
        'oncontextmenu="rightClickMustWork(event, this);return false"> '
        + motErreur + '</span>' + " " + motAfter);

但事实是,因为我被置于这三个词的组中,所以我必须在给予他之前和之后给予他。

我使用这个技术的问题是我放松了所有标点符号,更重要的是,如果有字体标记(或粗体,斜体,下划线),我会松开它们。

我想把这个单词换成一个跨度,就好像它是当前节点的子节点,这个单词没有触及前一个单词和下一个单词(它们都在这里,所以我们有正确的单词,而不是另一个单词出现这个词)。

但是我不知道怎么做,因为我只能使用旧的Javascript(IE编译器设置为IE5的兼容模式,而且这个功能是我唯一无法为此版本重写的功能)。我不能使用这样的Jquery库(我已经看到了很多解决方案)。

有人能指出我正确的方向吗?即使错误词在他周围没有父母但只是句子的一部分,插入是否可以工作?

1 个答案:

答案 0 :(得分:1)

这不是一个完整的答案,但希望它会有用。您可以使用IE中的TextRange对象来修改元素中的文本。这与the W3C Range object类似,但旧版本的IE支持它。使用此对象,您可以选择文本,查找文本和修改文本。

找到所需的文字将是一个棘手的部分,但是一旦你找到它并在一个范围内选择它,就很容易修改HTML。

作为一个简单的例子,我创建了a Fiddle,它在div中找到一个字符串并用span包围它:

var findString = "JavaScript";
var content = document.getElementById("content");
var textRange = document.body.createTextRange();
textRange.moveToElementText(content);
if (textRange.findText(findString)) {
  var html = "<span class='selected'>" + findString + "</span>";
  textRange.pasteHTML(html);
}

希望这有帮助。