Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
J
jquery
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
夏彬
jquery
Commits
d4a9d455
Commit
d4a9d455
authored
Dec 06, 2010
by
John Resig
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'restrictAttr' of
https://github.com/jitter/jquery
into jitter-restrictAttr
parents
e56d6f67
b50f41a2
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
119 additions
and
67 deletions
+119
-67
attributes.js
src/attributes.js
+71
-64
attributes.js
test/unit/attributes.js
+48
-3
No files found.
src/attributes.js
View file @
d4a9d455
...
@@ -205,7 +205,6 @@ jQuery.fn.extend({
...
@@ -205,7 +205,6 @@ jQuery.fn.extend({
if
(
rradiocheck
.
test
(
elem
.
type
)
&&
!
jQuery
.
support
.
checkOn
)
{
if
(
rradiocheck
.
test
(
elem
.
type
)
&&
!
jQuery
.
support
.
checkOn
)
{
return
elem
.
getAttribute
(
"value"
)
===
null
?
"on"
:
elem
.
value
;
return
elem
.
getAttribute
(
"value"
)
===
null
?
"on"
:
elem
.
value
;
}
}
// Everything else, we just grab the value
// Everything else, we just grab the value
return
(
elem
.
value
||
""
).
replace
(
rreturn
,
""
);
return
(
elem
.
value
||
""
).
replace
(
rreturn
,
""
);
...
@@ -271,7 +270,7 @@ jQuery.extend({
...
@@ -271,7 +270,7 @@ jQuery.extend({
height
:
true
,
height
:
true
,
offset
:
true
offset
:
true
},
},
attr
:
function
(
elem
,
name
,
value
,
pass
)
{
attr
:
function
(
elem
,
name
,
value
,
pass
)
{
// don't set attributes on text and comment nodes
// don't set attributes on text and comment nodes
if
(
!
elem
||
elem
.
nodeType
===
3
||
elem
.
nodeType
===
8
)
{
if
(
!
elem
||
elem
.
nodeType
===
3
||
elem
.
nodeType
===
8
)
{
...
@@ -289,88 +288,96 @@ jQuery.extend({
...
@@ -289,88 +288,96 @@ jQuery.extend({
// Try to normalize/fix the name
// Try to normalize/fix the name
name
=
notxml
&&
jQuery
.
props
[
name
]
||
name
;
name
=
notxml
&&
jQuery
.
props
[
name
]
||
name
;
// These attributes require special treatment
// Only do all the following if this is a node (faster for style)
var
special
=
rspecialurl
.
test
(
name
);
if
(
elem
.
nodeType
===
1
)
{
// These attributes require special treatment
var
special
=
rspecialurl
.
test
(
name
);
// Safari mis-reports the default selected property of an option
// Accessing the parent's selectedIndex property fixes it
if
(
name
===
"selected"
&&
!
jQuery
.
support
.
optSelected
)
{
var
parent
=
elem
.
parentNode
;
if
(
parent
)
{
parent
.
selectedIndex
;
// Make sure that it also works with optgroups, see #5701
if
(
parent
.
parentNode
)
{
parent
.
parentNode
.
selectedIndex
;
}
}
}
// Safari mis-reports the default selected property of an option
// If applicable, access the attribute via the DOM 0 way
// Accessing the parent's selectedIndex property fixes it
// 'in' checks fail in Blackberry 4.7 #6931
if
(
name
===
"selected"
&&
!
jQuery
.
support
.
optSelected
)
{
if
(
(
name
in
elem
||
elem
[
name
]
!==
undefined
)
&&
notxml
&&
!
special
)
{
var
parent
=
elem
.
parentNode
;
if
(
set
)
{
if
(
parent
)
{
// We can't allow the type property to be changed (since it causes problems in IE)
parent
.
selectedIndex
;
if
(
name
===
"type"
&&
rtype
.
test
(
elem
.
nodeName
)
&&
elem
.
parentNode
)
{
jQuery
.
error
(
"type property can't be changed"
);
}
if
(
value
===
null
)
{
if
(
elem
.
nodeType
===
1
)
{
elem
.
removeAttribute
(
name
);
}
// Make sure that it also works with optgroups, see #5701
}
else
{
if
(
parent
.
parentNode
)
{
elem
[
name
]
=
value
;
parent
.
parentNode
.
selectedIndex
;
}
}
}
}
}
// If applicable, access the attribute via the DOM 0 way
// browsers index elements by id/name on forms, give priority to attributes.
// 'in' checks fail in Blackberry 4.7 #6931
if
(
jQuery
.
nodeName
(
elem
,
"form"
)
&&
elem
.
getAttributeNode
(
name
)
)
{
if
(
(
name
in
elem
||
elem
[
name
]
!==
undefined
)
&&
notxml
&&
!
special
)
{
return
elem
.
getAttributeNode
(
name
).
nodeValue
;
if
(
set
)
{
// We can't allow the type property to be changed (since it causes problems in IE)
if
(
name
===
"type"
&&
rtype
.
test
(
elem
.
nodeName
)
&&
elem
.
parentNode
)
{
jQuery
.
error
(
"type property can't be changed"
);
}
}
if
(
value
===
null
)
{
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
if
(
elem
.
nodeType
===
1
)
{
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
elem
.
removeAttribute
(
name
);
if
(
name
===
"tabIndex"
)
{
}
var
attributeNode
=
elem
.
getAttributeNode
(
"tabIndex"
);
}
else
{
return
attributeNode
&&
attributeNode
.
specified
?
elem
[
name
]
=
value
;
attributeNode
.
value
:
rfocusable
.
test
(
elem
.
nodeName
)
||
rclickable
.
test
(
elem
.
nodeName
)
&&
elem
.
href
?
0
:
undefined
;
}
}
}
// browsers index elements by id/name on forms, give priority to attributes.
return
elem
[
name
];
if
(
jQuery
.
nodeName
(
elem
,
"form"
)
&&
elem
.
getAttributeNode
(
name
)
)
{
return
elem
.
getAttributeNode
(
name
).
nodeValue
;
}
}
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
if
(
!
jQuery
.
support
.
style
&&
notxml
&&
name
===
"style"
)
{
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
if
(
set
)
{
if
(
name
===
"tabIndex"
)
{
elem
.
style
.
cssText
=
""
+
value
;
var
attributeNode
=
elem
.
getAttributeNode
(
"tabIndex"
);
}
return
attributeNode
&&
attributeNode
.
specified
?
return
elem
.
style
.
cssText
;
attributeNode
.
value
:
rfocusable
.
test
(
elem
.
nodeName
)
||
rclickable
.
test
(
elem
.
nodeName
)
&&
elem
.
href
?
0
:
undefined
;
}
}
return
elem
[
name
];
}
if
(
!
jQuery
.
support
.
style
&&
notxml
&&
name
===
"style"
)
{
if
(
set
)
{
if
(
set
)
{
elem
.
style
.
cssText
=
""
+
value
;
// convert the value to a string (all browsers do this but IE) see #1070
elem
.
setAttribute
(
name
,
""
+
value
);
}
}
return
elem
.
style
.
cssText
;
// Ensure that missing attributes return undefined
}
// Blackberry 4.7 returns "" from getAttribute #6938
if
(
!
elem
.
attributes
[
name
]
&&
(
elem
.
hasAttribute
&&
!
elem
.
hasAttribute
(
name
))
)
{
return
undefined
;
}
if
(
set
)
{
var
attr
=
!
jQuery
.
support
.
hrefNormalized
&&
notxml
&&
special
?
// convert the value to a string (all browsers do this but IE) see #1070
// Some attributes require a special call on IE
elem
.
setAttribute
(
name
,
""
+
value
);
elem
.
getAttribute
(
name
,
2
)
:
}
elem
.
getAttribute
(
name
);
// Ensure that missing attributes return undefined
// Non-existent attributes return null, we normalize to undefined
// Blackberry 4.7 returns "" from getAttribute #6938
return
attr
===
null
?
undefined
:
attr
;
if
(
!
elem
.
attributes
[
name
]
&&
(
elem
.
hasAttribute
&&
!
elem
.
hasAttribute
(
name
))
)
{
return
undefined
;
}
}
// Handle everything which isn't a DOM element node
var
attr
=
!
jQuery
.
support
.
hrefNormalized
&&
notxml
&&
special
?
if
(
set
)
{
// Some attributes require a special call on IE
elem
[
name
]
=
value
;
elem
.
getAttribute
(
name
,
2
)
:
}
elem
.
getAttribute
(
name
);
return
elem
[
name
];
// Non-existent attributes return null, we normalize to undefined
return
attr
===
null
?
undefined
:
attr
;
}
}
});
});
...
...
test/unit/attributes.js
View file @
d4a9d455
...
@@ -4,7 +4,7 @@ var bareObj = function(value) { return value; };
...
@@ -4,7 +4,7 @@ var bareObj = function(value) { return value; };
var
functionReturningObj
=
function
(
value
)
{
return
(
function
()
{
return
value
;
});
};
var
functionReturningObj
=
function
(
value
)
{
return
(
function
()
{
return
value
;
});
};
test
(
"attr(String)"
,
function
()
{
test
(
"attr(String)"
,
function
()
{
expect
(
3
1
);
expect
(
3
7
);
// This one sometimes fails randomly ?!
// This one sometimes fails randomly ?!
equals
(
jQuery
(
'#text1'
).
attr
(
'value'
),
"Test"
,
'Check for value attribute'
);
equals
(
jQuery
(
'#text1'
).
attr
(
'value'
),
"Test"
,
'Check for value attribute'
);
...
@@ -67,6 +67,14 @@ test("attr(String)", function() {
...
@@ -67,6 +67,14 @@ test("attr(String)", function() {
ok
(
jQuery
().
attr
(
"doesntexist"
)
===
undefined
,
"Make sure undefined is returned when no element is there."
);
ok
(
jQuery
().
attr
(
"doesntexist"
)
===
undefined
,
"Make sure undefined is returned when no element is there."
);
equals
(
jQuery
(
document
).
attr
(
"nodeName"
),
"#document"
,
"attr works correctly on document nodes (bug #7451)."
);
equals
(
jQuery
(
document
).
attr
(
"nodeName"
),
"#document"
,
"attr works correctly on document nodes (bug #7451)."
);
var
attributeNode
=
document
.
createAttribute
(
"irrelevant"
),
commentNode
=
document
.
createComment
(
"some comment"
),
textNode
=
document
.
createTextNode
(
"some text"
),
obj
=
{};
jQuery
.
each
(
[
document
,
attributeNode
,
commentNode
,
textNode
,
obj
,
"#firstp"
],
function
(
i
,
ele
)
{
strictEqual
(
jQuery
(
ele
).
attr
(
"nonexisting"
),
undefined
,
"attr works correctly for non existing attributes (bug #7500)."
);
});
});
});
if
(
!
isLocal
)
{
if
(
!
isLocal
)
{
...
@@ -100,7 +108,7 @@ test("attr(Hash)", function() {
...
@@ -100,7 +108,7 @@ test("attr(Hash)", function() {
});
});
test
(
"attr(String, Object)"
,
function
()
{
test
(
"attr(String, Object)"
,
function
()
{
expect
(
24
);
expect
(
30
);
var
div
=
jQuery
(
"div"
).
attr
(
"foo"
,
"bar"
),
var
div
=
jQuery
(
"div"
).
attr
(
"foo"
,
"bar"
),
fail
=
false
;
fail
=
false
;
...
@@ -134,6 +142,25 @@ test("attr(String, Object)", function() {
...
@@ -134,6 +142,25 @@ test("attr(String, Object)", function() {
jQuery
(
"#name"
).
attr
(
'maxLength'
,
'10'
);
jQuery
(
"#name"
).
attr
(
'maxLength'
,
'10'
);
equals
(
document
.
getElementById
(
'name'
).
maxLength
,
'10'
,
'Set maxlength attribute'
);
equals
(
document
.
getElementById
(
'name'
).
maxLength
,
'10'
,
'Set maxlength attribute'
);
var
attributeNode
=
document
.
createAttribute
(
"irrelevant"
),
commentNode
=
document
.
createComment
(
"some comment"
),
textNode
=
document
.
createTextNode
(
"some text"
),
obj
=
{};
jQuery
.
each
(
[
document
,
attributeNode
,
obj
,
"#firstp"
],
function
(
i
,
ele
)
{
var
$ele
=
jQuery
(
ele
);
$ele
.
attr
(
"nonexisting"
,
"foo"
);
equal
(
$ele
.
attr
(
"nonexisting"
),
"foo"
,
"attr(name, value) works correctly for non existing attributes (bug #7500)."
);
});
jQuery
.
each
(
[
commentNode
,
textNode
],
function
(
i
,
ele
)
{
var
$ele
=
jQuery
(
ele
);
$ele
.
attr
(
"nonexisting"
,
"foo"
);
strictEqual
(
$ele
.
attr
(
"nonexisting"
),
undefined
,
"attr(name, value) works correctly on comment and text nodes (bug #7500)."
);
});
//cleanup
jQuery
.
each
(
[
document
,
"#firstp"
],
function
(
i
,
ele
)
{
jQuery
(
ele
).
removeAttr
(
"nonexisting"
);
});
var
table
=
jQuery
(
'#table'
).
append
(
"<tr><td>cell</td></tr><tr><td>cell</td><td>cell</td></tr><tr><td>cell</td><td>cell</td></tr>"
),
var
table
=
jQuery
(
'#table'
).
append
(
"<tr><td>cell</td></tr><tr><td>cell</td><td>cell</td></tr><tr><td>cell</td><td>cell</td></tr>"
),
td
=
table
.
find
(
'td:first'
);
td
=
table
.
find
(
'td:first'
);
td
.
attr
(
"rowspan"
,
"2"
);
td
.
attr
(
"rowspan"
,
"2"
);
...
@@ -304,8 +331,26 @@ test("attr('tabindex', value)", function() {
...
@@ -304,8 +331,26 @@ test("attr('tabindex', value)", function() {
});
});
test
(
"removeAttr(String)"
,
function
()
{
test
(
"removeAttr(String)"
,
function
()
{
expect
(
1
);
expect
(
7
);
equals
(
jQuery
(
'#mark'
).
removeAttr
(
"class"
)[
0
].
className
,
""
,
"remove class"
);
equals
(
jQuery
(
'#mark'
).
removeAttr
(
"class"
)[
0
].
className
,
""
,
"remove class"
);
var
attributeNode
=
document
.
createAttribute
(
"irrelevant"
),
commentNode
=
document
.
createComment
(
"some comment"
),
textNode
=
document
.
createTextNode
(
"some text"
),
obj
=
{};
//removeAttr only really removes on DOM element nodes handle all other seperatyl
strictEqual
(
jQuery
(
"#firstp"
).
attr
(
"nonexisting"
,
"foo"
).
removeAttr
(
"nonexisting"
)[
0
].
nonexisting
,
undefined
,
"removeAttr works correctly on DOM element nodes"
);
jQuery
.
each
(
[
document
,
attributeNode
,
obj
],
function
(
i
,
ele
)
{
var
$ele
=
jQuery
(
ele
);
$ele
.
attr
(
"nonexisting"
,
"foo"
).
removeAttr
(
"nonexisting"
);
strictEqual
(
ele
.
nonexisting
,
""
,
"removeAttr works correctly on non DOM element nodes (bug #7500)."
);
});
jQuery
.
each
(
[
commentNode
,
textNode
],
function
(
i
,
ele
)
{
$ele
=
jQuery
(
ele
);
$ele
.
attr
(
"nonexisting"
,
"foo"
).
removeAttr
(
"nonexisting"
);
strictEqual
(
ele
.
nonexisting
,
undefined
,
"removeAttr works correctly on non DOM element nodes (bug #7500)."
);
});
});
});
test
(
"val()"
,
function
()
{
test
(
"val()"
,
function
()
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment