这次我们继续分析上篇中提到的jqLiteBuildFragment函数,顾名思义,它主要的作用就是根据我们传入的html字符串创建相应的html片段。
jqLiteBuildFragment
1 | function jqLiteBuildFragment(html, context) { |
首先angularjs是如何判断它是文本节点呢?
jqLiteIsTextNode
1 | var HTML_REGEXP = /<|&#?\w+;/; |
通过一个HTML_REGEXP正则表达式,就判断是不是文本节点了,正则意思就是没有<或者且不带&#或&标记的就是文本标记了,&ss;和ss;都属于html
接下来如果获取标记名称呢?通过一个TAG_NAME_REGEXP正则1
var TAG_NAME_REGEXP = /<([\w:-]+)/;
意思就是带有如<div这样的标记就取出div来。然后通过预先定义好的包装映射集合获取到包装器
1 | var wrapMap = { |
这个wrap其实都是应该有父节点的html元素,接下来就个重要的XHTML_TAG_REGEXP正则,可以把我们的
xhtml标记给替换掉1
2
3var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi;
var _rh = html.replace(XHTML_TAG_REGEXP, "<$1></$2>");
可以把类似
最后就是通过包装器预先设置好的层级获取到最后我们传入的html节点,然后遍历节点列表,append到fragment上
这里也巧妙的封装了contact和slice函数
1 | var slice = [].slice; //数组的slice函数 |
我们从这里可以学到平时在js里怎么创建自己的html片段了。下篇我们来分析下jqLite的扩展函数。