• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] document.getElementById().className - problem

kaffekocher

New member
Hallo Ihr lieben,

ich habe x foren durchsucht aber komme nicht weiter..

in einem js habe ich nach definition von 3 arrays Alarmname[] Alarmtext[] und Alarmstatus[] die teils fest definiert sind und teils aus einer S7 Schnittstelle kommen eine for-i schleife in der jeder alarmstatus abgefragt wird. das funktioniert.

wenn nun Alarmwert(i) gesetzt ist kann ich mit alert(Alarmname) ausgeben lassen.

wenn ich in selbiger schleife
document.getElementById("irgendeineexistierendeID").className = "neueklasse";
verwende funktioniert das auch

wenn ich aber anstelle "irgendeineexistierendeID" die aktuelle Alarmname einsetze, also
document.getElementById(Alarmname).className = "neueklasse";

gibt firebug mir die meldung TypeError: document.getElementById(...) is null

hat jemand eine idee?
 
HTML:
var anruf = new Array();

 anruf[0]    = "\nAnruf Fa. xyz Hr. ...";
 anruf[1]    = "\nInstandhaltung (030) ...";
 anruf[2]    = "\nAnruf Fa. abc Fr. ...";
 anruf[3]    = "\nKontrolle vor Ort";

// übergabe der variablen der SPS in javascript erfolgt durch :="HMI_A1_Notruf":;

var Alarmname = new Array();
var Alarmwert = new Array();
var Alarmtext = new Array();

 Alarmname[0] = "HMI_A1_Notruf";
 Alarmwert[0] = 0;
 Alarmtext[0] = "Aufzug 1 Notruf!" + anruf[0] + anruf[1];

 Alarmname[1] = "HMI_RWA_BAB";
 Alarmwert[1] = 0;
 Alarmtext[1] = "Auslösung RWA BAB-Halle!" + anruf[0];

 Alarmname[2] = "HMI_A4_Notruf";
 Alarmwert[2] = 1;
 Alarmtext[2] = "Aufzug 4 Notruf!" + anruf[0] + anruf[1];

 Alarmname[3] = "HMI_Pa_Feuer";
 Alarmwert[3] = 0;
 Alarmtext[3] = "Probealarm Feuer Werk!" + anruf[0];

 Alarmname[4] = "HMI_Alarm_BWB_4OG";
 Alarmwert[4] = 0;
 Alarmtext[4] = "Alarm BWB 4.OG!" + anruf[0];

 Alarmname[5] = "HMI_RM_Sprinkler";
 Alarmwert[5] = 0;
 Alarmtext[5] = "Rauchmelder Sprinklerzentrale!" + anruf[0] + anruf[1];

 Alarmname[6] = "HMI_Alarm_Sprinkler";
 Alarmwert[6] = 0;
 Alarmtext[6] = "Alarm Sprinklerzentrale!" + anruf[0] + anruf[1];

 Alarmname[7] = "HMI_Feuer_GPS";
 Alarmwert[7] = 1;
 Alarmtext[7] = "Feuerwecker GPS-Halle!" + anruf[0];

 Alarmname[8] = "HMI_GM_Heizg_Tisch";
 Alarmwert[8] = 0;
 Alarmtext[8] = "Gasalarm Heizungsraum Tischlerei!" + anruf[0] + anruf[1];

 Alarmname[9] = "HMI_BHR_Aufg4_Stoer";
 Alarmwert[9] = 0;
 Alarmtext[9] = "Voralarm Trafo 1, 2,u. 3 Aufg.4!" + anruf[0];

 Alarmname[10] = "HMI_BHR_Neubau";
 Alarmwert[10] = 0;
 Alarmtext[10] = "Voralarm Trafostation GPS-Halle!" + anruf[0];

 Alarmname[11] = "HMI_Heizg_Tisch";
 Alarmwert[11] = 1;
 Alarmtext[11] = "Störung Gasheizung Tischlerei!" + anruf[2];

 Alarmname[12] = "HMI_Heizg_KessH";
 Alarmwert[12] = 0;
 Alarmtext[12] = "Störung Heizungsanlage Kesselhaus!" + anruf[2];

 Alarmname[13] = "HMI_Kom_GPS";
 Alarmwert[13] = 0;
 Alarmtext[13] = "Störung Kompressor 1, GPS-Halle" + anruf[0] + anruf[1];

 Alarmname[14] = "HMI_Kom2_GPS";
 Alarmwert[14] = 0;
 Alarmtext[14] = "Störung Kompressor 2, GPS-Halle" + anruf[0] + anruf[1];

 Alarmname[15] = "HMI_RWA_GPS_1OG";
 Alarmwert[15] = 1;
 Alarmtext[15] = "RWA 1.OG, GPS-Halle!" + anruf[0];

 Alarmname[16] = "HMI_NR_EH_Station" + anruf[3];
 Alarmwert[16] = 0;
 Alarmtext[16] = "Erste-Hilfe Station";

 Alarmname[17] = "HMI_AlarmErod2_Stoer";
 Alarmwert[17] = 0;
 Alarmtext[17] = "Wasserschaden 2 Erodieraum!" + anruf[0] + anruf[1];

 Alarmname[18] = "HMI_RM_EG_Aufg4_Stoer";
 Alarmwert[18] = 0;
 Alarmtext[18] = "RM Trafostation Aufg.4!" + anruf[0];

 Alarmname[19] = "HMI_RM_Arch_Aufg4_Stoer";
 Alarmwert[19] = 0;
 Alarmtext[19] = "RM Aufg.4 / Archiv BWB!" + anruf[0];

 Alarmname[20] = "HMI_RM_Arch_Aufg5_Stoer";
 Alarmwert[20] = 0;
 Alarmtext[20] = "RM Aufg.5, 1.OG / Archiv!" + anruf[0];

 Alarmname[21] = "HMI_Wasser_EDV";
 Alarmwert[21] = 0;
 Alarmtext[21] = "Wasserschaden_EDV" + anruf[0];

 Alarmname[22] = "HMI_RM_Neubau";
 Alarmwert[22] = 0;
 Alarmtext[22] = "Rauchmelder Trafostation GPS-Halle!" + anruf[0];

 Alarmname[23] = "HMI_RM_KessH";
 Alarmwert[23] = 0;
 Alarmtext[23] = "Rauchmelder Kesselhaus!" + anruf[0];

 Alarmname[24] = "HMI_RM_Heizg_Tisch";
 Alarmwert[24] = 0;
 Alarmtext[24] = "Rauchmelder Heizungsraum Tischlerei" + anruf[0];

 Alarmname[25] = "HMI_TR_Stoer";
 Alarmwert[25] = 0;
 Alarmtext[25] = "Stoerung Technikraum Keller 3!" + anruf[0];

 Alarmname[26] = "HMI_AlarmErod_Stoer";
 Alarmwert[26] = 0;
 Alarmtext[26] = "Wasserschaden Erodieraum!" + anruf[0] + anruf[1];

// S7 Variablen

var QuitMerker = 0;
var PfAlarm = 1;
var Alarmglobal = 1;

function alarminfo(i) {

 var text = Alarmtext[i];
 var oldtext = document.getElementById("alarmtext").innerHTML;

 document.getElementById("alarmtext").style.display = "inline";

 if (PfAlarm==1 && QuitMerker==0) {
  document.getElementById("alarmtext").style.color = "red";
 }
 else if (PfAlarm==0 && QuitMerker==1) {
  document.getElementById("alarmtext").style.color = "blue";
 }


 if (oldtext != "") {
  text = text + "\n- - - - -\n" + oldtext;
 }

 document.getElementById("alarmtext").innerHTML = text;
}

if (Alarmglobal==1) {

 for (var i = 0; i < Alarmwert.length; i++) {
  if (Alarmwert[i]==1) {
   document.getElementById(Alarmname[i]).className = "alarmitem1";
   alarminfo(i);
  }
 }
}

window.setTimeout("location.reload();",10000);

- - - Aktualisiert - - -

Ziel ist eigentlich das ich die css klasse alarmitem0 durch alarmitem1 ersetzen will wenn ein alarmwert gesetzt ist. wenn ich die S7 variablen direkt einsetze kann ich die 0 respektive die 1 aus der S7 einsetzen an der stelle dann ist aber ohne S7 jegliche Formatierung hinüber.
 
Zuletzt bearbeitet von einem Moderator:
Hast du mal eine Debug Ausgabe eingebaut? Also innerhalb der Schleife ein console.log(i); damit man sieht, bei welchem Wert für i der Fehler auftritt.
 
nein ich arbeite sonst fast nur in php ... ich setzte das mal ein ergebnis folgt gleich

- - - Aktualisiert - - -

document.getElementById(...) is null

Line 155

mache ich es so:
Code:
if (Alarmglobal==1) {

 for (var i = 0; i < Alarmwert.length; i++) {
  if (Alarmwert[i]==1) {
   var deid = Alarmname[i];
   // document.getElementById(deid).className = "alarmitem1";
   alarminfo(i);
   alert(deid);
  }
 }
}
funktioniert es egal ob über den Umweg aus dem Array-Inhalt eine einfache var zu machen oder direkt
 
Das heißt, mit dem Umweg über deid klappt es und ohne nicht?
Was ich noch nicht verstehe ist, warum die function in der Schleife nochmal aufgerufen wird.
 
es klappt über den umweg mit der var deid aber auch direkt mit der var Alarmname wenn ich einen alert ausgebe es klappt nur nicht diesen wert in die document.getElementById(deid).className = "alarmitem1"; zu bekommen. wenn ich einen wert manuell fest eintrage geht es aber :(

die schleife macht die variablenabfrage und soll die divs "einfärben" durch den class wechsel, die function schreibt die alarmtexte in eine textarea
 
So kannst du das aber nicht machen. Die function ruft sich selbst auf, welches i soll der Browser denn verwenden? Das Schleifen-i oder das Aufruf-i? Deine Struktur stimmt nicht. Ich verstehe aber im Moment aber auch nicht, was dahinter steckt, deshalb kann ich die Lösung nicht benennen.
Nochmal gefragt: Warum ruft die function sich in der Schleife selbst auf?
 
FEHLER GEFUNDEN!!!

ein div hatte statt id= noch name= ... da hat das automatische ändern nicht ganz geklappt. 1000 Dank für die Hilfe trotzdem :)
 
Ein paar kleine Bemerkungen zum Code:
1. den Array-Konstruktor sollte man besser nicht verwenden, da er inkonsistente Parameterverarbeitung hat. Besser ein Arrayliteral ("[]") verwenden - ist auch kürzer:
Code:
var anruf = [
	"\nAnruf Fa. xyz Hr. ...",
	"\nInstandhaltung (030) ...",
	"\nAnruf Fa. abc Fr. ...",
	"\nKontrolle vor Ort"
];
2. du könntest deine Daten viel einfacher durch ein Array von Objekten speichern:
Code:
var alarm = [
	{
		id: "HMI_A1_Notruf",
		value: false,
		text: "Aufzug 1 Notruf!" + anruf[0] + anruf[1]
	}
];
- du hast dann alles zusammen und brauchst nicht drei Variablen.
3. du solltest dich für eine konsistente Namenskonvention entscheiden. Meistens werden in JS Variablen mit einem kleinen Buchstaben am Anfang in camelcase geschrieben.
4. man sollte so wenige globale Variablen wie möglich haben. Ich bin der Meinung, dass du eigentlich gar keine brauchst.
5. window.setTimeout() sollte man keinen String sondern eine Funktionsreferenz als Parameter übergeben.
6. anstatt dem location.reload() würde ich ja die neuen Informationen über AJAX vom Server holen...

PS: ich halte ein Leerzeichen zur Codeeinrückung für zu wenig... aber das ist Geschmackssache.
 
Zurück
Oben