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-Cor...ml#ID-666EE0F9 >
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, it just specifies a behaviour if the attribute is
present or not. 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-HTM...ml#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
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.
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, 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?
--
Rob 4 2868
RobG schreef:
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, it just specifies a behaviour if the attribute is
present or not. The DOM HTML spec says that such attributes should
return true or false, e.g. Inteface HTMLInputElement:
The common way to specify this according to the current standards is:
<... disabled="disabled"/>
Browsers will parse this the same way as the old notation.
JW
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-Cor...ml#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 also http://pointedears.de/scripts/dhtml.js:setAttr()
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/s...html#h-3.3.4.2
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-HTM...ml#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.
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.
PointedEars
--
var bugRiddenCrashPronePieceOfJunk = (
navigator.userAgent.indexOf('MSIE 5') != -1
&& navigator.userAgent.indexOf('Mac') != -1
) // Plone, register_function.js:16
On May 8, 10:54 pm, Thomas 'PointedEars' Lahn <PointedE...@web.de>
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/s...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
RobG wrote:
[...] Thomas 'PointedEars' Lahn [...] 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()
(Eeek, Google Groups posting.)
I'm interested in your mapping of char to ch, why is that?
The `char' attribute of HTML 4.01 `COL', `COLGROUP', `TBODY', `TD', `TFOOT',
`TH', `THEAD', and `TR' elements, and their lowercase XHTML 1.0 correlates,
is represented by the `ch' attribute of the HTMLTableColElement,
HTMLTableSectionElement, HTMLTableCellElement, and HTMLTableRowElement
interfaces of W3C DOM Level 2 HTML, and the `ch' property of the objects
implementing these, respectively. http://www.w3.org/TR/DOM-Level-2-HTM...ml#ID-84150186 http://www.w3.org/TR/DOM-Level-2-HTM...t-binding.html
I noted an oddity with IE that getAttribute('ch') returns an empty string if the
attribute isn't present when it should return null.
However, this is unsurprising, as it should have been getAttribute('char').
Also you have:
colSpan: "colSpan",
should the property name have a lower case 's'?
Yes, it should. It had been fixed already in the local version (currently
0.9.4.2008042321), but thanks anyway.
>>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.
Which object are you talking about? We are dealing with *primitive values*
here. So if a method is to return the value of a boolean HTML attribute,
there are two implementations I would consider reasonable: Either a) return
the *boolean* values `true' or `false', or b) return the proper attribute
values as strings, i.e. e.g. "disabled" if set and "" if not set. Either
way, it should be easy to use the return value in a conditional expression,
which both proposed implementations would accomplish.
>>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.
But el.getAttributeValue() is suggesting host object augmentation, is it not?
[...]
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'
},
There really is no need for `htmlFlags'.
mapFwd = {
[...]
},
ACK. This is also what I have.
mapRev = {
classname: 'class',
// ch: 'char',
htmlfor: 'for'
};
Why do you consider this necessary? Are we talking HTML attributes or not?
if (typeof attribute == 'string') {
This is not required, and unnecessarily limits the ways this method may be
applied.
lowerAtt = attribute.toLowerCase();
I understand you test for the string type above because of this assignment,
however any value can be converted to string easily:
lowerAtt = String(attribute).toLowerCase();
(attribute.toString() is not always feasible.)
if (lowerAtt in htmlFlags) {
For reasons I mentioned before, the `in' operator should be avoided outside
`for..in' statements for the time being.
return !!element[attribute]? htmlFlags[lowerAtt] : '';
While written more conveniently, the test accesses a property of a host
object without testing for it first which is considered error-prone.
}
v = element.getAttribute(attribute);
Much the same here.
if (v === null) {
v = element.getAttribute(mapFwd[lowerAtt]);
}
if (v === null) {
v = element.getAttribute(mapRev[lowerAtt]);
}
Your assertions are not supported by the W3C DOM Level 2 and 3 Core
Specifications. According to these, Element::getAttribute() never returns
`null'. Faulty implementations do not justify your deliberately violating
the standard yourself. So the least you have to consider instead is
if (!v)
{
return v;
}
}
Regards,
PointedEars
--
realism: HTML 4.01 Strict
evangelism: XHTML 1.0 Strict
madness: XHTML 1.1 as application/xhtml+xml
-- Bjoern Hoehrmann This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: David |
last post by:
Hi,
I'm trying to parse an xml file and am a bit confused. I have created my
class XmlParser.
Also I have 3 other questions.
1-How to the GetAttribute to search for the value of a specific...
|
by: mr_burns |
last post by:
Hi,
I have the following code that works fine except the getAttribute line:
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.load("note.xml");
nodes =...
|
by: hutch |
last post by:
Hi,
I'm making use of this VERY useful function for a so called 'standards
compliant' replacement for target="_blank":
function externalLinks() {
if (!document.getElementsByTagName) return;...
|
by: Banski |
last post by:
Hi,
Im quite new to XML in .Net.
Im getting values from an xml file using XPath and sorting as you see
in the code below.
I cant figure out how to get the value of date with GetAttribute.
Hope...
|
by: DN |
last post by:
This works:
nav.GetAttribute("@ATTRIBUTE","");
This doesn't:
string strTemp = "@ATTRIBUTE";
nav.GetAttribute(strTemp,"");
Anybody know a way around this?
| |
by: duff |
last post by:
Hiya,
I'm trying to replace the commented out code below with a neater
version using the IAttributeAccessor interface (so that I don't have to
write 'if' statements for all control types).
At...
|
by: Noa |
last post by:
Hi
I have a page that looks like that:
<form name="kuku1" action ="anotherpage.html" >
<input name="name">
<input name="kuku2">
</form>
As far as i know, "getAttribute" should return a...
|
by: christopher.secord |
last post by:
I'm having a hard time understanding an error that I'm getting. In the
code below, I'm trying to call substring() on an attribute of an
anchor. The error I get says "getAttribute("rel") has no...
|
by: maminx |
last post by:
I have this script...
var td = document.createElement('td');
var p = document.createElement('p');
var label = document.createElement('label');
var span =...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers,...
| |
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The...
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...
| |