Codemirror:从 span 标签中检索字符索引
Codemirror: Retrieve character index from span tag
所以我在一个文档的左边有一个codemirror实例,在右边有一个iframe。当代码在编辑器中更新时,它被写入 iframe。
在这次重写过程中,我为使用 jQuery 的 $.data 函数创建的每个元素添加了一个索引,这样每当用户将鼠标悬停在该元素上时,它就可以在编辑.
到目前为止,我已经设法根据生成的 <span class="cm-tag cm-bracket">
标记所在的位置在编辑器中挑选出所需元素的位置,并为其提供 cm-custom-highlight
的 class。
我的问题是 - 有什么方法可以将源跨度标签的实例变成编辑器中的实际选择吗?
更新: 回答了我自己的问题 - 见下文!您可以查看我的结果代码 here.
我回答了我自己的问题!怎么样?
事实证明,CodeMirror 在其 display
容器中有一个整洁的小节点列表。我需要做的就是遍历 CodeMirror.display.renderedView[lineNumber].measure.map
并测试每个文本节点的 parentNode
属性 以查看它是否与我突出显示的 span
相同。
map
数组的结构如下:
[
0: 0
1: 1
2: text
3: 1
4: 5
...
]
这里的每个text
节点是指编辑器中的一段代码,前后的数字是指它的字符索引,所以很容易找到我需要的索引:
var span = $('span.cm-custom-highlight', CodeMirror.display.lineDiv),
lineNumber = span.closest('.CodeMirror-line').closest('div[style]').index(),
lineView = CodeMirror.display.renderedView[lineNumber].measure.map,
char = 0;
for(var i in lineView.measure.map)
{
if(!char &&
typeof lineView.measure.map[i] == 'object' &&
lineView.measure.map[i].parentNode && span[0] == lineView.measure.map[i].parentNode)
{
char = lineView.measure.map[i - 1];
}
}
当然有点乱,但它很好地完成了工作。
使用markText
而不是直接乱用编辑器的DOM会得到更好的结果。 DOM 和视图数据结构不是接口的一部分,并且会在版本之间发生变化。编辑器还可以随时更新其 DOM,覆盖您所做的更改。
所以我在一个文档的左边有一个codemirror实例,在右边有一个iframe。当代码在编辑器中更新时,它被写入 iframe。
在这次重写过程中,我为使用 jQuery 的 $.data 函数创建的每个元素添加了一个索引,这样每当用户将鼠标悬停在该元素上时,它就可以在编辑.
到目前为止,我已经设法根据生成的 <span class="cm-tag cm-bracket">
标记所在的位置在编辑器中挑选出所需元素的位置,并为其提供 cm-custom-highlight
的 class。
我的问题是 - 有什么方法可以将源跨度标签的实例变成编辑器中的实际选择吗?
更新: 回答了我自己的问题 - 见下文!您可以查看我的结果代码 here.
我回答了我自己的问题!怎么样?
事实证明,CodeMirror 在其 display
容器中有一个整洁的小节点列表。我需要做的就是遍历 CodeMirror.display.renderedView[lineNumber].measure.map
并测试每个文本节点的 parentNode
属性 以查看它是否与我突出显示的 span
相同。
map
数组的结构如下:
[
0: 0
1: 1
2: text
3: 1
4: 5
...
]
这里的每个text
节点是指编辑器中的一段代码,前后的数字是指它的字符索引,所以很容易找到我需要的索引:
var span = $('span.cm-custom-highlight', CodeMirror.display.lineDiv),
lineNumber = span.closest('.CodeMirror-line').closest('div[style]').index(),
lineView = CodeMirror.display.renderedView[lineNumber].measure.map,
char = 0;
for(var i in lineView.measure.map)
{
if(!char &&
typeof lineView.measure.map[i] == 'object' &&
lineView.measure.map[i].parentNode && span[0] == lineView.measure.map[i].parentNode)
{
char = lineView.measure.map[i - 1];
}
}
当然有点乱,但它很好地完成了工作。
使用markText
而不是直接乱用编辑器的DOM会得到更好的结果。 DOM 和视图数据结构不是接口的一部分,并且会在版本之间发生变化。编辑器还可以随时更新其 DOM,覆盖您所做的更改。