diff options
| author | Igor Minar | 2011-10-12 00:10:20 -0700 |
|---|---|---|
| committer | Igor Minar | 2011-10-12 23:04:47 -0700 |
| commit | 8f46a3c9ac075c6300e974efaecd0d10d986a515 (patch) | |
| tree | 49490d3d3c66cb345c9e0ade7f01e60a275c7b5b | |
| parent | 66fdb36ecbe0ec58ba3367a585b506e11ca1c8ad (diff) | |
| download | angular.js-8f46a3c9ac075c6300e974efaecd0d10d986a515.tar.bz2 | |
fix(jqLite): attr for boolean attribute should lowercase value
| -rw-r--r-- | src/jqLite.js | 15 | ||||
| -rw-r--r-- | test/jqLiteSpec.js | 30 |
2 files changed, 38 insertions, 7 deletions
diff --git a/src/jqLite.js b/src/jqLite.js index e14eb127..816e1ba8 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -290,7 +290,7 @@ var JQLitePrototype = JQLite.prototype = { // value on get. ////////////////////////////////////////// var BOOLEAN_ATTR = {}; -forEach('multiple,selected,checked,disabled,readOnly,required'.split(','), function(value, key) { +forEach('multiple,selected,checked,disabled,readOnly,required'.split(','), function(value) { BOOLEAN_ATTR[lowercase(value)] = value; }); @@ -340,17 +340,22 @@ forEach({ }, attr: function(element, name, value){ - if (BOOLEAN_ATTR[name]) { + var lowercasedName = lowercase(name); + if (BOOLEAN_ATTR[lowercasedName]) { if (isDefined(value)) { if (!!value) { element[name] = true; - element.setAttribute(name, name); + element.setAttribute(name, lowercasedName); } else { element[name] = false; - element.removeAttribute(name); + element.removeAttribute(lowercasedName); } } else { - return (element[name] || element.getAttribute(name)) ? name : undefined; + return (element[name] || + element.getAttribute(name) !== null && + (msie < 9 ? element.getAttribute(name) !== '' : true)) + ? lowercasedName + : undefined; } } else if (isDefined(value)) { element.setAttribute(name, value); diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 96712210..2f9a5fb9 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -15,7 +15,7 @@ describe('jqLite', function() { this.addMatchers({ toJqEqual: function(expected) { var msg = "Unequal length"; - this.message = function() { return msg; }; + this.message = function() {return msg;}; var value = this.actual && expected && this.actual.length == expected.length; for (var i = 0; value && i < expected.length; i++) { @@ -191,13 +191,16 @@ describe('jqLite', function() { expect(jqLite(b).attr('prop')).toBeFalsy(); }); - it('should read special attributes as strings', function() { + it('should read boolean attributes as strings', function() { var select = jqLite('<select>'); expect(select.attr('multiple')).toBeUndefined(); expect(jqLite('<select multiple>').attr('multiple')).toBe('multiple'); expect(jqLite('<select multiple="">').attr('multiple')).toBe('multiple'); expect(jqLite('<select multiple="x">').attr('multiple')).toBe('multiple'); + }); + it('should add/remove boolean attributes', function() { + var select = jqLite('<select>'); select.attr('multiple', false); expect(select.attr('multiple')).toBeUndefined(); @@ -205,6 +208,29 @@ describe('jqLite', function() { expect(select.attr('multiple')).toBe('multiple'); }); + it('should normalize the case of boolean attributes', function() { + var input = jqLite('<input readonly>'); + expect(input.attr('readonly')).toBe('readonly'); + expect(input.attr('readOnly')).toBe('readonly'); + expect(input.attr('READONLY')).toBe('readonly'); + + input.attr('readonly', false); + + // attr('readonly') fails in jQuery 1.6.4, so we have to bypass it + //expect(input.attr('readOnly')).toBeUndefined(); + //expect(input.attr('readonly')).toBeUndefined(); + if (msie < 9) { + expect(input[0].getAttribute('readonly')).toBe(''); + } else { + expect(input[0].getAttribute('readonly')).toBe(null); + } + //expect('readOnly' in input[0].attributes).toBe(false); + + input.attr('readOnly', 'READonly'); + expect(input.attr('readonly')).toBe('readonly'); + expect(input.attr('readOnly')).toBe('readonly'); + }); + it('should return undefined for non-existing attributes', function() { var elm = jqLite('<div class="any">a</div>'); expect(elm.attr('non-existing')).toBeUndefined(); |
