aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/jqLite.js5
-rw-r--r--src/service/compiler.js18
-rw-r--r--test/directive/inputSpec.js23
-rw-r--r--test/jqLiteSpec.js7
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();
+ });
});