diff options
| -rw-r--r-- | src/jqLite.js | 5 | ||||
| -rw-r--r-- | src/service/compiler.js | 18 | ||||
| -rw-r--r-- | test/directive/inputSpec.js | 23 | ||||
| -rw-r--r-- | test/jqLiteSpec.js | 7 |
4 files changed, 42 insertions, 11 deletions
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('<input type="text" ng-model="name" name="alias"/>'); + 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('<input ng-model="name" name="alias" required>'); 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('<div class="any">a</div>'); expect(elm.attr('non-existing')).toBeUndefined(); }); + + it('should return undefined for non-existing attributes on input', function() { + var elm = jqLite('<input>'); + expect(elm.attr('readonly')).toBeUndefined(); + expect(elm.attr('readOnly')).toBeUndefined(); + expect(elm.attr('disabled')).toBeUndefined(); + }); }); |
