Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

How to reference an updated document object and to have all of its elements and associated values if any as well?

15 views
Skip to first unread message

justaguy

unread,
Nov 13, 2016, 1:01:27 PM11/13/16
to

Start:
<html>
<head>
<script>
var addEle = function() {
var newEl = document.createElement('span')';
document.body.appendChild(newEl);
// other types of elements addition as well, ie. input
}
</script>
</head>
<body>
<button onclick="addEle">Add Element</button>

</body>
</html>

Process:
A user adds some elements to the page (document).

Question:
Now, how do I reference / retrieve all the elements and associated values if any for this document?

document.all was for old IE browser only, hence, irrelevant for other modern browsers.

Thanks.

Martin Honnen

unread,
Nov 14, 2016, 6:41:05 AM11/14/16
to
On 13.11.2016 19:01, justaguy wrote:

> Now, how do I reference / retrieve all the elements and associated values if any for this document?

Well, the
document
object contains all elements and associated values. It is not clear in
which form you want to "retrieve" the elements or values.

> document.all was for old IE browser only, hence, irrelevant for other modern browsers.

document.getElementsByTagName('*') gives you all elements as an
HTMLCollection , see
https://dom.spec.whatwg.org/#concept-getelementsbytagname/

JJ

unread,
Nov 14, 2016, 6:51:48 AM11/14/16
to
Use MutationObserver.

Evertjan.

unread,
Nov 14, 2016, 8:16:34 AM11/14/16
to
Martin Honnen <martin...@gmx.de> wrote on 14 Nov 2016 in
comp.lang.javascript:

>> document.all was for old IE browser only, hence, irrelevant for other
>> modern browsers.
>
> document.getElementsByTagName('*') gives you all elements as an
> HTMLCollection , see
> https://dom.spec.whatwg.org/#concept-getelementsbytagname/

Indeed, but in fact it is a Nodelist in WebKit browsers.

===========

document.querySelectorAll('*')

seems to return an HTMLCollection there.

=============

An HTMLCollection is 'live', is a Nodelist 'live' less alive?

--
Evertjan.
The Netherlands.
(Please change the x'es to dots in my emailaddress)

Thomas 'PointedEars' Lahn

unread,
Nov 14, 2016, 11:26:17 AM11/14/16
to
This URI does not work here inasfar as that it does not navigate to the
section in question. The URI that does it is currently

<https://dom.spec.whatwg.org/#dom-document-getelementsbytagname>

Your URI might have worked before just as mine does now, but that is
precisely the unreliable behavior that you can expect with a "Living
Standard", a resource that does not remotely meet the criteria for a
standard.

WHATWG HTML is not the normative resource; instead, it is

<https://www.w3.org/TR/2015/REC-dom-20151119/#dom-document-getelementsbytagname>

as referred to by

<https://www.w3.org/TR/2016/REC-html51-20161101/infrastructure.html#common-dom-interfaces> pp.

Although in both cases the return value is specified as an object that
implements the HTMLCollection interface, this is actually compatibly
implemented only as an object implementing the NodeList interface. By
contrast to an HTMLCollection, using the bracket property accessor syntax
with non-numeric string parameter, or calling the referred object’s
namedItem() method with an argument of that form, on the return value, does
not always yield useful results.

In any case, the problem with this approach is that one would have to
iterate over a lot of irrelevant elements as not all elements can have
values. If the question is understood literally, then “value” means the
“value” attribute, and not all elements have it.

In order to avoid this, there are several alternatives, including:

- calling document.getElementsByTagName() with a specific element type name
as argument, maybe several times, and if necessary, aggregate the results
in an array;

- calling document.querySelectorAll() as provided by implementing the
Selectors API with a CSS selector that includes all the relevant element
type names;

- calling document.evaluate() as provided by implementing DOM Level 3 XPath
to retrieve references to the relevant element objects and/or their
“values” directly (according to MDN, supported by all major browsers
except Internet Explorer).

However, the OP appears to have an X–Y problem; they appear to have the
misconception that they need to retrieve the values of all elements to
achieve their goal. That is not so.

For example, one can determine which elements the user has added by
observing mutations to the document tree:

<https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver>

Also, the original code is invalid HTML, and if that is corrected, it will
still not work as the function is being referred to, but not called.

--
PointedEars
FAQ: <http://PointedEars.de/faq> | SVN: <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | ES Matrix: <http://PointedEars.de/es-matrix>
Please do not cc me. / Bitte keine Kopien per E-Mail.

justaguy

unread,
Nov 14, 2016, 3:48:55 PM11/14/16
to
Martin Honnen's solution (document.getElementsByTagName('*')) works fine with me, thank you all.
0 new messages