From de9464c1431906883bdf180fb00615e6fa371577 Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Tue, 13 Mar 2012 14:42:26 -0700 Subject: f(compile): boolean attributes too agresive - compiler would rewrite boolean attributes on all elements. This is too aggressive and interferes with some third-party frameworks --- src/jqLite.js | 8 ++++++++ src/service/compiler.js | 10 +++++----- 2 files changed, 13 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/jqLite.js b/src/jqLite.js index dd793ab2..96dda112 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -310,6 +310,14 @@ var BOOLEAN_ATTR = {}; forEach('multiple,selected,checked,disabled,readOnly,required'.split(','), function(value) { BOOLEAN_ATTR[lowercase(value)] = value; }); +var BOOLEAN_ELEMENTS = {}; +forEach('input,select,option,textarea,button'.split(','), function(value) { + BOOLEAN_ELEMENTS[uppercase(value)] = true; +}); + +function isBooleanAttr(element, name) { + return BOOLEAN_ELEMENTS[element.nodeName] && BOOLEAN_ATTR[name.toLowerCase()]; +} forEach({ data: JQLiteData, diff --git a/src/service/compiler.js b/src/service/compiler.js index cefc2d81..8aba28e4 100644 --- a/src/service/compiler.js +++ b/src/service/compiler.js @@ -381,10 +381,10 @@ function $CompileProvider($provide) { attrs[nName] = value = trim((msie && name == 'href') ? decodeURIComponent(node.getAttribute(name, 2)) : attr.value); - if (BOOLEAN_ATTR[nName]) { + if (isBooleanAttr(node, nName)) { attrs[nName] = true; // presence means true } - addAttrInterpolateDirective(directives, value, nName) + addAttrInterpolateDirective(node, directives, value, nName) addDirective(directives, nName, 'A', maxPriority); } @@ -852,11 +852,11 @@ function $CompileProvider($provide) { } - function addAttrInterpolateDirective(directives, value, name) { + function addAttrInterpolateDirective(node, directives, value, name) { var interpolateFn = $interpolate(value, true); if (SIDE_EFFECT_ATTRS[name]) { name = SIDE_EFFECT_ATTRS[name]; - if (BOOLEAN_ATTR[name]) { + if (isBooleanAttr(node, name)) { value = true; } } else if (!interpolateFn) { @@ -921,7 +921,7 @@ function $CompileProvider($provide) { * @param {string=} attrName Optional none normalized name. Defaults to key. */ function attrSetter(key, value, attrName) { - var booleanKey = BOOLEAN_ATTR[key.toLowerCase()]; + var booleanKey = isBooleanAttr(this.$element[0], key.toLowerCase()); if (booleanKey) { value = toBoolean(value); -- cgit v1.2.3