如题目。
获取元素下的所有文本节点,并返回文本信息
/**
* 获取元素下的所有文本节点,并返回文本信息
* @param { Element } el - 元素
* @example
* getTextNodeInfosByEl(el)
* => [{
* node, // 文本节点
* text, // 文本内容
* startI, // 文本相对于元素总文本的开始位置
* endI // 文本相对于元素总文本的结束位置
* }]
**/
function getTextNodeInfosByEl (el) {
var infos = []
// 递归获取所有的 textNode 节点
var textNodes = (function () {
var results = []
// 这里需要将 nodeList 转为普通的数组,方便后续操作
var nodeList = Array.apply(null, el.childNodes)
// 递归获取所有的文本节点
while (nodeList.length) {
var node = nodeList.shift()
if (node.nodeType === node.TEXT_NODE) {
results.push(node)
}
else {
nodeList = [].concat(
// 转为普通数组
Array.apply(null, node.childNodes),
nodeList
)
}
}
return results
})()
// 记录总的文本长度
var length = 0
// 整理节点数据
textNodes.forEach(function (node) {
var text = node.wholeText || ''
var startI = length
var endI = length + text.length
length = endI
infos.push({
node: node,
text: text,
startI: startI,
endI: endI
})
})
return infos
}