Skip to content

Commit ba244c4

Browse files
RobiFerentzbillthompson
authored andcommitted
fix(jqLite): attr should ignore comment, text and attribute nodes
Follow jQuery handling of the `attr` function Close angular#11038
1 parent 0524e92 commit ba244c4

File tree

4 files changed

+31
-0
lines changed

4 files changed

+31
-0
lines changed

src/.jshintrc

+1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
"skipDestroyOnNextJQueryCleanData": true,
9595

9696
"NODE_TYPE_ELEMENT": false,
97+
"NODE_TYPE_ATTRIBUTE": false,
9798
"NODE_TYPE_TEXT": false,
9899
"NODE_TYPE_COMMENT": false,
99100
"NODE_TYPE_COMMENT": false,

src/Angular.js

+2
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
createMap: true,
8686
8787
NODE_TYPE_ELEMENT: true,
88+
NODE_TYPE_ATTRIBUTE: true,
8889
NODE_TYPE_TEXT: true,
8990
NODE_TYPE_COMMENT: true,
9091
NODE_TYPE_DOCUMENT: true,
@@ -1599,6 +1600,7 @@ function createMap() {
15991600
}
16001601

16011602
var NODE_TYPE_ELEMENT = 1;
1603+
var NODE_TYPE_ATTRIBUTE = 2;
16021604
var NODE_TYPE_TEXT = 3;
16031605
var NODE_TYPE_COMMENT = 8;
16041606
var NODE_TYPE_DOCUMENT = 9;

src/jqLite.js

+4
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,10 @@ forEach({
587587
},
588588

589589
attr: function(element, name, value) {
590+
var nodeType = element.nodeType;
591+
if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT) {
592+
return;
593+
}
590594
var lowercasedName = lowercase(name);
591595
if (BOOLEAN_ATTR[lowercasedName]) {
592596
if (isDefined(value)) {

test/jqLiteSpec.js

+24
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,30 @@ describe('jqLite', function() {
612612
expect(elm.attr('readOnly')).toBeUndefined();
613613
expect(elm.attr('disabled')).toBeUndefined();
614614
});
615+
616+
it('should do nothing when setting or getting on attribute nodes', function() {
617+
var attrNode = jqLite(document.createAttribute('myattr'));
618+
expect(attrNode).toBeDefined();
619+
expect(attrNode[0].nodeType).toEqual(2);
620+
expect(attrNode.attr('some-attribute','somevalue')).toEqual(attrNode);
621+
expect(attrNode.attr('some-attribute')).toBeUndefined();
622+
});
623+
624+
it('should do nothing when setting or getting on text nodes', function() {
625+
var textNode = jqLite(document.createTextNode('some text'));
626+
expect(textNode).toBeDefined();
627+
expect(textNode[0].nodeType).toEqual(3);
628+
expect(textNode.attr('some-attribute','somevalue')).toEqual(textNode);
629+
expect(textNode.attr('some-attribute')).toBeUndefined();
630+
});
631+
632+
it('should do nothing when setting or getting on comment nodes', function() {
633+
var comment = jqLite(document.createComment('some comment'));
634+
expect(comment).toBeDefined();
635+
expect(comment[0].nodeType).toEqual(8);
636+
expect(comment.attr('some-attribute','somevalue')).toEqual(comment);
637+
expect(comment.attr('some-attribute')).toBeUndefined();
638+
});
615639
});
616640

617641

0 commit comments

Comments
 (0)