【发布时间】:2019-12-02 23:27:36
【问题描述】:
如果我有以下 DOM 结构,我会在选择文本含义后尝试获取我所在的节点:
<p>
This is an example
<span style="text-transform: uppercase">text in caps</span>
some more text in here
</p>
当我选择大写文本时,我想获取此选择所在的节点。在这种情况下,将是<span>,以防我当然选择了所有内容。
我知道有一个名为 rangy 的库,但我认为仅使用它来获取这些节点对我来说有点矫枉过正,还有其他方法可以检索它吗?
这是我到目前为止的实现方式:
var select = window.getSelection();
if (select.rangeCount) {
var $elem = $('<span>', {'style': 'text-transform: ' + type});
var range = select.getRangeAt(0).cloneRange();
var selectedNode = range.cloneContents().childNodes[0];
var nodeHasStyle = !!(selectedNode.style && selectedNode.style.textTransform.length !== 0);
if (nodeHasStyle) {
// If it's the same as previous, just toggle it by resetting the node
var currentStyle = selectedNode.style.textTransform;
selectedNode.style.textTransform = currentStyle === type ? '' : type;
}
range.surroundContents(!nodeHasStyle ? $elem.get(0) : selectedNode);
select.removeAllRanges();
select.addRange(range);
但注意到selectedNode 并不总是正确的。所以每当我做环绕内容时,它都会在我一开始就应该得到的那个周围添加一个新的跨度。
我正在使用summernote 在选定文本范围内切换大写、小写文本转换。
任何帮助将不胜感激。
谢谢。
【问题讨论】:
标签: javascript summernote