**1 節點掃描源代碼(18 scanNode.js)**
~~~
function scanNodeList(parent, vmodels) {
var nodes = avalon.slice(parent.childNodes)
scanNodeArray(nodes, vmodels)
}
function scanNodeArray(nodes, vmodels) {
for (var i = 0, node; node = nodes[i++];) {
switch (node.nodeType) {
case 1:
scanTag(node, vmodels)
if (node.msCallback) {
node.msCallback()
node.msCallback = void 0
}
break
case 3:
if(rexpr.test(node.nodeValue)){
scanText(node, vmodels, i)
}
break
}
}
}
~~~
2 文件分析
>[info] scanNodeList()是子節點掃描處理入口
> scanNodeArray()是子節點數組掃描處理過程
~~~
function scanNodeList(parent, vmodels) {
var nodes = avalon.slice(parent.childNodes)
scanNodeArray(nodes, vmodels)
}
~~~
>[info] scanNodeList()子節點掃描入口
> parent:待掃描節點,
> vmodels:掃描信息保存地方
`var nodes = avalon.slice(parent.childNodes)`
>[info] 調用avalon.slice分解為數組。
> avalon.slice見 avalon全局函數
`scanNodeArray(nodes, vmodels)`
>[info] 掃描子孫節點數組
~~~
function scanNodeArray(nodes, vmodels) {
for (var i = 0, node; node = nodes[i++];) {
switch (node.nodeType) {
case 1:
scanTag(node, vmodels)
if (node.msCallback) {
node.msCallback()
node.msCallback = void 0
}
break
case 3:
if(rexpr.test(node.nodeValue)){
scanText(node, vmodels, i)
}
break
}
}
}
~~~
>[info] scanNodeArry()子節點數組掃描
> 分為普通子節點和文本子節點。
> 普通子節點遞歸使用scanTag進入標簽掃描
> 文本子節點進入標簽文本掃描處理
`for (var i = 0, node; node = nodes[i++];)`
>[info] 遍歷子節點數組。
`switch (node.nodeType)`
>[info] 檢查子節點類型
關于節點類型見基礎原理的DOM接口
`case 1:`
>[info] 普通元素節點,進入標簽掃描scanTag()
> 這里是個遞歸掃描子節點過程
~~~
if (node.msCallback) {
node.msCallback()
node.msCallback = void 0
}
~~~