fix(jqLite): correctly dealoc svg elements in IE

SVG elements in IE don't have a `.children` but only `.childNodes` so it broke.
We started using `.children` for perf in e35abc9d2f.

This also acts as a perf improvements, since
`getElementsByTagName` is faster than traversing the tree.

Related #8075
This commit is contained in:
rodyhaddad
2014-07-10 11:19:18 -07:00
parent 9c5b407fd1
commit 012ab1f874

View File

@@ -243,12 +243,16 @@ function jqLiteClone(element) {
return element.cloneNode(true);
}
function jqLiteDealoc(element){
jqLiteRemoveData(element);
var childElement;
for ( var i = 0, children = element.children, l = (children && children.length) || 0; i < l; i++) {
childElement = children[i];
jqLiteDealoc(childElement);
function jqLiteDealoc(element, onlyDescendants){
if (!onlyDescendants) jqLiteRemoveData(element);
if (element.childNodes && element.childNodes.length) {
// we use querySelectorAll because documentFragments don't have getElementsByTagName
var descendants = element.getElementsByTagName ? element.getElementsByTagName('*') :
element.querySelectorAll ? element.querySelectorAll('*') : [];
for (var i = 0, l = descendants.length; i < l; i++) {
jqLiteRemoveData(descendants[i]);
}
}
}
@@ -430,9 +434,7 @@ function jqLiteInheritedData(element, name, value) {
}
function jqLiteEmpty(element) {
for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {
jqLiteDealoc(childNodes[i]);
}
jqLiteDealoc(element, true);
while (element.firstChild) {
element.removeChild(element.firstChild);
}
@@ -630,9 +632,7 @@ forEach({
if (isUndefined(value)) {
return element.innerHTML;
}
for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {
jqLiteDealoc(childNodes[i]);
}
jqLiteDealoc(element, true);
element.innerHTML = value;
},