GetElementById/GetElementsByTagName
Stefan
- javascript
Hallo,
Soweit mir bekannt ist, kann ich nicht mehrere Elemente mit einer Id bestimmen, so dass in meinem Fall GetElementById unbrauchbar ist.
Also muss ich wohl hiermit arbeiten: GetElementsByTagName. Allerdings sind in meinem Script einige <a> und <td> Tags enthalten, die keine Zuweisung durch GetElementsByTagName bekommen sollen, manche jedoch schon. Wie kann ich diese unterscheiden? Wie gehe ich am besten weiter vor?
Ich hoffe, mein Anliegen ist nicht all zu nervig...
Gruß, Stefan
Moin!
Gib ihnen (z.B.) denselben Namen und nimm getElementsByName.
Oder gib ihnen eine definierte class und prüfe jeweils ob der className ein passender ist.
-- Skeeve
getElementsByclassName
--> hat mir geholfen
Danke!! :-)
Hi,
getElementsByclassName
äh, gips nich.
Cheatah
Hallo,
getElementsByclassName
äh, gips nich.
Kann man sich aber basteln, oder fertige Scripts mit Google finden.
IMHO sollte das W3C auch noch eine Funktion a la „document.getElementsByAttribute(Attribut,Wert)[i]“
einführen. Dann währe der Zugriff auf bestimmte Elemente viel einfacher.
mfg. Daniel
Ok - danke bis hierhin.
Und wenn ich nur 2 Elemente habe, könnte ich es auch so machen getElementById('element1') .... und später im Code getElementById('element2') ... ?
Werden demnach also die beiden Elemente gefunden?
Hallo Stefan,
Und wenn ich nur 2 Elemente habe, könnte ich es auch so machen getElementById('element1') .... und später im Code getElementById('element2') ... ?
Werden demnach also die beiden Elemente gefunden?
Ja. Und bei vielen Elementen kannst Du auch die IDs in ein Array schreiben und dieses in einer Schleife abarbeiten (getElementById(id_array[i])). Eine andere Möglichkeit wären "systematische" IDs, als xxx_1, xxx_2. Wenn du diese in einer Schleife abarbeitest, sieht das z.B. so aus: getElementById("xxx_"+i).
Gruß, Jürgen
Ok, und wenn das so ist, wieso wird nur ein Element ('element') gezeigt und nicht "element" und "element2"?
.
.
.
<style TYPE="text/css">
#element { display:none}
#element2 { display:none}
</style>
<script type="text/javascript">
<!--
function zeigen() {
if (document.getElementById)
document.getElementById('element').style.display ="inline";
}//-->
</script>
<script type="text/javascript">
<!--
function zeigen2() {
if (document.getElementById)
document.getElementById('element2').style.display ="inline";
}//-->
</script>
.
.
.
<td id="element">Zelleninhalt</td>
<td id="element2">Zelleninhalt</td>
hi,
Ok, und wenn das so ist, wieso wird nur ein Element ('element') gezeigt und nicht "element" und "element2"?
Hast du denn auch beide Funktionen aufgerufen ...?
gruß,
wahsaga
Hi,
Ok, und wenn das so ist, wieso wird nur ein Element ('element') gezeigt und nicht "element" und "element2"?
document.getElementById('element').style.display ="inline";
document.getElementById('element2').style.display ="inline";
<td id="element">Zelleninhalt</td>
<td id="element2">Zelleninhalt</td>
Falls tatsächlich beide Funktionen aufgerufen werden, könnte es daran liegen, daß "display:inline" für Tabellenzellen meist nicht sinnvoll ist.
cu,
Andreas
Falls tatsächlich beide Funktionen aufgerufen werden, könnte es daran liegen, daß "display:inline" für Tabellenzellen meist nicht sinnvoll ist.
Ein Leerstring sorgt allerdings dafür, dass man nichts vom Tabelleninhalt sieht :-(
Den betreffenden Code habe ich ja bereits gezeigt
Hallo Stefan,
Ein Leerstring sorgt allerdings dafür, dass man nichts vom Tabelleninhalt sieht :-(
???
Den betreffenden Code habe ich ja bereits gezeigt
Wo?
- habe ich beide Funktionen aufgerufen?
An wen ist die Frage gerichtet?
Dies ist Teil des zugehörigen Codes; "element" wird gezeigt, "element2" leider nicht. Was mache ich nur falsch?
Du verrätst uns nicht alles.
Das ein- und ausblenden einzelner Tabellenfelder halte ich nicht für sinnvoll, da die Struktur der Tabelle zerstört wird. Bei vollständigen Zeilen ist das ok. Vieleicht solltest du dich lieber um die "visibility" kümmern.
Gruß, Jürgen
http://forum.de.selfhtml.org/?t=138394&m=898988
das ist alles, was ich zeigen kann.
Damit kann mir nicht geholfen werden?
Na, in meinem Fall kann ich mit "display" arbeiten. Das ist hier zum Glück gar keine Frage :-)
hi,
https://forum.selfhtml.org/?t=138394&m=898988
das ist alles, was ich zeigen kann.
Damit kann mir nicht geholfen werden?
Da ist noch nicht mal zu sehen, wo du auch nur eine der beiden Funktionen aufrufst.
Also gut, wenn das alles ist, was du "zeigen kannst", dürfen wir wohl annehmen, dass das alles ist, was du hast, also genau dem Code entspricht den du verwendest.
Dann können wir dir in so fern weiterhelfen, dass wir dir sagen, dass der Code von Funktionen nicht ausgeführt wird, wenn du die Funktionen nirgendwo aufrufst.
War das jetzt etwa eine neue Erkenntnis für dich?
Nein? Ja wieso zum Geier zeigst du uns dann nicht endlich mal, wo und wie du die Funktionen aufrufst, also mal ein _komplettes_ Testbeispiel, statt irgendwelchen "mehr kann ich nicht zeigen"-Blödsinns ...?
gruß,
wahsaga
Hallo Stefan,
http://forum.de.selfhtml.org/?t=138394&m=898988
das ist alles, was ich zeigen kann.
Damit kann mir nicht geholfen werden?
Du rufst die Funktionen nirgendwo auf.
Na, in meinem Fall kann ich mit "display" arbeiten. Das ist hier zum Glück gar keine Frage :-)
bist Du sicher. Eine Tabelle ist so etwas, wie ein Schachbrett. Wenn Du da ein Feld aussägst und die Felder rechts davon ein Feld nach links schiebst, sieht das Brett irgendwie seltsam aus. Bei "visibility" würde das Feld nur unsichtbar gemacht, sein Platz bliebe aber reserviert.
----------- -----------
|a|b|c|d|e| |a|b|c|d|e|
-----------
|f|g|h|i|j| wird zu |f|g|i|j|
----------- -----------
|k|l|m|n|o| |k|l|m|n|o|
----------- -----------
Gruß, Jürgen
Hi,
IMHO sollte das W3C auch noch eine Funktion a la „
document.getElementsByAttribute(Attribut,Wert)[i]“
einführen.
dem "à la" stimme ich zu, allerdings sollten eher die Möglichkeiten der Attributselektion abgebildet werden, die CSS/3.0 vorhält. Mindestens die - IMHO immens wichtige - Suche nach Klassen lässt sich mit obigem Beispiel jedenfalls schwerlich abbilden :-)
Cheatah
Hi,
getElementsByclassName
äh, gips nich.
Cheatah
stimmt, hatte JS deaktiviert :-/
Gibt es weitere Moglichkeiten außer GetElementById oder GetElementsByTagName ? Falls nicht, wie kann ich mit GetElementsByTagName so anpassen, dass es nur auf bestimmte <td> Tags und nicht auf alle <td> Tags eine Wirkung hat?
Gruß, Stefan
Hallo,
getElementsByclassName
äh, gips nich.
Gibt es weitere Moglichkeiten außer GetElementById oder GetElementsByTagName ? Falls nicht, wie kann ich mit GetElementsByTagName so anpassen, dass es nur auf bestimmte <td> Tags und nicht auf alle <td> Tags eine Wirkung hat?
Du kannst getElementsByClassName schon verwenden, musst dafür aber noch folgende Funktion einfügen:
function getElementsByClassName(myClass)
{
var all_obj,ret_obj=new Array(),j=0;
if(document.all)all_obj=document.all;
else if(document.getElementsByTagName && !document.all)all_obj=document.getElementsByTagName("*");
for(i=0;i<all_obj.length;i++)
{
if(all_obj[i].className==myClass)
{
ret_obj[j]=all_obj[i];
j++
}
}
return ret_obj;
}
Dann kannst du einfach mit einem „getElementsByClassName("deine_Klasse")[Nr]“ auf deine Klasse zugreifen.
Achtung: das „document“ musst du in diesem Fall weg lassen.
mfg. Daniel
Hallo D.R.,
...
if(all_obj[i].className==myClass)
...
nur als Anmerkung: die Abfrage funktioniert nur, wenn die Objekte in nur einer Klasse sind. Bei z.B. <td class="c1 c2 c3"> liefert className "c1 c2 c3". Für eine "narrensichere" Lösung müsste man hier wohl mit regulären Ausdrücken arbeiten.
Gruß, Jürgen
Hi,
function getElementsByClassName(myClass)
{
var all_obj,ret_obj=new Array(),j=0;
if(document.all)all_obj=document.all;
else if(document.getElementsByTagName && !document.all)all_obj=document.getElementsByTagName("*");
for(i=0;i<all_obj.length;i++)
{
if(all_obj[i].className==myClass)
{
ret_obj[j]=all_obj[i];
j++
}
}
return ret_obj;
}
Die Funktion ist aber sehr eingeschränkt. Die liefert maximal die Elemente, die ausschließlich zur gegebenen Klasse gehören.
Elemente können aber zu beliebig vielen Klassen gehören (class="aaa bbb ccc") ...
Im Archiv oder in Google sollten sich aber allgemeine getElementsByClass-Funktionen finden lassen.
cu,
Andreas
--
[Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)
[Schreinerei Waechter](http://www.schreinerei-waechter.de/)
[O o ostern ...](http://ostereier.andreas-waechter.de/)
Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
Hallo,
[Funktion]
Die Funktion ist aber sehr eingeschränkt. Die liefert maximal die Elemente, die ausschließlich zur gegebenen Klasse gehören.
Elemente können aber zu beliebig vielen Klassen gehören (class="aaa bbb ccc") ...
Das hat mich bis jetzt noch nicht so sehr gestört, da ich sie ohnehin größtenteils als getElementsByValue-Funktion eingesetzt habe.
Im Archiv oder in Google sollten sich aber allgemeine getElementsByClass-Funktionen finden lassen.
Ich habe gerade eine gefunden. Aber irgendwie lässt sie sich _nur_ als getElementsByClassName-Funktion verwenden :-(
Bei der älteren Funktion, die nur einen Klassennamen berücksichtigte, konnte ich auch andere Attribute abfragen, indem ich das Element.className einfach durch ein Element.value ausgetauscht habe. Was muss ich tun, damit das auch mit dieser Funktion klappt?
function getElementsByClassName(myName){
var CONTROLS = "*";
var result = [];
var searchExpression = new RegExp( "\\b" + myName + "\\b" );
for (var i = 0; i < CONTROLS.length;i++)
{var objects = document.getElementsByTagName(CONTROLS[i]);
for (var j = 0; j < objects.length;j++)
if (objects[j].className.match(searchExpression))
result.push(objects[j])}
return result;
}
mfg. Daniel
hi,
function getElementsByClassName(myName){
var CONTROLS = "*";
var result = [];
var searchExpression = new RegExp( "\b" + myName + "\b" );
for (var i = 0; i < CONTROLS.length;i++)
Diese Schleife erscheint mir unsinnig - CONTROLS ist kein Array, und nur wenn es eins wäre, wäre die folgende Schleife sinnvoll:
{var objects = document.getElementsByTagName(CONTROLS[i]);
for (var j = 0; j < objects.length;j++)
if (objects[j].className.match(searchExpression))
Hier solltest du erst mal überprüfen, ob das aktuelle Objekt überhaupt eine value-Eigenschaft hat - wenn du nämlich über alle Elemente im Dokument iterierst, haben nur die wenigsten davon eins.
gruß,
wahsaga
Hallo,
function getElementsByClassName(myName){
var CONTROLS = "*";
var result = [];
var searchExpression = new RegExp( "\b" + myName + "\b" );
for (var i = 0; i < CONTROLS.length;i++)Diese Schleife erscheint mir unsinnig - CONTROLS ist kein Array, und nur wenn es eins wäre, wäre die folgende Schleife sinnvoll:
Stimmt eigentlich, allerdings habe ich sie unsinnig gemacht, da vorher mehrere TagNames in der Variable „Controls“ standen. Nur finde ich eine Beschränkung auf bestimmte Elemente irgendwie nicht besonders sinnvoll und hatte die TagNames deshalb gegen ein „*“ ausgetauscht.
{var objects = document.getElementsByTagName(CONTROLS[i]);
for (var j = 0; j < objects.length;j++)
if (objects[j].className.match(searchExpression))Hier solltest du erst mal überprüfen, ob das aktuelle Objekt überhaupt eine value-Eigenschaft hat - wenn du nämlich über alle Elemente im Dokument iterierst, haben nur die wenigsten davon eins.
OK, if-Schleife ist eingefügt. Jetzt funzt es :)
function getElementsByValue(myValue){
var result = [];
var searchExpression = new RegExp( "\\b" + myValue + "\\b" );
var objects = document.getElementsByTagName("*");
for (var j = 0; j < objects.length;j++){
if (objects[j].value){
if (objects[j].value.match(searchExpression))
result.push(objects[j])}}
return result;
}
Danke nochmal.
mfg. Daniel
Hi,
Du kannst getElementsByClassName schon verwenden, musst dafür aber noch folgende Funktion einfügen:
ich würde eher eine Methode an Document- und Element-Objekte anhängen, da ich ansonsten in der Nutzbarkeit doch eher eingeschränkt bin. Allerdings habe ich das Problem noch nicht lösen können, dass der IE die für diese Zwecke benötigte .htc-Ressource für jedes verd*mmte Element neu lädt.
Cheatah
Moin!
Achtung: das „document“ musst du in diesem Fall weg lassen.
Wenn du das document-Objekt prototypisch erweitern würdest, wäre das nicht notwendig.
- Sven Rautenberg
hi,
Achtung: das „document“ musst du in diesem Fall weg lassen.
Wenn du das document-Objekt prototypisch erweitern würdest, wäre das nicht notwendig.
Siehst du hier wirklich einen Vorteil in der Nutzung von prototype gegenüber einem einfachen
document.funktionsname = function() { ... }
oder siehst du es als "sauberer" an, document per prototype zu erweitern?
Höchstens beim Arbeiten mit mehreren documents könnte es in meinen Augen einen Vorteil bieten, wenn man dafür nicht an jedes document einzeln die Funktion binden müsste. Aber ich habe Zweifel, ob prototype sich bspw. in einem Frames-Umfeld über die Grenzen von window hinaus auswirken würde.
gruß,
wahsaga
Hallo,
Siehst du hier wirklich einen Vorteil in der Nutzung von prototype gegenüber einem einfachen
document.funktionsname = function() { ... }
oder siehst du es als "sauberer" an, document per prototype zu erweitern?Höchstens beim Arbeiten mit mehreren documents könnte es in meinen Augen einen Vorteil bieten, wenn man dafür nicht an jedes document einzeln die Funktion binden müsste. Aber ich habe Zweifel, ob prototype sich bspw. in einem Frames-Umfeld über die Grenzen von window hinaus auswirken würde.
Klar, andere Dokumente mit eigenen window-Objekten sind nicht betroffen, lediglich Dokumente, die im eigenen window erschaffen werden. Das betrifft etwa XMLHttpRequest und document.implementation.createDocument, aber das wars auch schon, wenn ich nichts übersehe.
Mathias
Moin!
Gibt es weitere Moglichkeiten außer GetElementById oder GetElementsByTagName ?
Was stört Dich an getElementsByName?
-- Skeeve
Moin!
Gibt es weitere Moglichkeiten außer GetElementById oder GetElementsByTagName ?
Was stört Dich an getElementsByName?
Nicht jedes HTML-Element kennt ein name-Attribut. Es würde invalider HTML-Code erzeugt - und manche Browser halten sich an die DTD und lassen derartige Elemente aus dem Funktionsergebnis raus.
- Sven Rautenberg
Moin!
Nicht jedes HTML-Element kennt ein name-Attribut.
Guter Einwand! Hab ich nicht dran gedacht...
-- Skeeve
hi,
Allerdings sind in meinem Script einige <a> und <td> Tags enthalten, die keine Zuweisung durch GetElementsByTagName bekommen sollen, manche jedoch schon. Wie kann ich diese unterscheiden?
Sag du's uns, woran du sie unterscheiden _willst_.
Bisher hast du im gesamten Threadverlauf noch nichts dazu gesagt, worin diese sich von den anderen unterscheiden, bzw. wie dein Auswahlkritierium lauten soll.
gruß,
wahsaga