mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-05-20 20:31:52 +00:00
fix(jqLite): attr for boolean attribute should lowercase value
This commit is contained in:
parent
66fdb36ecb
commit
8f46a3c9ac
2 changed files with 38 additions and 7 deletions
|
|
@ -290,7 +290,7 @@ var JQLitePrototype = JQLite.prototype = {
|
||||||
// value on get.
|
// value on get.
|
||||||
//////////////////////////////////////////
|
//////////////////////////////////////////
|
||||||
var BOOLEAN_ATTR = {};
|
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;
|
BOOLEAN_ATTR[lowercase(value)] = value;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -340,17 +340,22 @@ forEach({
|
||||||
},
|
},
|
||||||
|
|
||||||
attr: function(element, name, value){
|
attr: function(element, name, value){
|
||||||
if (BOOLEAN_ATTR[name]) {
|
var lowercasedName = lowercase(name);
|
||||||
|
if (BOOLEAN_ATTR[lowercasedName]) {
|
||||||
if (isDefined(value)) {
|
if (isDefined(value)) {
|
||||||
if (!!value) {
|
if (!!value) {
|
||||||
element[name] = true;
|
element[name] = true;
|
||||||
element.setAttribute(name, name);
|
element.setAttribute(name, lowercasedName);
|
||||||
} else {
|
} else {
|
||||||
element[name] = false;
|
element[name] = false;
|
||||||
element.removeAttribute(name);
|
element.removeAttribute(lowercasedName);
|
||||||
}
|
}
|
||||||
} else {
|
} 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)) {
|
} else if (isDefined(value)) {
|
||||||
element.setAttribute(name, value);
|
element.setAttribute(name, value);
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ describe('jqLite', function() {
|
||||||
this.addMatchers({
|
this.addMatchers({
|
||||||
toJqEqual: function(expected) {
|
toJqEqual: function(expected) {
|
||||||
var msg = "Unequal length";
|
var msg = "Unequal length";
|
||||||
this.message = function() { return msg; };
|
this.message = function() {return msg;};
|
||||||
|
|
||||||
var value = this.actual && expected && this.actual.length == expected.length;
|
var value = this.actual && expected && this.actual.length == expected.length;
|
||||||
for (var i = 0; value && i < expected.length; i++) {
|
for (var i = 0; value && i < expected.length; i++) {
|
||||||
|
|
@ -191,13 +191,16 @@ describe('jqLite', function() {
|
||||||
expect(jqLite(b).attr('prop')).toBeFalsy();
|
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>');
|
var select = jqLite('<select>');
|
||||||
expect(select.attr('multiple')).toBeUndefined();
|
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="">').attr('multiple')).toBe('multiple');
|
expect(jqLite('<select multiple="">').attr('multiple')).toBe('multiple');
|
||||||
expect(jqLite('<select multiple="x">').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);
|
select.attr('multiple', false);
|
||||||
expect(select.attr('multiple')).toBeUndefined();
|
expect(select.attr('multiple')).toBeUndefined();
|
||||||
|
|
||||||
|
|
@ -205,6 +208,29 @@ describe('jqLite', function() {
|
||||||
expect(select.attr('multiple')).toBe('multiple');
|
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() {
|
it('should return undefined for non-existing attributes', function() {
|
||||||
var elm = jqLite('<div class="any">a</div>');
|
var elm = jqLite('<div class="any">a</div>');
|
||||||
expect(elm.attr('non-existing')).toBeUndefined();
|
expect(elm.attr('non-existing')).toBeUndefined();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue