diff --git a/src/jqLite.js b/src/jqLite.js index 986d0002..79f22e62 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -328,7 +328,7 @@ forEach('multiple,selected,checked,disabled,readOnly,required'.split(','), funct BOOLEAN_ATTR[lowercase(value)] = value; }); var BOOLEAN_ELEMENTS = {}; -forEach('input,select,option,textarea,button'.split(','), function(value) { +forEach('input,select,option,textarea,button,form'.split(','), function(value) { BOOLEAN_ELEMENTS[uppercase(value)] = true; }); @@ -394,8 +394,7 @@ forEach({ } } else { return (element[name] || - element.getAttribute(name) !== null && - (msie < 9 ? element.getAttribute(name) !== '' : true)) + (element.attributes.getNamedItem(name)|| noop).specified) ? lowercasedName : undefined; } diff --git a/src/service/compiler.js b/src/service/compiler.js index 6cbfc9d3..4ac01a7c 100644 --- a/src/service/compiler.js +++ b/src/service/compiler.js @@ -378,17 +378,19 @@ function $CompileProvider($provide) { for (var attr, name, nName, value, nAttrs = node.attributes, j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) { attr = nAttrs[j]; - name = attr.name; - nName = directiveNormalize(name.toLowerCase()); - attrsMap[nName] = name; - attrs[nName] = value = trim((msie && name == 'href') + if (attr.specified) { + name = attr.name; + nName = directiveNormalize(name.toLowerCase()); + attrsMap[nName] = name; + attrs[nName] = value = trim((msie && name == 'href') ? decodeURIComponent(node.getAttribute(name, 2)) : attr.value); - if (isBooleanAttr(node, nName)) { - attrs[nName] = true; // presence means true + if (isBooleanAttr(node, nName)) { + attrs[nName] = true; // presence means true + } + addAttrInterpolateDirective(node, directives, value, nName) + addDirective(directives, nName, 'A', maxPriority); } - addAttrInterpolateDirective(node, directives, value, nName) - addDirective(directives, nName, 'A', maxPriority); } // use class as directive diff --git a/test/directive/inputSpec.js b/test/directive/inputSpec.js index 2a7244c9..22c77f53 100644 --- a/test/directive/inputSpec.js +++ b/test/directive/inputSpec.js @@ -316,6 +316,29 @@ describe('input', function() { }); + it('should not set readonly or disabled property on ie7', function() { + this.addMatchers({ + toBeOff: function(attributeName) { + var actualValue = this.actual.attr(attributeName); + this.message = function() { + return "Attribute '" + attributeName + "' expected to be off but was '" + actualValue + + "' in: " + angular.mock.dump(this.actual); + } + + return !actualValue || actualValue == 'false'; + } + }); + + compileInput(''); + expect(inputElm.prop('readOnly')).toBe(false); + expect(inputElm.prop('disabled')).toBe(false); + + expect(inputElm).toBeOff('readOnly'); + expect(inputElm).toBeOff('readonly'); + expect(inputElm).toBeOff('disabled'); + }); + + it('should cleanup it self from the parent form', function() { compileInput(''); diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 417b912c..fbe6edcb 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -268,6 +268,13 @@ describe('jqLite', function() { var elm = jqLite('