[whatwg] Use cases for Node.getElementById
Calogero Alex Baldacchino
alex.baldacchino at email.it
Sat Dec 6 19:09:01 PST 2008
Simon Pieters ha scritto:
> On Fri, 05 Dec 2008 19:19:04 +0100, Calogero Alex Baldacchino
> <alex.baldacchino at email.it> wrote:
>
>> [...]
>
> (I'm currently the editor of that proposal, currently located at
> http://simon.html5.org/specs/web-dom-core )
>
I'm reading it :-)
And I have a few questions. First, is it meant as the reference DOM Core
for HTML 5 only, or in general (for other kinds of markup too)?
The 'children' attribute on the Element interface, being an
HTMLCollection instance, suggests me the former might be the answer;
otherwise, either the reference to a specific document DOM interface, or
(in the case such interface were moved into Web DOM Core) the reference
to a specific dom in the name of the interface might perhaps be
problematic (formally, at least). I guess such attribute has been
declared on the Element interface instead of the HTMLElement one because
actually this is the most common implementation in current browsers.
Anyway, let me suggest (just as a hint, after all a working draft is the
right phase to explore any alternative) something like an
ElementCollection interface with the same properties of HTMLCollection,
making the latter just inheriting from the former as if it were an alias
(the same way DocumentFragment inherits from Node). On any browser
implementing 'children' as an HTMLCollection (without any hierarchy),
this shouldn't be a problem for scripts, since a script language usually
provides runtime inferred types; for languages with strong types (and
perhaps here we're moving from scripts to plugins), the access strategy
may be implementation specific but, as far as the hierarchy of
interfaces (ElementCollection -> HTMLCollection) does not change the
properties of an object implementing the HTMLCollection, that shouldn't
be a lot to work around. For instance, a Java applet (as well as any
other object implementing LiveConnect) should work fine using the
JSObject without any modify, while a direct access to the DOM would need
a DOMServiceProvider implementation (I'm not aware of any granting
access to the 'children' attribute, or better, to any non-W3C DOM
properties, but I guess as soon as your proposal became a recommendation
at least Sun would update such in Java APIs); for such purpose,
suggesting that any object provided by the user agent as implementing
either interface should be wrapped by an object also implementing the
other, for backward compatibility, might be enough (anyway, this is no
more than a hint, a very early feedback).
I see the Element interface no more contains methods to handle Attr
nodes: since those are described as not being child nodes of an Element,
in W3C specifications, there will be any other way to handle attributes
as nodes, the 'nature' of Attr nodes is going to change, or is there a
too little use (and/or support) of them, such that the Attr interface
might be quite close to its 'end of life'? Apart from that, I've also
noted the 'isId' attribute has been removed from Attr; I was thinking
just to that when I've read, in HTML 5 spec, that "This specification
doesn't preclude an element having multiple IDs, if other mechanisms
(e.g. DOM Core methods) can set an element's ID in a way that doesn't
conflict with the id attribute". For this purpose, either the 'isId'
property of an Attr node, or a mechanism to set an Element's attribute
as an alternative ID (or both) might be helpful (anyway, having more
then one unique identifier to handle for each element|| in a document
might cause an increase in duplicated IDs).
The above takes me to the '.getElementsByClassName()' method: if it were
to be moved from HTML 5 spec to Web DOM Core API, and if the latter is
meant as some kind of replacement for W3C DOM level 3, perhaps, for
generality sake, such method might be defined as referring to a property
named CLASS (along the same lines as ID), pointing out that such
property might not be binded to an attribute named 'class' (just to make
the spec ready in case the need to support such sort of document arose
in the near future, without having to change web dom core, or to derive
a new version, only for this reason).
But now let's come to your questions (sorry for the digression,
sometimes I can't help starting this way...)
>
>> But the term 'Subtree' arises a problem with HTML 5: actually, the id
>> attribute is defined as the element unique ID in the *subtree*
>> whithin which the element is found. That is, the term subtree refers
>> to a whole document tree, but also to a disconnected subtree handled
>> by a script (and I haven't yet understood if such definition refers
>> to a document fragment containing nodes detached by any document, or
>> a whole document without a browsing context).
>
> AIUI, it could also be a disconnected element.
>
And I've suggested, in another mail, to clarify it, i.e. telling a
subtree is either a whole document (to make clearer that '<body><div
id="the_id" >....</div> <div> ... <div id="the_id" /> </div> </body>' is
always illegal, regardless the possibility to separate two different
subtrees in the same document where the id 'the_id' is unique), or a
group of one or more 'related' disconnected nodes (i.e. a node removed
from a document with its descendants, a cloned node, a newly created
one, and so on, that is, in practice, about any tree of nodes without an
ownerDocument).
However, how is the ID uniqueness to be related to current APIs with
respect to a disconnected subtree? I mean, if such were relevant for any
method, such as a .getElementById variant handling disconnected
elements, the "uniqueness rule" would be quite self-explaining: either
such a method fails in front of duplicated IDs, or it returns the very
first match (or does whatever else is established to degrade
gracefully). But if the subtree traversal/id searching implementation is
up to a script programmer, the 'id' attribute may be seen as any other
attribute, and the programmer may opt for considering the uniqueness of
IDs as non relevant to his/her code in 'off-document' manipulations,
until the subtree is inserted into a document. Thus, maybe, IDs
uniqueness should be related to anything being under direct control of
current APIs (such as documents).
For the rest, my considerations on [whatever].getElementById() were
general, not referred to a concrete use case (partly being driven by the
above thoughts), and, for what concerns the email you've replied,
started from the following:
On 12/2/2008 4:07 PM, timeless wrote:
> On Tue, Dec 2, 2008 at 10:39 AM, Aaron
> Leventhal<aaronlev at moonset.net> wrote:
>
>> Maybe there is a deeper problem if copy& paste doesn't work right
>> because
>> of IDs?
>>
>> Or maybe there should be a node.getDescendantById() method?
>>
>
> maybe, but not with that name.
>
> Results 1 - 10 of about 4,480,000 for Descendent [definition]. (0.22
> seconds)
> Results 1 - 10 of about 8,370,000 for Descendant [definition]. (0.41
> seconds)
>
> the wikipedia links are confusing enough
>
> http://en.wikipedia.org/wiki/Descendant links to:
> http://en.wiktionary.org/wiki/descendent
> which has an also link to http://en.wiktionary.org/wiki/descendant
> which has a 'US' audio file
>
> So the web says that '-dant' is favored 2:1 over '-dent', which is a
> fairly bad margin considering the spelling errors we've seen in
> html/http.
>
> I'd sooner see Node.getElementById and risk *the confusion of it
> returning fewer nodes than Document.getElementById.*
>
>
I guessed the confusion he was concerning might be caused by the general
confidence people have with .getElementById working on the whole
document, so that someone might think, after discovering somehow there
is a getElementById method on every Node (or better, on every element in
an HTML document), such being working on the whole document as well,
thus expecting more non null results than a Node.getElementById method
might return, in general (people anyway should be confident with
Document.getElementsByTagName working on the whole document while
Element.getElementsByTagName working on an element descendants... but
without a crystal ball to guess it, who knows...). Thus, if the above
were the case, I've suggested something like
document.getElementById("the_id", startNode), to focus (perhaps!) the
attention of the average programmer (the same who might have thought
'anElement.getElementById' being the same as 'document.getElementById')
on the different behaviour, by 'forcing' the indication of a new
argument specifying where to start the search (that is, something
totally new to the programmer).
I agree that encouraging duplicate IDs is not any good idea, and
whatever method looking for IDs in a document subtree might take to
that. I really don't like the bare idea of a duplicated ID -- it's a
somewhat conflicting logic -- and I'm tempted to say a duplicate should
always break correct execution, especially when the duplicate comes from
an 'error' in scripting (as when inserting a cloned node without caring
of side-effects), because, at first glance, I'd regard a duplicate ID as
whatever else bug making a stand-alone application crashing because of
side-effects (of course, I'm not telling the browser should crash!),
and, after all, a gracefully degrading .getElementById (returning the
very first matching element) cannot prevent side-effects. But I really
understand, also, duplicate IDs are a common problem asking for a
solution, or at least a standard graceful degradation (such as the one
stated for document.getElementById(elementId)).
From this point of view, and also having in mind a disconnected subtree
to deal with through the API, maybe something like
document.getElementById(elementId, rootElement) might make sense if it
worked _only_ on disconnected subtrees, by first checking whether the
passed node (or the first descendent not being a document fragment node)
is effectively disconnected (not in the document), then returning the
matching element (if any), or null if the traversed subtree is instead
in the document tree (or even ending with an exception, to encourage a
greater attention and immediately tell the reason of the failure --
returning null might be ambiguous, since that's the same result when no
matching element is found).
But such method might be confusing, I agree (perhaps might confusion be
avoided by calling the method getExternalElementById?), and might also
provide a quite easy way to look for duplicate IDs (e.g. by creating a
fake document and calling that method on a subtree of another,
manipulated document -- but such would be a bit tricky, and if I do
something tricky, I should know that's not the better way to achieve
some result).
---
Now, let me fly back again off topic on Web DOM Core. Sometime elements
are conceived to be somewhat leaf elements, conceptually not being
enabled to have any sort of descendants (this is the case for <br> or
<base>, i.e., in HTML); yet they're Elements, and Nodes (and
HTMLElements), thus having attributes and methods allowing, in theory,
some weird manipulation. I don't know what every browser currently does
(honestly, I've never tried -- this is a recent doubt of mine), but I
guess the result might vary from one UA to another, and something
inappropriate might happen (in any case, there is no standard way to
block such). Perhaps, a new (readonly) property might be defined on Node
telling the node is a "definitive leaf", so that whatever
property/method might be declared as inaccessible/failing (e.g. throwing
an exception) if the 'isLeaf' property were true -- such an attribute
cannot be neither an Element, nor an HTMLElement, nor an HTMLElement
derived interface property, since there are methods on the Node
interface involved too, and as well the nodeType attribute wouldn't cope
well with this, because that should work for instances of the same type,
or regardless the type -- in other words, when trying and changing the
descendant hierarchy of a node with a true value for such an attribute,
the result should be an illegal hierarchy. Do you think such might be
worth to be considered?
(before I forget it, current definition of legal hierarchy seems to cut
out some legal cases, such as, for instance, an Element with no Text
child nodes, and the alike -- perhaps, should it be converted into a
list of illegal hierarchies? the resulting list would cover fewer cases
than a complete list of legal scenarios - if I haven't misunderstood it).
Best Regards,
Alex.
--
Caselle da 1GB, trasmetti allegati fino a 3GB e in piu' IMAP, POP3 e SMTP autenticato? GRATIS solo con Email.it http://www.email.it/f
Sponsor:
CAPODANNO A RIMINI HOTEL 2 STELLE
* 2 notti pernottamento con colazione a buffet euro 70,00, 3 notti euro 90,00
Clicca qui: http://adv.email.it/cgi-bin/foclick.cgi?mid=8500&d=7-12
More information about the whatwg
mailing list