Element (Tag) nach einem Element (Tag) durchsuchen

Fragen zu HTML, CSS, eigenen Erweiterungen etc.
Maxs
Moderator
Beiträge: 551
Registriert: 09.10.2008, 18:21
Kontaktdaten:

Element (Tag) nach einem Element (Tag) durchsuchen

Ungelesener Beitrag von Maxs » 07.05.2011, 17:48

Hey :)
ich bin gerade fleißig am Scripts schreiben, aber habe jetzt ein Problem. Wie kann ich ein Element (Tag) in einem Element (Tag) suchen?
Ich möchte die letzten paar Zeilen untersuchen, ob sich jemand eingeloggt hat. Im Quellcode steht, dass bei einem Login das Element (Tag) <login USER /> ausgegeben wird. Also möchte ich nach dem suchen.
Ich hab jetzt schon so einiges versucht, aber habs noch nicht hinbekommen.
Mein Ansatz:

Code: Alles auswählen

function searchLoginLS() {
  var countFails = 0;
  var trs = document.getElementsByTagName('tr');
  for (i=1; i<=5; i++) {
    if (trs[trs.length-i].innerHTML.match(/<login .+ \/>/gi) != -1) {
      break;
      return 1;
    } else {
      countFails++;
    }      
  }
  if (countFails==4) {
    return 0;
  }
}
Im FF und im IE wird jeweils undefined ausgegeben. Hab ich irgendetwas beim RegExp falsch? Hat jemand eine Idee? :D
Wäre es nicht adäquat, den Usus heterogener Termini zu minimieren?

1. FC Keller
Moderator
Beiträge: 866
Registriert: 04.07.2004, 17:10
Wohnort: heimat:// Thüringen.Deutschland.eu/ Zeulenroda
Kontaktdaten:

Re: Element (Tag) nach einem Element (Tag) durchsuchen

Ungelesener Beitrag von 1. FC Keller » 09.05.2011, 14:39

Vor deinem return 1 hast du ein break.. d.h. es kommt gar nicht zum return weil die Schleife vorher abgebrochen wird.
Theoretisch solltest du dieses login-Tag auch per DOM finden und damit auf das innerHTML und das match verzichten können...
Die Funktion dürfte außerdem Fehlermeldungen bringen wenn weniger als 5 Zeilen im Chatstream stehen... dagegen habe ich noch eine Abfrage eingebaut.
wozu eigentlich die countFails-Variable? da sie lokal per var deklariert wird ist sie außerhalb der Funktion sowieso nicht abfragbar und zurückgegeben wird sie auch nicht per return... ich war mal so frei und habe sie entfernt weil ich keinen Sinn erkennen konnte.
vielleicht hilft das weiter:

Code: Alles auswählen

function searchLoginLS() {
  var trs = document.getElementsByTagName('tr');
  for (i=1; i<=5; i++) {
    if (trs.length>=i && trs[trs.length-i] && trs[trs.length-i].getElementsByTagName("login").length){
      return 1;
    }
  }
  return 0;
}
Ich weiß nicht was du damit vor hast... ich nehme mal an, du willst mit einem Intervall regelmäßig prüfen ob sich jemand neu eingeloggt hat... da wäre theoretisch auch noch eine Alternative, die Loginsound-Funktion zu überschreiben, denn die wird beim Login automatisch ausgeführt und man könnte sich den intervall sparen.

Das könnte z.B. so aussehen:

Code: Alles auswählen

LoginSound_alt=LoginSound;
LoginSound=function(){
  alert("es hat sich jemand eingeloggt :)");
  LoginSound_alt();
}

Maxs
Moderator
Beiträge: 551
Registriert: 09.10.2008, 18:21
Kontaktdaten:

Re: Element (Tag) nach einem Element (Tag) durchsuchen

Ungelesener Beitrag von Maxs » 09.05.2011, 16:39

1. FC Keller hat geschrieben:Vor deinem return 1 hast du ein break.. d.h. es kommt gar nicht zum return weil die Schleife vorher abgebrochen wird.
Theoretisch solltest du dieses login-Tag auch per DOM finden und damit auf das innerHTML und das match verzichten können...
Stimmt, in der Funktion war das break völlig sinnfrei, hab ja auch ein return drinnen, das die Funktion ja sowieso abbricht, wenn es verwendet wird. :oops:
.
1. FC Keller hat geschrieben:Die Funktion dürfte außerdem Fehlermeldungen bringen wenn weniger als 5 Zeilen im Chatstream stehen... dagegen habe ich noch eine Abfrage eingebaut.
Ja, das wusste ich, aber danke für den Hinweis. ;)
Hatte es nur noch nicht eingebaut, weil ich erstmal den Login erfolgreich suchen wollte.
1. FC Keller hat geschrieben:wozu eigentlich die countFails-Variable? da sie lokal per var deklariert wird ist sie außerhalb der Funktion sowieso nicht abfragbar und zurückgegeben wird sie auch nicht per return... ich war mal so frei und habe sie entfernt weil ich keinen Sinn erkennen konnte.
Oh, achso. Sie war eigentlich dafür da, die fehlgeschlagenen Suchvorgänge zu zählen. Und wenn es immer fehlgeschlägt, dass dann die Funktion 0 ausgibt.
Ich wusste nicht, dass als erstes die Schleife ganz durchläuft, bevor es in der Funktion weitergeht. Weil ich hatte gedacht, dass sowas wie in deiner Variante jetzt, immer 0 ausgibt. Aber super so, jetzt habe ich was dazugelernt. Danke! :)
1. FC Keller hat geschrieben:vielleicht hilft das weiter:

Code: Alles auswählen

function searchLoginLS() {
  var trs = document.getElementsByTagName('tr');
  for (i=1; i<=5; i++) {
    if (trs.length>=i && trs[trs.length-i] && trs[trs.length-i].getElementsByTagName("login").length){
      return 1;
    }
  }
  return 0;
}


Werde ich mal ausprobieren, super, danke!
1. FC Keller hat geschrieben:Ich weiß nicht was du damit vor hast... ich nehme mal an, du willst mit einem Intervall regelmäßig prüfen ob sich jemand neu eingeloggt hat... da wäre theoretisch auch noch eine Alternative, die Loginsound-Funktion zu überschreiben, denn die wird beim Login automatisch ausgeführt und man könnte sich den intervall sparen.

Das könnte z.B. so aussehen:

Code: Alles auswählen

LoginSound_alt=LoginSound;
LoginSound=function(){
  alert("es hat sich jemand eingeloggt :)");
  LoginSound_alt();
}
Hmm. Gute Idee, die LoginSound-Funktion könnte ich überschreiben, dann wäre das Script sogar einfacher, als ich gedacht habe!
Meine Intention an dem ganzen ist, dass ich gerade das Script "Einmarsch"-Musik fast fertig geschrieben habe und das auf Basis eines Chatbefehls (Das mit dem Login überprüfen wäre gegen die Ausnutzung gewesen) + JS-Datei gemacht hätte.
Aber jetzt überschreibe ich einfach die LoginSound-Funktion.

Naja, ich lern immer mehr dazu, danke! :)
Wäre es nicht adäquat, den Usus heterogener Termini zu minimieren?

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 56 Gäste