Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 8f46a3c

Browse files
committed
fix(jqLite): attr for boolean attribute should lowercase value
1 parent 66fdb36 commit 8f46a3c

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

src/jqLite.js

+10-5
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ var JQLitePrototype = JQLite.prototype = {
290290
// value on get.
291291
//////////////////////////////////////////
292292
var BOOLEAN_ATTR = {};
293-
forEach('multiple,selected,checked,disabled,readOnly,required'.split(','), function(value, key) {
293+
forEach('multiple,selected,checked,disabled,readOnly,required'.split(','), function(value) {
294294
BOOLEAN_ATTR[lowercase(value)] = value;
295295
});
296296

@@ -340,17 +340,22 @@ forEach({
340340
},
341341

342342
attr: function(element, name, value){
343-
if (BOOLEAN_ATTR[name]) {
343+
var lowercasedName = lowercase(name);
344+
if (BOOLEAN_ATTR[lowercasedName]) {
344345
if (isDefined(value)) {
345346
if (!!value) {
346347
element[name] = true;
347-
element.setAttribute(name, name);
348+
element.setAttribute(name, lowercasedName);
348349
} else {
349350
element[name] = false;
350-
element.removeAttribute(name);
351+
element.removeAttribute(lowercasedName);
351352
}
352353
} else {
353-
return (element[name] || element.getAttribute(name)) ? name : undefined;
354+
return (element[name] ||
355+
element.getAttribute(name) !== null &&
356+
(msie < 9 ? element.getAttribute(name) !== '' : true))
357+
? lowercasedName
358+
: undefined;
354359
}
355360
} else if (isDefined(value)) {
356361
element.setAttribute(name, value);

test/jqLiteSpec.js

+28-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe('jqLite', function() {
1515
this.addMatchers({
1616
toJqEqual: function(expected) {
1717
var msg = "Unequal length";
18-
this.message = function() { return msg; };
18+
this.message = function() {return msg;};
1919

2020
var value = this.actual && expected && this.actual.length == expected.length;
2121
for (var i = 0; value && i < expected.length; i++) {
@@ -191,20 +191,46 @@ describe('jqLite', function() {
191191
expect(jqLite(b).attr('prop')).toBeFalsy();
192192
});
193193

194-
it('should read special attributes as strings', function() {
194+
it('should read boolean attributes as strings', function() {
195195
var select = jqLite('<select>');
196196
expect(select.attr('multiple')).toBeUndefined();
197197
expect(jqLite('<select multiple>').attr('multiple')).toBe('multiple');
198198
expect(jqLite('<select multiple="">').attr('multiple')).toBe('multiple');
199199
expect(jqLite('<select multiple="x">').attr('multiple')).toBe('multiple');
200+
});
200201

202+
it('should add/remove boolean attributes', function() {
203+
var select = jqLite('<select>');
201204
select.attr('multiple', false);
202205
expect(select.attr('multiple')).toBeUndefined();
203206

204207
select.attr('multiple', true);
205208
expect(select.attr('multiple')).toBe('multiple');
206209
});
207210

211+
it('should normalize the case of boolean attributes', function() {
212+
var input = jqLite('<input readonly>');
213+
expect(input.attr('readonly')).toBe('readonly');
214+
expect(input.attr('readOnly')).toBe('readonly');
215+
expect(input.attr('READONLY')).toBe('readonly');
216+
217+
input.attr('readonly', false);
218+
219+
// attr('readonly') fails in jQuery 1.6.4, so we have to bypass it
220+
//expect(input.attr('readOnly')).toBeUndefined();
221+
//expect(input.attr('readonly')).toBeUndefined();
222+
if (msie < 9) {
223+
expect(input[0].getAttribute('readonly')).toBe('');
224+
} else {
225+
expect(input[0].getAttribute('readonly')).toBe(null);
226+
}
227+
//expect('readOnly' in input[0].attributes).toBe(false);
228+
229+
input.attr('readOnly', 'READonly');
230+
expect(input.attr('readonly')).toBe('readonly');
231+
expect(input.attr('readOnly')).toBe('readonly');
232+
});
233+
208234
it('should return undefined for non-existing attributes', function() {
209235
var elm = jqLite('<div class="any">a</div>');
210236
expect(elm.attr('non-existing')).toBeUndefined();

0 commit comments

Comments
 (0)