【发布时间】:2020-06-23 03:06:38
【问题描述】:
我创建了一个函数,它将所选文本包装在 h1 标签中,并在再次调用时删除标签。如果您选择的区域大于先前的选择,该功能还会删除标签并重新创建。
但是,如果从所选内容创建标题后,选择另一个文本,然后再次选择单词,则标签不会包含在所选内容中(尽管所选内容与创建的标题完全一致)。我使用 Selection 和 Range 方法。
事实证明,通过重复选择,标签不会落入选择中。 我也尝试过使用正则表达式进行自动替换,但这种方法并不好,因为一个短语或一个词在文本中可能会出现多次。
请告诉我,Javascript 中是否有任何方法可以让我们找到与此选择匹配的节点?
也许我没有解释清楚,为了更好地展示,我创建了一个 sn-p 来证明这一点。发生了什么:
https://jsfiddle.net/narzantaria/2ex6bnq3/2/
这里也是相同的代码。点击按钮调用该函数:
document.getElementById('h1-trigger').addEventListener('click', function () {
headerFormatter();
});
function headerFormatter() {
let newTag = document.createElement('h1');
if (window.getSelection) {
let sel = window.getSelection();
if (sel.rangeCount) {
let range = sel.getRangeAt(0).cloneRange();
// create an object from range for querying tags
let rangeProxy = sel.getRangeAt(0).cloneContents();
if (rangeProxy.querySelector('h1')) {
let tagContent = rangeProxy.querySelector('h1').innerHTML;
// compare selection length with queried tag length
if (range.startOffset == 1) {
tagContent = tagContent.replace(/(<([^>]+)>)/ig, "");
range.deleteContents();
range.insertNode(document.createTextNode(tagContent));
sel.removeAllRanges();
sel.addRange(range);
return;
}
else {
let rangeToString = range.toString().replace(/(<([^>]+)>)/ig, "");
range.deleteContents();
range.insertNode(document.createTextNode(rangeToString));
sel.removeAllRanges();
sel.addRange(range);
return;
}
} else {
range.surroundContents(newTag);
sel.removeAllRanges();
sel.addRange(range);
}
}
}
}
问候。
【问题讨论】:
标签: javascript html