Ashura: Erweiterung fürs User-JS

puts "Hallo " + gets.chomp + "."

?>
=> Hallo.

Da mich immer gestört hat, dass man zum Wechseln von Thema und / oder Themenbereich immer die Vorschau benötigt, habe ich mir überlegt, die beiden dafür verantwortlichen Formularelemente per User-JS in die Standardansicht einzuhängen. Ich habe natürlich darauf geachtet, dass die Formularelemente an die selbe Stelle wie in der Vorschau eingehängt werden. (Und musste erst einmal über die besondere Eigenschaft der Browser stolpern, dass sie implizit in jedes <table>-Element ein <tbody>-Element einhängen, sofern noch keines vorhanden ist.)

Letztendlich kam folgendes Script dabei heraus, welches per window.onload initialisiert werden sollte. (Warum funktioniert document.onload nur im Opera, nicht aber im FF?)

Im Moment hat der IE auch noch ein Problem mit folgender Zeile:

if(strong[i].getAttribute("class") == "active")

Im SelfHTML-Beispiel zu getAttribute() steht, dass er ab V. 5.x dies unterstützen würde was er ja auch im Beispiel macht. Doch bei obiger Zeile gibt er lediglich „null“ aus.

Wer hierzu (und natürlich auch zum gesamten Skript) Verbesserungsvorschläge hat, möge sie mir bitte mitteilen. Auch wenn Fragen aufkommen sollten, bin ich gewillt, sie meinem Kenntnisstand entsprechend zu beantworten.

Hier nun also das Skript:

  
function inserthelper()  
{  
    var strong = document.getElementsByTagName("strong");  
  
    for(var i = 0;i < strong.length;i++)  
    {  
        if(strong[i].getAttribute("class") == "active")  
        {  
            var title = strong[i].firstChild.nodeValue;  
            var category = strong[i].previousSibling.previousSibling.firstChild.nodeValue;  
        }  
    }  
    if(title && category)  
    {  
        var tbody            = document.getElementsByTagName("tbody")[1];  
        var tr               = document.getElementsByTagName("tr")[5];  
  
        var thematr          = document.createElement("tr");  
        var themath          = document.createElement("th");  
        var thematd          = document.createElement("td");  
        var bereichtr        = document.createElement("tr");  
        var bereichth        = document.createElement("th");  
        var bereichtd        = document.createElement("td");  
  
        var themalabel       = document.createElement("label");  
        var themalabeltext   = document.createTextNode("Thema:");  
        var bereichlabel     = document.createElement("label");  
        var bereichlabeltext = document.createTextNode("Themenbereich:");  
  
        var themainput       = document.createElement("input");  
            themainput.setAttribute("type","text");  
            themainput.setAttribute("name","subject");  
            themainput.setAttribute("id","formular-thema");  
            themainput.setAttribute("value",title);  
            themainput.setAttribute("size","40");  
            themainput.setAttribute("class","eingabefeld");  
  
        var bereichselect    = document.createElement("select");  
            bereichselect.setAttribute("size","1");  
            bereichselect.setAttribute("name","cat");  
            bereichselect.setAttribute("id","formular-themenbereich");  
  
        var bereichoption    = document.createElement("option");  
  
        var bereiche = new Array  
        (  
        "Bitte auswählen!",  
        "ASP",  
        "BARRIEREFREIHEIT",  
        "BROWSER",  
        "CGI",  
        "CSS",  
        "DATENBANK",  
        "DESIGN",  
        "DHTML",  
        "E-MAIL",  
        "FTP",  
        "GRAFIK",  
        "HTML",  
        "HTTP",  
        "INTERNET-ANBINDUNG",  
        "JAVA",  
        "JAVASCRIPT",  
        "MEINUNG",  
        "MENSCHELEI",  
        "PERL",  
        "PHP",  
        "PROGRAMMIERTECHNIK",  
        "PROJEKTVERWALTUNG",  
        "PROVIDER",  
        "RECHT",  
        "SERVER",  
        "SOFTWARE",  
        "SONSTIGES",  
        "VB-SCRIPT",  
        "XML",  
        "XML-DERIVAT",  
        "XSL",  
        "ZUR INFO",  
        "ZU DIESEM FORUM"  
        );  
  
        for(var i = 0; i < bereiche.length;i++)  
        {  
            option = bereichoption.cloneNode(false);  
            if(bereiche[i] == "Bitte auswählen!")  
            {  
                option.setAttribute("value","");  
            }  
            else  
            {  
                option.setAttribute("value",bereiche[i]);  
            }  
  
            if(bereiche[i] == category)  
            {  
                option.setAttribute("selected","selected");  
            }  
            optiontext = document.createTextNode(bereiche[i]);  
            option.appendChild(optiontext);  
  
            bereichselect.appendChild(option);  
        }  
  
        tbody.insertBefore(thematr,tr);  
  
        thematr     .appendChild(themath);  
        themath     .appendChild(themalabel);  
        themalabel  .appendChild(themalabeltext);  
        thematr     .appendChild(thematd);  
        thematd     .appendChild(themainput);  
  
        tbody.insertBefore(bereichtr,tr);  
  
        bereichtr   .appendChild(bereichth);  
        bereichth   .appendChild(bereichlabel);  
        bereichlabel.appendChild(bereichlabeltext);  
        bereichtr   .appendChild(bereichtd);  
        bereichtd   .appendChild(bereichselect);  
    }  
}  

Einen schönen Sonntag noch.

Gruß, Ashura

--
Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
30 Days to becoming an Opera8 Lover -- Opera 8.02 mit Bittorent-Unterstützung
Meine Browser: Opera 8.01 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
[Deshalb frei! - Argumente pro freie Software]
  1. Hi,

    Und musste erst einmal über die besondere Eigenschaft der Browser stolpern, dass sie implizit in jedes <table>-Element ein <tbody>-Element einhängen, sofern noch keines vorhanden ist.

    Das kommt daher, daß in HTML ein table-Element immer mindestens ein tbody-Element enthält, auch wenn die tags dazu fehlen.

    Im Moment hat der IE auch noch ein Problem mit folgender Zeile:
    if(strong[i].getAttribute("class") == "active")

    IE hat mit den getAttribute/setAttribute meist dann Probleme, wenn das Attribut auch auf anderem Weg verfügbar ist.
    Für das class-Attribut ist das die Eigenschaft className.

    strong[i].className sollte funktionieren.

    Außerdem: Dir ist klar, daß das class-Attribute ggf. mehrere Klassennamen enthalten kann?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. puts "Hallo " + gets.chomp + "."

      ?> MudGuard
      => Hallo MudGuard.

      Das kommt daher, daß in HTML ein table-Element immer mindestens ein tbody-Element enthält, auch wenn die tags dazu fehlen.

      Dass es weggelassen werden kann, war mir bewusst, doch dass es dennoch immer existiert habe ich erst beim Ausgeben des generierten Quelltextes erkannt.

      Für das class-Attribut ist das die Eigenschaft className.

      strong[i].className sollte funktionieren.

      Sehr gut, das tut es. Danke. Ich habe es nun wie folgt abgeändert:

      if(strong[i].getAttribute("class") == "active" || strong[i].className == "active")

      Außerdem: Dir ist klar, daß das class-Attribute ggf. mehrere Klassennamen enthalten kann?

      Ja, durchaus. Ich werde versuchen dahingehend mittels match() etwas mehr Flexibilität einzubauen.
      Wenn es eine bessere Möglichkeit gibt nenne sie mir bitte.

      Einen schönen Sonntag noch.

      Gruß, Ashura

      --
      Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
      30 Days to becoming an Opera8 Lover -- Opera 8.02 mit Bittorent-Unterstützung
      Meine Browser: Opera 8.01 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
      [Deshalb frei! - Argumente pro freie Software]
      1. Hi,

        if(strong[i].getAttribute("class") == "active" || strong[i].className == "active")

        Gibt es Browser, die className nicht kennen? M.E. kann der erste Teil wegfallen.

        Außerdem: Dir ist klar, daß das class-Attribute ggf. mehrere Klassennamen enthalten kann?
        Ja, durchaus. Ich werde versuchen dahingehend mittels match() etwas mehr Flexibilität einzubauen.

        Ich mach das so:
        Vor und nach dem className ein Leerzeichen anfügen, damit steht vor und nach jedem Klassennamen ein Leerzeichen.
        Jetzt kann mit indexOf(" klasse ") danach eindeutig gesucht werden.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. puts "Hallo " + gets.chomp + "."

          ?> MudGuard
          => Hallo MudGuard.

          if(strong[i].getAttribute("class") == "active" || strong[i].className == "active")

          Gibt es Browser, die className nicht kennen? M.E. kann der erste Teil wegfallen.

          Mir ist soweit keiner bekannt. Wenn className nicht zufällig aus JavaScript verschwindet, hast du sicher Recht.

          Ich mach das so:
          Vor und nach dem className ein Leerzeichen anfügen, damit steht vor und nach jedem Klassennamen ein Leerzeichen.
          Jetzt kann mit indexOf(" klasse ") danach eindeutig gesucht werden.

          Ungefähr so?

          strong[i].className = " " + strong[i].className + " ";  
          if(strong[i].className.indexOf(" active ") == 0)
          

          Ich muss hier aber noch einen Fehler gemacht haben, da die Suche erfolglos ist, wenn VOR „active“ noch eine weitere Klasse notiert wurde. Danach ist kein Problem.

          Hast du hierzu noch einen Tipp parat?

          Einen schönen Sonntag noch.

          Gruß, Ashura

          --
          Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
          30 Days to becoming an Opera8 Lover -- Opera 8.02 mit Bittorent-Unterstützung
          Meine Browser: Opera 8.01 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
          [Deshalb frei! - Argumente pro freie Software]
          1. Hi,

            strong[i].className = " " + strong[i].className + " ";

            Ich würd das eher in einer Variable speichern (wer weiß, ob irgendein Browser die Leerzeichen nicht wieder wegwirft ...)

            if(strong[i].className.indexOf(" active ") == 0)

            Ich muss hier aber noch einen Fehler gemacht haben, da die Suche erfolglos ist, wenn VOR „active“ noch eine weitere Klasse notiert wurde.

            Dank == 0 verlangst Du, daß " active " ganz am Anfang stehen muß.

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            Schreinerei Waechter
            Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
            1. Hi,

              strong[i].className = " " + strong[i].className + " ";
              Ich würd das eher in einer Variable speichern (wer weiß, ob irgendein Browser die Leerzeichen nicht wieder wegwirft ...)

              ich würde das eher prototypen ;-)

              Cheatah

              --
              X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
              X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
              X-Will-Answer-Email: No
              X-Please-Search-Archive-First: Absolutely Yes
            2. puts "Hallo " + gets.chomp + "."

              ?> MudGuard
              => Hallo MudGuard.

              strong[i].className = " " + strong[i].className + " ";

              Ich würd das eher in einer Variable speichern (wer weiß, ob irgendein Browser die Leerzeichen nicht wieder wegwirft ...)

              Aber hierbei bleiben sie erhalten, oder?

              strongclass = " " + strong[i].className + " ";

              if(strong[i].className.indexOf(" active ") == 0)

              Ich muss hier aber noch einen Fehler gemacht haben, da die Suche erfolglos ist, wenn VOR „active“ noch eine weitere Klasse notiert wurde.

              Dank == 0 verlangst Du, daß " active " ganz am Anfang stehen muß.

              *g* Die Gegenrichtung führt also zum Gewünschten:

              if(strongclass.indexOf(" active ") != -1)

              Nun wird „active“ in jedem Falle gefunden, sofern es überhaupt vorhanden ist.

              Vielen Dank.

              Einen schönen Sonntag noch.

              Gruß, Ashura

              --
              Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
              30 Days to becoming an Opera8 Lover -- Opera 8.02 mit Bittorent-Unterstützung
              Meine Browser: Opera 8.01 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
              [Deshalb frei! - Argumente pro freie Software]
  2. Hi,

    (Und musste erst einmal über die besondere Eigenschaft der Browser stolpern, dass sie implizit in jedes <table>-Element ein <tbody>-Element einhängen, sofern noch keines vorhanden ist.)

    HTML lässt grüßen: Start- und End-Tag sind optional :-)

    (Warum funktioniert document.onload nur im Opera, nicht aber im FF?)

    Gegenfrage: Warum funktioniert document.onload im Opera? Ich sehe keinen Grund dafür.

    Im Moment hat der IE auch noch ein Problem mit folgender Zeile:
    if(strong[i].getAttribute("class") == "active")

    Probiere es mit className.

    Wer hierzu (und natürlich auch zum gesamten Skript) Verbesserungsvorschläge hat, möge sie mir bitte mitteilen. Auch wenn Fragen aufkommen sollten, bin ich gewillt, sie meinem Kenntnisstand entsprechend zu beantworten.

    Bist Du auch gewillt, einen Dank entgegen zu nehmen? :-) Ich finde es gut, dass Du die Früchte Deiner Arbeit an uns weiter gibst. Dennoch erlaube ich mir etwas Kritik:

    for(var i = 0;i < strong.length;i++)

    Dein Code ist für mich schwer lesbar, was an einer etwas ... eigenwilligen Verwendung der Leerzeichen liegt. Zunächst einmal sind "for" und "if" keine Funktionen, daher werden die Klammern üblicherweise per Leerzeichen getrennt. Dann solltest Du ein Semikolon wie ein Satzzeichen behandeln, und zudem zusammen führen, was zusammen gehört, wenn es optisch nicht von anderem Code getrennt wird:

    for (var i=0; i<strong.length; i++) {

    Wie Du siehst, habe ich außerdem die öffnende geschweifte Klammer in der selben Zeile gehört: Ein Block beginnt mit _einer_ Zeile, nicht mit zweien.

    var bereiche = new Array
            (
            "Bitte auswählen!",

    new Array() hingegen ist mit einer Funktion gleichzusetzen, deswegen sollte die öffnende Klammer direkt anschließen. Die Array-Elemente würde ich noch einrücken.

    Einen schönen Sonntag noch.

    this.value += 'Danke, dito!';

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. puts "Hallo " + gets.chomp + "."

      ?> Cheatah
      => Hallo Cheatah.

      Gegenfrage: Warum funktioniert document.onload im Opera? Ich sehe keinen Grund dafür.

      Gute Frage.

      Im Moment hat der IE auch noch ein Problem mit folgender Zeile:
      if(strong[i].getAttribute("class") == "active")

      Probiere es mit className.

      Habe ich eingebaut.

      Bist Du auch gewillt, einen Dank entgegen zu nehmen? :-) Ich finde es gut, dass Du die Früchte Deiner Arbeit an uns weiter gibst.

      Ich nehme sowohl dies dankend entgegen, als auch...

      Dennoch erlaube ich mir etwas Kritik:

      ... dies.

      for(var i = 0;i < strong.length;i++)

      Dein Code ist für mich schwer lesbar, was an einer etwas ... eigenwilligen Verwendung der Leerzeichen liegt.

      Ich weiß; in Sachen Skripting bin ich an vielen Stellen ein Minimalist.

      Zunächst einmal sind "for" und "if" keine Funktionen, daher werden die Klammern üblicherweise per Leerzeichen getrennt.

      Ja, hatte ich schon bemerkt. Doch irgendwie wirkt „for“ / „if“ dann auf mich, als würden die folgenden Klammern nicht dazu gehören.

      Dann solltest Du ein Semikolon wie ein Satzzeichen behandeln, und zudem zusammen führen, was zusammen gehört, wenn es optisch nicht von anderem Code getrennt wird:

      for (var i=0; i<strong.length; i++) {

      Ja, werde ich überdenken.

      Wie Du siehst, habe ich außerdem die öffnende geschweifte Klammer in der selben Zeile gehört: Ein Block beginnt mit _einer_ Zeile, nicht mit zweien.

      Mit Verlaub: ich finde dies hässlich. ;-)
      Es ist mein Stil, die öffnenden und schließenden Klammern vertikal auf eine Ebene zu bringen um damit die Zusammengehörigkeit besser erkennen zu können. (Ja, mein Editor kann Klammernpaare markieren.)

      Aber naja, wie heißt es so schön: Über Geschmack lässt sich (nicht) streiten.

      new Array() hingegen ist mit einer Funktion gleichzusetzen, deswegen sollte die öffnende Klammer direkt anschließen. Die Array-Elemente würde ich noch einrücken.

      Ich werde es in Erwägung ziehen. Ich strebe durchaus nicht nur die Erweiterung meines Wissens, sondern auch die Verbesserung meines Programmierstiles an, daher freue ich mich über Antworten wie die Deinige.

      Einen schönen Sonntag noch.

      Gruß, Ashura

      --
      Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
      30 Days to becoming an Opera8 Lover -- Opera 8.02 mit Bittorent-Unterstützung
      Meine Browser: Opera 8.01 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
      [Deshalb frei! - Argumente pro freie Software]
      1. Hi,

        Probiere es mit className.
        Habe ich eingebaut.

        zum von MudGuard angesprochenen Problem: Ich erweitere gewöhnlich das Node-Objekt um eine addClass()- und eine removeClass()-Methode, welche den className am Leerzeichen aufsplittet. Performance ist hier ja nicht sooo relevant.

        Ja, hatte ich schon bemerkt. Doch irgendwie wirkt „for“ / „if“ dann auf mich, als würden die folgenden Klammern nicht dazu gehören.

        Da solltest Du eventuell in Erwägung ziehen, Dich selbst zu trainieren. Was ich vorschlug, entspricht so ziemlich jedem Styleguide beinahe jeder Sprache - abgesehen vielleicht von Python, wo man bei "if" die Klammern gleich ganz weg lässt.

        Wie Du siehst, habe ich außerdem die öffnende geschweifte Klammer in der selben Zeile gehört: Ein Block beginnt mit _einer_ Zeile, nicht mit zweien.
        Mit Verlaub: ich finde dies hässlich. ;-)

        Ja, hier scheiden sich die Geister :-) Die meisten Styleguides, Autoformatierungen etc. sehen die öffnende Klammer aber in der selben Zeile.

        Es ist mein Stil,

        Solange Du Code nur für Dich schreibst (und auch nur eigene Codes verwendest), ist das durchaus okay. Geht es darüber hinaus, ist _Dein_ Stil aber nicht mehr relevant - dann geht es um den Stil, den das Gros der anderen besitzt. Ich habe auch einige Dinge mühsam lernen müssen, als meine Codes von hundert anderen Leuten tagtäglich verwendet wurden; letztlich habe ich aber eingesehen, dass ein einheitlicher Stil fast schon das Wichtigste an der Programmierung ist: Nichts ist schwerer, als den Code eines fremden zu lesen, warum es also noch zusätzlich erschweren?

        Aber naja, wie heißt es so schön: Über Geschmack lässt sich (nicht) streiten.

        Wie gesagt: Solange es um Geschmack geht, stimme ich Dir zu :-)

        Ich werde es in Erwägung ziehen. Ich strebe durchaus nicht nur die Erweiterung meines Wissens, sondern auch die Verbesserung meines Programmierstiles an, daher freue ich mich über Antworten wie die Deinige.

        Ich weiß, so habe ich Dich eingeschätzt. Es freut mich trotzdem, dass meine Äußerungen bei Dir so ankommen, wie ich sie meinte :-)

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. puts "Hallo " + gets.chomp + "."

          ?> Cheatah
          => Hallo Cheatah.

          zum von MudGuard angesprochenen Problem: Ich erweitere gewöhnlich das Node-Objekt um eine addClass()- und eine removeClass()-Methode, welche den className am Leerzeichen aufsplittet. Performance ist hier ja nicht sooo relevant.

          Auch eine Möglichkeit. Und da ich RegEx sehr schätze, würde ich hiermit darauf los gehen, würde damit aber wahrscheinlich wieder die sprichwörtliche Kanone für die Spatzen auspacken.

          Da solltest Du eventuell in Erwägung ziehen, Dich selbst zu trainieren. Was ich vorschlug, entspricht so ziemlich jedem Styleguide beinahe jeder Sprache - abgesehen vielleicht von Python, wo man bei "if" die Klammern gleich ganz weg lässt.

          Mit Verlaub: ich finde dies hässlich. ;-)

          Ja, hier scheiden sich die Geister :-) Die meisten Styleguides, Autoformatierungen etc. sehen die öffnende Klammer aber in der selben Zeile.

          Ist richtig. Wie gesagt: Ich werde es überdenken.

          Nichts ist schwerer, als den Code eines fremden zu lesen, warum es also noch zusätzlich erschweren?

          Wie wahr. Und dass Skripte für den privaten Gebrauch Macken haben und durchaus spezialisiert sein dürfen, bei öffentlicher Nutzung durch andere hingegen perfekt[tm] und universell sein müssen, ist mir auch bewusst.

          Ich werde meinen Stil sehr wahrscheinlich dahingehend anpassen.

          Einen schönen Sonntag noch.

          Gruß, Ashura

          --
          Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
          30 Days to becoming an Opera8 Lover -- Opera 8.02 mit Bittorent-Unterstützung
          Meine Browser: Opera 8.01 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
          [Deshalb frei! - Argumente pro freie Software]
          1. Hi,

            Auch eine Möglichkeit. Und da ich RegEx sehr schätze, würde ich hiermit darauf los gehen, würde damit aber wahrscheinlich wieder die sprichwörtliche Kanone für die Spatzen auspacken.

            naja, das macht den Code noch etwas knackiger, dank \b. Ich gehe gewöhnlich den Weg über eine Schleife, was recht umständlich ist, aber häufig genügt.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. puts "Hallo " + gets.chomp + "."

              ?> Cheatah
              => Hallo Cheatah.

              naja, das macht den Code noch etwas knackiger, dank \b. Ich gehe gewöhnlich den Weg über eine Schleife, was recht umständlich ist, aber häufig genügt.

              Naja, dank dem Update habe ich nun erst einmal genug damit zu tun, mein JS anzupassen.

              <strong class="active"> -> <li class="active"> usw. ...

              Einen schönen Sonntag noch.

              Gruß, Ashura

              --
              Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
              30 Days to becoming an Opera8 Lover -- Opera 8.02 mit Bittorent-Unterstützung
              Meine Browser: Opera 8.01 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
              [Deshalb frei! - Argumente pro freie Software]
            2. hi,

              Und da ich RegEx sehr schätze, würde ich hiermit darauf los gehen, würde damit aber wahrscheinlich wieder die sprichwörtliche Kanone für die Spatzen auspacken.

              naja, das macht den Code noch etwas knackiger, dank \b.

              das geht aber in die hose, wenn deine klassennamen auch bindestrich-minus enthalten (können).

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
              1. Hi,

                das geht aber in die hose, wenn deine klassennamen auch bindestrich-minus enthalten (können).

                stimmt, daran hatte ich nicht gedacht. Nun ja, dann wird die RegExp eben wieder hübsch hässlich ... :-)

                Cheatah

                --
                X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
    2. Hallo,

      Oh, das hast du ein Fass ohne Boden aufgemacht.

      (Warum funktioniert document.onload nur im Opera, nicht aber im FF?)

      Gegenfrage: Warum funktioniert document.onload im Opera? Ich sehe keinen Grund dafür.

      Weil der load-Event gemäß DOM 3 Events (zumindest) am Document-Knoten des DOM-Knotenbaums passiert, in einem (X)HTML-Dokument ist das gemäß DOM HTML das document-Objekt. Dass Opera und Gecko window.addEventListener kennen, ist tendenziell proprietär. Gemäß der Objekthierarchie window.document könnte man annehmen: Der load-Event startet beim window-Event und steigt zum document-Objekt hinab (capture phase) und wieder auf (bubble phase).

      Zugegeben, DOM 3 Events alleine erklärt nicht direkt, warum auch document.onload im Opera funktioniert. Es erklärt aber, wieso document.addEventListener("load", function () {alert("Hallo Welt");}, false); funktioniert (das kann Mozilla auch nicht). Und es ist logisch, dass Opera beim Feuern eines Events sowohl die Handlerfunktion feuert, die unter knotenobjekt.onevent gespeichert wurde, als auch die, die über knotenobjekt.addEventListener registriert wurden.

      Zugegeben, in DOM 2 Events steht zudem nicht ausdrücklich, dass der load-Event beim Document-Knoten passiert, es steht dort gar nicht, wo er passiert. Es steht dort nur, dass unload für das body-Element gültig ist. Das lässt sich aber schlecht auf load übertragen, schließlich kann man document.body nicht ansprechen, um ihm ein load-Handler zuzuweisen, bevor document.body geladen ist, und dann ist es bereits zu spät. Also gehe ich von DOM 3 Events als Maßstab aus, auch wenn kein Browser sich wirklich vollständig daran orientiert.

      Geckos Verhalten ist schlichtweg fehlerhaft. Korrekt (oder sagen wir einmal kohärent) verhält er sich in dem Punkt: Eventobjekt.target beim load-Event am window-Objekt ist nicht das window-Objekt selbst, sondern HTMLDocument, also das document-Objekt. Aber der Event kommt nie beim echten target, also document, an. Man denkt, es wäre ein Event, der danach hinabsteigt bzw. gerade aufgestiegen ist. Aber Eventobjekt.eventPhase sagt target phase. Das ist widersprüchlich, weil Eventobjekt.target und Eventobjekt.currentTarget in der target phase per definitionem identisch sein müssen. Daher ist Eventobjekt.target === document gemäß DOM 3 Events korrekt, aber das restliche Verhalten von Gecko widerspricht dem, insofern ist das Gecko-Konzept gemessen an DOM 3 Events fehlerhaft, gemessen an sich selbst inkohärent.

      Opera spinnt auch ein wenig: Er sieht window und document in dieser Hinsicht als identisch an, nicht als verschachtelt. Das heißt, sowohl beim load-Handler für window als auch bei load-Handler für document ist Eventobjekt.target === document, Eventobjekt.currentTarget === document und Eventobjekt.eventPhase = 2 (target phase). Da steigt der load-Event nicht auf und nicht ab, window und document werden gleichermaßen als oberste Objekte angesehen. Das ist m.W. bei allen Events so, nehmen wir einmal den click-Event:

      window.addEventListener("click", function (e) {alert(e.target + " " + e.currentTarget + " " + e.eventPhase);}, false);  
      document.addEventListener("click", function (e) {alert(e.target + " " + e.currentTarget + " " + e.eventPhase);}, false);
      

      Dasselbe Ergebnis wie beim load-Event (angenommen, das Dokument ist so klein, dass man in eine leere Fläche des Browserfensters klicken kann und somit kein Kindelement von body trifft).

      Noch eine Kuriosität: Konqueror feuert den load-Event bei document mit target == null, currentTarget === document, eventPhase == 2. Dieser Event steigt nicht von oben herab und steigt auch nicht auf, löst also keinen load-Event bei window aus. Gleichzeitig wird ein zweiter Event gefeuert beim window-Objekt mit target == null, currentTarget == null, eventPhase == 2. (Immerhin verweist this auf das window-Objekt.) Dieser bewegt sich auch nicht weiter in der Objekthierarchie. Soviel zur Standardkonformität von Konqueror.

      Mathias

  3. puts "Hallo " + gets.chomp + "."

    ?>
    => Hallo.

    Nachdem nun also der Code des Forums gravierende Veränderungen erfahren hat, musste ich das Skript dahingehend anpassen.

    Die derzeitige Lösung „funzt“ zwar, ist aber in meinen Augen noch sehr hässlich und unflexibel. Mir fällt sicher noch etwas Besseres ein.

    Hier nun also die aktuelle Fassung:

    function inserthelper()  
    {  
        var li = document.getElementById("active-post");  
      
        for (var i = 0; i < li.childNodes.length; i++) {  
            var postingclass = " " + li.childNodes[i].className + " ";  
      
            if (postingclass.indexOf(" posting ") != -1) {  
                for (var k = 0; k < li.childNodes[i].childNodes.length; k++) {  
                    var subjectclass = " " + li.childNodes[i].childNodes[k].className + " ";  
      
                    if (subjectclass.indexOf(" subject ") != -1) {  
                        for (var l = 0; l < li.childNodes[i].childNodes[k].childNodes.length; l++) {  
                            var lastclass = " " + li.childNodes[i].childNodes[k].childNodes[l].className + " ";  
      
                            if (lastclass.indexOf(" cathigh ") != -1 || lastclass.indexOf(" category ") != -1) {  
                                var category = li.childNodes[i].childNodes[k].childNodes[l].firstChild.nextSibling.nodeValue;  
                            }  
                            if (lastclass.indexOf(" title ") != -1) {  
                                var title = li.childNodes[i].childNodes[k].childNodes[l].firstChild.nodeValue;  
                            }  
                        }  
                    }  
                }  
            }  
        }  
      
        if (title && category) { /* unverändert */ }
    

    Einen schönen Montag noch.

    Gruß, Ashura

    --
    Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
    30 Days to becoming an Opera8 Lover -- Opera 8.02 mit Bittorent-Unterstützung
    Meine Browser: Opera 8.01 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
    [Deshalb frei! - Argumente pro freie Software]