Re: getAttribute question
- From: RobG <rgqld@xxxxxxxxxxxx>
- Date: Thu, 8 May 2008 19:46:03 -0700 (PDT)
On May 8, 10:54 pm, Thomas 'PointedEars' Lahn <PointedE...@xxxxxx>
wrote:
RobG wrote:
I have always accessed attributes such as disabled using the DOM
element property, however I was wondering about implementing a more
generic function to get the values of attributes - which of course
leads to the DOM Element Interface's getAttribute method:
<URL:http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-666EE0F9>
Not necessarily. ECMAScript implementations provide the bracket property
accessor to use variable string values as property names, and the number of
element properties that do not match the lowercase versions of their
attribute name is limited.
See alsohttp://pointedears.de/scripts/dhtml.js:setAttr()
I'm interested in your mapping of char to ch, why is that? I noted an
oddity with IE that getAttribute('ch') returns an empty string if the
attribute isn't present when it should return null.
Also you have:
colSpan: "colSpan",
should the property name have a lower case 's'?
The DOM 2 Core specification says that getAttribute should return the
value of an attribute as a string, however attributes such as
disabled, checked, readonly, etc. don't have values specified in the
HTML specification,
Yes, they have.
it just specifies a behaviour if the attribute is present or not.
Not true:
http://www.w3.org/TR/html401/intro/sgmltut.html#h-3.3.4.2
Thanks, it would have been nice if a reference to that was included in
appropriate places in the HTML 4 and DOM HTML specifications.
The DOM HTML spec says that such attributes should
return true or false, e.g. Inteface HTMLInputElement:
<URL:http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-50886781>
My interpretation is that if the attribute is accessed as a property
of a DOM element (e.g. someElement.disabled), it should return:
1. boolean true if the element has the attribute set in the markup
or
it has been set to true by script
2. boolean false only if the attribute value has been set to false
by script
3. null if the attribute is not in the markup and hasn't been set by
script,
or if the element doesn't support the attribute
Correct.
That way the value of the DOM property can be easily converted to an
equivalent string simply by using the returned object's toString
method ('true', 'false' and '' respectively) which seems to fit the
specification for getAttribute.
Yes, you could. However, this is what setAttribute() is for.
I don't know of a browser that behaves as described above, they all
have foibles. If I were to write a generic getAttributeValue
function, should it behave as described above,
It should not return boolean values as content of string values.
It could return the object's toString value rather than the object.
or should it instead return 'disabled', '' and '' respectively? The
logic could then be applied to other "no value" attributes such as
checked, readonly and selected. Condition statements could be:
if (el.getAttributeValue('disabled') == 'true') { ... }
which is reasonably consistent with:
if (el.disabled) { ... }
What do others think?
You should implement
if (_getAttributeValue(el, 'disabled'))
if you don't like
if (el.getAttribute('disabled').toLowerCase() == 'disabled')
already. As you should know by now, host objects should not be tried
to be augmented, and they cannot be prototyped universally.
I wasn't suggesting augmenting host objects, I was just looking for a
consistent way to get attribute values. The following function seems
to do the trick, I haven't tested it widely yet. It has an issue with
IE and attributes named 'ch', I await your response from the question
above.
function getAttributeValue(element, attribute)
{
var v, lowerAtt,
htmlFlags = {
checked: 'checked',
compact: 'compact', // deprecated HTML 4
declare: 'declare',
defer: 'defer',
disabled: 'disabled',
ismap: 'ismap',
multiple: 'multiple',
nohref: 'nohref',
noresize: 'noresize',
noshade: 'noshade',
nowrap: 'nowrap', // deprecated HTML 4
readonly: 'readonly',
selected: 'selected'
},
mapFwd = {
alink: 'aLink',
accesskey: 'accessKey',
bgcolor: 'bgColor',
cellpadding: 'cellPadding',
cellspacing: 'cellSpacing',
'char': 'ch',
charoff: 'chOff',
'class': 'className',
codebase: 'codeBase',
codetype: 'codeType',
colspan: 'colSpan',
datetime: 'dateTime',
frameborder: 'frameBorder',
'for': 'htmlFor',
ismap: 'isMap',
longdesc: 'longDesc',
maxlength: 'maxLength',
marginheight:'marginHeight',
marginwidth: 'marginWidth',
nohref: 'noHref',
noresize: 'noResize',
noshade: 'noShade',
nowrap: 'noWrap',
readonly: 'readOnly',
rowspan: 'rowSpan',
tabindex: 'tabIndex',
usemap: 'useMap',
valuetype: 'valueType',
vlink: 'vLink'
},
mapRev = {
classname: 'class',
// ch: 'char',
htmlfor: 'for'
};
if (typeof attribute == 'string') {
lowerAtt = attribute.toLowerCase();
if (lowerAtt in htmlFlags) {
return !!element[attribute]? htmlFlags[lowerAtt] : '';
}
v = element.getAttribute(attribute);
if (v === null) {
v = element.getAttribute(mapFwd[lowerAtt]);
}
if (v === null) {
v = element.getAttribute(mapRev[lowerAtt]);
}
return v;
}
}
--
Rob
.
- Follow-Ups:
- Re: getAttribute question
- From: Thomas 'PointedEars' Lahn
- Re: getAttribute question
- References:
- getAttribute question
- From: RobG
- Re: getAttribute question
- From: Thomas 'PointedEars' Lahn
- getAttribute question
- Prev by Date: Re: Current index of an array of form elements?
- Next by Date: Novice Seeks Help
- Previous by thread: Re: getAttribute question
- Next by thread: Re: getAttribute question
- Index(es):
Relevant Pages
|