我正在尝试创建一个类似以下方式工作的荧光笔工具:
- 用户首先选择一段文本。 - 然后单击其中一个颜色按钮,所选文本的背景色将被突出显示。 - 然后他们选择另一段文本... - 现在当他们单击按钮时,所有HTML都将替换为HTML的缓存版本(没有高亮显示)。 - 然后新选择的已突出显示的文本将附加回新的HTML中。
这样只有一段文本可以被突出显示。
问题:
我很难理解 Range, Selection和 Node API。
目前,我无法将突出显示的文本添加回新的HTML中...我只将其附加到了document.body中。
我目前的进展是:
- 用户首先选择一段文本。 - 然后单击其中一个颜色按钮,所选文本的背景色将被突出显示。 - 然后他们选择另一段文本... - 现在当他们单击按钮时,所有HTML都将替换为HTML的缓存版本(没有高亮显示)。 - 然后新选择的已突出显示的文本将附加回新的HTML中。
这样只有一段文本可以被突出显示。
问题:
我很难理解 Range, Selection和 Node API。
目前,我无法将突出显示的文本添加回新的HTML中...我只将其附加到了document.body中。
我目前的进展是:
https://jsfiddle.net/4mb39jd6/
(function(){
var highlighter = {
/**
*
*/
init: function(){
this.cacheDOM();
this.bindEvents();
},
/**
*
*/
cacheDOM: function(){
this.$html = $('.content').html();
this.$content = $('.content');
this.$highlighter = $('.highlighter');
},
/**
*
*/
bindEvents: function(){
this.$highlighter.on('mousedown', this.highlightSelection.bind(this));
},
/**
*
*/
highlightSelection: function(e){
var selection = window.getSelection(); // get selection
var text = selection.toString(); // get selected text
var newNode = document.createElement('span'); // create node
newNode.style.backgroundColor = $(e.target).css('backgroundColor'); // set node properties
newNode.appendChild(document.createTextNode(text)); // append selection text to node
var range = selection.getRangeAt(0); // 2 - get the selected range
range.deleteContents(); // delete the contents
range.insertNode(newNode); // insert the new node with the replacement text
documentFragment = range.cloneContents(); // clone the node
this.$content.html(this.$html); // refresh the content
document.body.appendChild(documentFragment); // add the new highlighted text
},
};
highlighter.init();
})();
问题:
如何将我高亮的节点添加回一个新的HTML文档中,它看起来像这样<span style="background-color: rgb(255, 255, 131);">一些随机文本</span>
,以便它在相同的位置。
highlightSection
中注释掉最后三行似乎可以产生所需的行为... https://jsfiddle.net/wxrxf6r1/ - user3297291