Verschachteltes getElementsByName()
Siri
- javascript
Hallo,
var elements1Array = document.getElementsByName('examplename1');
for (var i=0; i < elements1Array.length; i++) {
var element1 = elements1Array[i];
var element2 = element1.getElementsByName('examplename2')[0];
// -> Fehlermeldung: element1.getElementsByName is not a function
}
Geht das prinzipiell nicht oder mach ich was falsch?
Grüße
Siri
Nope das geht so nicht.
getElementsByName ist eine Funktion des document Objektes. Du versuchst es jedoch auf einem HTML Element aus zu führen.
getT-RexByGruß
Hallo,
getElementsByName ist eine Funktion des document Objektes. Du versuchst es jedoch auf einem HTML Element aus zu führen.
Mhmmm...
var elements1Array = document.getElementsByName('examplename1');
for (var i=0; i < elements1Array.length; i++) {
var element1 = elements1Array[i];
var element2 = element1.getElementsByTagName('exampletagname')[0];
}
funktioniert. Das ist doch auch eine HTML-Elementzugriff. Ich versteh den Unterschied nicht.
Grüße
Siri
Mhmmm...
var elements1Array = document.getElementsByName('examplename1');
for (var i=0; i < elements1Array.length; i++) {
var element1 = elements1Array[i];
var element2 = element1.getElementsByTagName('exampletagname')[0];}
>
> funktioniert. Das ist doch auch eine HTML-Elementzugriff. Ich versteh den Unterschied nicht.
Das sind zwei Grundverschiedene Methoden. Das Resultat kann unter Umständen gleich sein -> eine Liste mit HTML Elementen.
Gruß
der grundverschiedene
T-Rex
[latex]Mae govannen![/latex]
Nope das geht so nicht.
getElementsByName ist eine Funktion des document Objektes.
Du versuchst es jedoch auf einem HTML Element aus zu führen.
Vielleicht wird einem Element ein name-Attribut zugewiesen, das keines haben darf. Oder irgendwas Anderes. Ohne weitere Einblicke nicht überprüfbar.
Stur lächeln und winken, Männer!
Kai
[latex]Mae govannen![/latex]
element.getElementsByTagName
!=element.getElementsByName
*Brille putz*
Das kommt davon, wenn man kurz vorher mit gEBTN arbeiten musste :(
Stur lächeln und winken, Männer!
Kai
Moin,
es ist, wie T-Rex schon geschrieben hat. Kindelemente kannst du aber beispielsweise per getElementsByClassName
oder getElementsByTagName
zugreifen.
Möglich sind auch weitere Javascript-Funktionen, wie firstChild
, lastChild
etc...
Grüße Marco
Hi,
du könntest .querySelector() verwenden:
var elements1Array = document.getElementsByName('examplename1');
for (var i=0; i < elements1Array.length; i++) {
var element1 = elements1Array[i];
var element2 = element1.querySelector('[name=examplename2]');
}
Oder ggf. .querySelectorAll():
document.querySelectorAll('[name=examplename1] [name=examplename2]');
~dave
document.querySelectorAll('[name=examplename1] [name=examplename2]');
Aber wieso sollte man Elemente mit name-Attributen verschachteln?
Gibts überhaupt HTML-Elemente mit name, die sich sinnvoll und valide verschachteln lassen? Da würde mir erstmal form und input/select/button usw. einfallen.
Dazu braucht man nicht getElementsByName oder gar QSA. Dazu reicht die Old-School-Werkzeuge aus Netscape JavaScript 1.0, nämlich document.forms und formElement.elements:
http://de.selfhtml.org/javascript/objekte/forms.htm#allgemeines
http://de.selfhtml.org/javascript/objekte/elements.htm
Mathias
Hallo,
Was für Elemente sind das, die du mit name-Attributen versehen hast? Zeige uns mal bitte eine beispielhafte HTML-Struktur.
Ich vermute, diese Abfrage ließe sich stark vereinfachen. Es gibt viele andere und ggf. passendere Abfragetechniken als getElementsByTagName. dann ließe sich auch das Problem lösen, dass Elementobjekte keine getElementsByTagName-Methode haben.
Mathias
Hallo,
Was für Elemente sind das, die du mit name-Attributen versehen hast? Zeige uns mal bitte eine beispielhafte HTML-Struktur.
<div name="nav" id="a">
<div name="leftpart"></div>
<ul>
<li>A</li>
...
<li>X</li>
</ul>
<div name="rightpart"></div>
</div>
<div name="nav" id="b">
<div name="leftpart"></div>
<ul>
<li>A</li>
...
<li>X</li>
</ul>
<div name="rightpart"></div>
</div>
usw. Es können beliebig viele divs mit name="nav" sein. Zuerst suche ich alle mit Namen und innerhalb des jeweiligen Divs die Elemente leftpart und rightpart. Denen möchte ich einen eventListener verpassen. Aber soweit komme ich ja nicht mal...
Grüße
Siri
Hi,
mir ist kein Doctype bekannt in dem das div-Element ein name-Attribut haben darf.
Welchen verwendest du?
~dave
Hallo,
mir ist kein Doctype bekannt in dem das div-Element ein name-Attribut haben darf.
Welchen verwendest du?
XHTML4.01 Strict und die "äüßeren" Div werden auch über getElementsByName gefunden.
Grüße
Siri
Hi,
XHTML4.01 Strict und die "äüßeren" Div werden auch über getElementsByName gefunden.
Es gibt kein XHTML 4.01 Strict.
validator.w3c.org
~dave
Hallo,
ist natürlich XHTML 1.0 Strict
Grüße
Siri
Hi,
ist natürlich XHTML 1.0 Strict
Das ändert nichts daran dass div-Elemente kein name-Attribut haben dürfen.
~dave
Hallo
Das ändert nichts daran dass div-Elemente kein name-Attribut haben dürfen.
Das ist aber ziemlich lästig...
Danke!
Grüße
Siri
Hallo siri,
Was für Elemente sind das, die du mit name-Attributen versehen hast? Zeige uns mal bitte eine beispielhafte HTML-Struktur.
<div name="nav" id="a">
<div name="leftpart"></div>
...
<div name="rightpart"></div>
</div>
<div name="nav" id="b">
<div name="leftpart"></div>
...
<li>X</li>
</div>
> usw. Es können beliebig viele divs mit name="nav" sein.
ich nähme in Deinem Fall hier zuallererst einfach "class" statt "name" und getElementsByClassName(). Damit wäre Dein direktes Problem erledigt. Andererseits glaube ich, dass sich die Struktur Deines HTML vermutlich vereinfachen ließe.
Freundliche Grüße
Vinzenz
Hallo,
ich nähme in Deinem Fall hier zuallererst einfach "class" statt "name" und getElementsByClassName(). Damit wäre Dein direktes Problem erledigt. Andererseits glaube ich, dass sich die Struktur Deines HTML vermutlich vereinfachen ließe.
Für Hinweise wäre ich echt dankbar. Es geht vom Grundsatz her um dieses Thema. Ich möchte jeweils für die scroll-auslösenden-Elemente (Div, Img, A oder was auch immer) einen Event-Handler registrieren. Nach allem, was ich in den letzten Wochen hier so mitgelesen habe ist das besser und auch eleganter, als die entsprechenden Element direkt mit onclick etc. im HTML zu versehen. Orientiert habe ich mich bei Moliliy.
Bei getElementsByClassName weiß ich jetzt nicht inwieweit das propertitär ist bzw. ob es auch noch für ältere Browser taugt.
Ich kann natürlich über alle möglichen Element eine Schleife ziehen und wenn dass Attribut "name" einen bestimmten Wert hat, den Handler registrieren. Wär doch aber komplizierter, als die Elemente selbst anzusprechen. Das Problem scheint ja zu sein, das bei der VErwendung von getElementsByName keine Kinder Elemente mehr abgefragt werden können. Bei getElemetsByTagName schon. Und das versteh ich nicht...
Grüße
Siri
Hallo Siri,
vergiss das name-Attribut. Das ist, so wie du es einsetzt, fgalsch!
Wenn deine Elemente eindeutig sind, gib ihnen eine ID. Wenn du sie gruppieren kannst, gib dem Umgebenen Element eine ID und selektiere sie dann über den Tag-Name. Wenn das auch nicht geht, gehe den Weg über den Class-Name, Google wird dir reichlich Versionen eines browserübergreifenden getElementsByClassName liefern.
Gruß, Jürgen
PS Du solltest auch hin und wieder mal den Validator befragen.
Hallo JürgenB,
vergiss das name-Attribut. Das ist, so wie du es einsetzt, fgalsch!
"fgalsch" ist jetzt richtig falsch.
Gruß, Jürgen
Hallo,
Wenn deine Elemente eindeutig sind, gib ihnen eine ID. Wenn du sie gruppieren kannst, gib dem Umgebenen Element eine ID und selektiere sie dann über den Tag-Name. Wenn das auch nicht geht, gehe den Weg über den Class-Name, Google wird dir reichlich Versionen eines browserübergreifenden getElementsByClassName liefern.
Es geht doch darum, dass ich eine Gruppe gleichartiger Controls habe (Anzahl 1-n). Da ist doch das Ansprechen per ID nicht der richtige Ansatz. Wozu gibt's denn das Attribut name? Wie macht jquery sowas? Alles über getElementsByClassName? Und wenn die Controls nun unterschiedlich ausschauen sollen(gesteuert über class), aber die Funktionalität die selbe ist?
Versteh mich nicht falsch! Ich bin froh, dass ich den Hinweis bekommen habe. Aber warum der andere Weg nicht geht, leuchtet mir nicht ein.
Grüße
Siri
Hi,
Es geht doch darum, dass ich eine Gruppe gleichartiger Controls habe (Anzahl 1-n). Da ist doch das Ansprechen per ID nicht der richtige Ansatz.
Stimmt.
Wozu gibt's denn das Attribut name?
div-Elemente haben _kein_ Attribut "name"!
Form-, input-, button-, textarea-, select-Elemente und ein paar die ich vergessen habe, haben ein Attribut "name". Dort erfüllen sie auch eine Funktion.
Alles über getElementsByClassName? Und wenn die Controls nun unterschiedlich ausschauen sollen(gesteuert über class), aber die Funktionalität die selbe ist?
Dann gibst du ihnen nicht nur eine Klasse sondern mehrere.
~dave
Hallo Siri,
Es geht doch darum, dass ich eine Gruppe gleichartiger Controls habe
und warum gruppierst du sie dann nicht?
<div id="gruppe">
<button ...>...</button >
<button ...>...</button >
<button ...>...</button >
</div>
und
zweiterKnopf = document.getElementById("gruppe"´).getElementsByTagName("button")[1];
Gruß, Jürgen
Es geht doch darum, dass ich eine Gruppe gleichartiger Controls habe (Anzahl 1-n).
Exakt dafür bietet HTML Klassen.
Wozu gibt's denn das Attribut name?
Um Formularelemente zu gruppieren. (Früher auch um Bilder, Iframes usw. zu benennen, als es noch noch keine id-Attribute überall gab.)
Wie macht jquery sowas? Alles über getElementsByClassName?
jQuery macht gar nichts besonders. jQuery hat eine Selektor-Engine die dir erlaubt, Elemente auf verschiedene Weise zu adressieren. Intern wird die Querying-Methode verwendet, die der Abfrage entspricht. (childNodes/children, getElementsByTagName, getElementsByClassName, getElementsByName, querySelectorAll usw.)
Und wenn die Controls nun unterschiedlich ausschauen sollen(gesteuert über class), aber die Funktionalität die selbe ist?
Dann gib ihnen eine Klasse, die nichts anderes als diese Gemeinsamkeit anzeigt, und gebe keine CSS-Regeln für diese Klasse an.
Klassen sind nicht nur für CSS-Formatierung dar und sind nicht zwangsläufig an CSS gebunden.
Versteh mich nicht falsch! Ich bin froh, dass ich den Hinweis bekommen habe. Aber warum der andere Weg nicht geht, leuchtet mir nicht ein.
Den anderen Weg hast du dir ausgedacht. Das ist schön, so KÖNNTE es theoretisch sein, aber er ist in HTML nicht vorgesehen.
Mathias