Skip to content

Commit

Permalink
处理 html过滤引发的CG回收问题
Browse files Browse the repository at this point in the history
  • Loading branch information
qincheng committed Sep 27, 2014
1 parent 32022fb commit 79d0cce
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 20 deletions.
35 changes: 16 additions & 19 deletions examples/avalon.$events.js
Expand Up @@ -1947,8 +1947,7 @@
var filters = token.filters
var binding = {
type: "text",
node: node,
nodeType: 3,
element: node,
value: token.value,
filters: filters
}
Expand Down Expand Up @@ -2111,7 +2110,7 @@
for (var i = 0, data; data = bindings[i++]; ) {
data.vmodels = vmodels
bindingHandlers[data.type](data, vmodels)
if (data.evaluator && data.name && data.element && data.element.nodeType === 1) { //移除数据绑定,防止被二次解析
if (data.evaluator && data.element && data.element.nodeType === 1) { //移除数据绑定,防止被二次解析
//chrome使用removeAttributeNode移除不存在的特性节点时会报错 https://github.com/RubyLouvre/avalon/issues/99
data.element.removeAttribute(data.name)
}
Expand Down Expand Up @@ -2726,7 +2725,6 @@
transation = parent
}
recycleEachProxies(proxies)
// expelFromSanctuary(transation)
break
case "move": //将proxies中的第pos个元素移动el位置上(pos, el都是数字)
var t = proxies.splice(pos, 1)[0]
Expand Down Expand Up @@ -2781,11 +2779,10 @@
},
"html": function(val, elem, data) {
val = val == null ? "" : val
if (!elem) {
elem = data.element = data.node.parentNode
}
if (data.replaceNodes) {
var parent = elem.nodeType == 3 ? elem.parentNode : elem
if (elem.nodeType === 3) {
var fragment, nodes
//将值转换为文档碎片,原值可以为元素节点,文档碎片,NodeList,字符串
if (val.nodeType === 11) {
fragment = val
} else if (val.nodeType === 1 || val.item) {
Expand All @@ -2798,23 +2795,22 @@
fragment = avalon.parseHTML(val)
}
var replaceNodes = avalon.slice(fragment.childNodes)
elem.insertBefore(fragment, data.replaceNodes[0] || null) //fix IE6-8 insertBefore的第2个参数只能为节点或null
parent.insertBefore(fragment, data.replaceNodes[0] || null) //fix IE6-8 insertBefore的第2个参数只能为节点或null
for (var i = 0, node; node = data.replaceNodes[i++]; ) {
elem.removeChild(node)
parent.removeChild(node)
}
data.replaceNodes = replaceNodes
} else {
avalon.innerHTML(elem, val)
avalon.innerHTML(parent, val)
}
avalon.nextTick(function() {
scanNodeList(elem, data.vmodels)
scanNodeList(parent, data.vmodels)
})
},
"if": function(val, elem, data) {
// var placehoder = data.placehoder
if (val) { //插回DOM树
if (elem.nodeType === 8) {
var node = avalon.parseHTML(data.html).firstChild
var node = avalon.parseHTML(data.template).firstChild
elem.parentNode.replaceChild(node, elem)
data.element = node
if (rbind.test(data.html.replace(rlt, "<").replace(rgt, ">"))) {
Expand Down Expand Up @@ -2865,11 +2861,9 @@
},
"text": function(val, elem, data) {
val = val == null ? "" : val //不在页面上显示undefined null
var node = data.node
if (data.nodeType === 3) { //绑定在文本节点上
data.element = node.parentNode
if (elem.nodeType === 3) { //绑定在文本节点上
try {//IE对游离于DOM树外的节点赋值会报错
node.data = val
elem.data = val
} catch (e) {
}
} else { //绑定在特性节点上
Expand Down Expand Up @@ -3072,7 +3066,7 @@
var elem = data.element
if (elem.nodeType === 1) {
elem.removeAttribute(data.name)
data.html = elem.outerHTML
data.template = elem.outerHTML
var comment = DOC.createComment("ms-if")
elem.parentNode.replaceChild(comment, elem)
data.element = comment
Expand Down Expand Up @@ -3877,6 +3871,9 @@
if (el.proxies) {//ms-repeat ms-with ms-each
el.callbackElement = el.template = null
}
if (el.replaceNodes) {// {{ str | html}}
el.replaceNodes.length = 0
}
}
})
array.length = 0
Expand Down
4 changes: 3 additions & 1 deletion examples/test1.html
Expand Up @@ -20,8 +20,9 @@
return this.firstName + " " + this.lastName;
}
}
vm.color = "red",
vm.color = "red"
vm.toggle = true
vm.html = "<strong>1</strong>2<strong>3</strong>"
vm.changeToggle = function() {
model.toggle = !model.toggle
}
Expand Down Expand Up @@ -81,6 +82,7 @@
<div class="ms-class-test" ms-hover="c-{{color}}:toggle"> </div>
<div><button ms-click="switchColor"> 点我改变悬浮时的背景颜色</button>现在悬浮色为{{color}}</div>
<div><button ms-click="changeToggle"> 点我{{toggle? "禁止": "开启" }}悬浮变色</button></div>
<div>test{{html | html}}test</div>
</div>

</body>
Expand Down

0 comments on commit 79d0cce

Please sign in to comment.