Pietro: verschachtelte If-Abfragen

Hallo Zusammen,

ich befürchte einen ganz banalen Fehler zu machen, sitze aber schon den 2. Abend vor dem Rechner, lese und recherchiere ... finde aber keine Lösung.

Ich möchte gerne via JavaScript Daten zu einem Online-Artikel erfassen ... den Autor und den Server.

Den Server kann ich auslesen:
var server = base_window.location.hostname.replace(/www./g, "");

Den Autoren nicht, daher möchte ich diesen im HTML-Dokument markieren und das Markierte auslesen:
var author=window.getSelection();

So weit, so gut. Jetzt kommt die Krux:
Fall 1: kein Autor ist angegeben (also ist auch nix markiert) -> ich möchte den Server als Autoren übernehmen
Fall 2: da Text markiert ist, ist ein Autor angegeben (weniger als 5 Zeichen), aber
Fall 2a: der Autor ist als Kürzel angegeben -> ich möchte dann gerne var author="''"+server+"''-Autor "+window.getSelection();
Fall 2b: der Autor ist mit vollständigem Namen angegeben -> ich möchte dann var author=window.getSelection();

Ich bin also bei folgender Überlegung gelandet:
if(window.getSelection()!='')
   {if(window.getSelection().length>5)
   {author=window.getSelection();}
   else{author="''"+server+"''-Autor "+window.getSelection();}
   ;}
   else{author=server;};

Trotz allen Überlegungen, dem ganzen Lesen und Recherchen, finde ich einfach nicht den Fehler.
Erstaunlicherweise reagiert das Skript immer wie folgt:
Fall 1: Wenn nix markiert ist, erhalte ich wie gewünscht: author=server
Aber: egal, ob wie lang der markierte Text ist, ich erhalte bei markiertem Text immer: ''server''-Autor author ... also genau das Verhalten, welches ich gern für eines Kürzels hätte ...
Erstaunlicherweise kann ich auch length>5 sogar length<5 machen und das Skript verhält sich identisch, was mich dazu bringt, dass ich irgend einen dämlichen Fehler gemacht habe.

Ich hoffe darauf, dass ich mein Anliegen verständlich rübergebracht habe und vllt. jemand eine Lösung oder einen Schubser für micht hat.

viele Grüße

Pietro

  1. Lieber Pietro,

    diese selection-Geschichte habe ich in ganz unguter Erinnerung... mächtig kompliziert - damals jedenfalls.

    {if(window.getSelection().length>5)

    Was genau liefert denn getSelection als Wert zurück? Und was genau bedeutet "length"? Die Anzahl an Zeichen? Oder die Anzahl an Elementen? Manchmal ist markierter Text ja über <em>ver<strong>schiedene</strong> Zei</em>chen verteilt...

    Vielleicht ist es sinnvoller den Rückgabewert von getSelection in einer Variable abzulegen, bevor man diese if-Statements notiert:

    var mySel = getSelection();  
      
    if (mySel && mySel.length > 5) { ... }
    

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. diese selection-Geschichte habe ich in ganz unguter Erinnerung... mächtig kompliziert - damals jedenfalls.

      {if(window.getSelection().length>5)

      Was genau liefert denn getSelection als Wert zurück? Und was genau bedeutet "length"? Die Anzahl an Zeichen? Oder die Anzahl an Elementen? Manchmal ist markierter Text ja über <em>ver<strong>schiedene</strong> Zei</em>chen verteilt...

      ... nach mehreren Tests: Es liefert exakt die Zeichenanzahl des Strings (wie erwartet) ... dummerweise scheint die If-Anweisung nicht darauf zu reagieren -> ich vermute daher irgendeinen dämlichen User-Fehler ... also eine Kleinigkeit, die ich übersehen haben ... wie beispielsweise eine Klammer oder ein Semikolon ... allerdings (egal, wie ich es mir anschaue: ich finde nix)

      Vielleicht ist es sinnvoller den Rückgabewert von getSelection in einer Variable abzulegen, bevor man diese if-Statements notiert:

      var mySel = getSelection();

      if (mySel && mySel.length > 5) { ... }

      ... da werde ich dann Morgen mal dran rumtesten ... echt frustierend, wenn solch eine vermeintliche Kleinigkeit nicht laufen will.  
        
      viele Grüße
      
  2. Mach doch mal eine Kontrollausgabe von window.getSelection().length und wenn das nicht erhellend ist, dann suche auf die Art weiter.

    Gewöhne Dir debuggen an.

    Und wenn Du Code postest, zumindest wenn er länger ist, dann zeichne ihn als solchen aus.

    1. Mach doch mal eine Kontrollausgabe von window.getSelection().length und wenn das nicht erhellend ist, dann suche auf die Art weiter.

      Eine Kontrollausgabe ergab, das tatsächlich (in einem Beispiel) zwar 49 Zeichen als Länge des Strings ausgegeben wurden, aber trotzdem die Bedingung "<5 Zeichen" ignoriert wurde.
      Das ist genau mein Problem: Die Kontroll-Ausgabe belegt, dass die Bedingung erfüllt ist, und trotzdem scheint JavaScript zur Else-Abzweigung zu wechseln.

      Und wenn Du Code postest, zumindest wenn er länger ist, dann zeichne ihn als solchen aus.

      ... werde ich künftig machen ... danke für den Hinweis

      1. Hallo,

        Eine Kontrollausgabe ergab, das tatsächlich (in einem Beispiel) zwar 49 Zeichen als Länge des Strings ausgegeben wurden, aber trotzdem die Bedingung "<5 Zeichen" ignoriert wurde.
        Das ist genau mein Problem: Die Kontroll-Ausgabe belegt, dass die Bedingung erfüllt ist, und trotzdem scheint JavaScript zur Else-Abzweigung zu wechseln.

        Jahaaa, weil Kontrollausgaben mit alert() das Selection-Objekt automatisch in einem String umwandeln, indem sie toString() aufrufen!

        So funktioniert JavaScript: Wenn der Kontext einen einfachen Wert (Primitive) erwartet, dann wird das Objekt in einen solchen umgewandelt. Dabei wird automatisch toString() aufgerufen, falls diese Methode existiert (wenn nicht, wird valueOf() probiert).

        Das kann man mit einem einfachen Objekt testen:

        var smiley = {  
          toString: function() {  
            return ":-)";  
          }  
        };  
          
        alert(smiley); // :-)  
        console.log(smiley); // Je nach Browser eine interaktive Repräsentation wie  
          // ▶ Object {toString: function}, oder [object Object],  
          // aber :-) wäre auch möglich
        

        Mit alert() und ähnlichem muss du also vorsichtig sein. Auch bei Operatoren, die Primitive-Operanden erwarten:

        console.log("The smiley object: " + smiley); // :-)

        Hier wird automatisch in String umgewandelt, weil der Operand links vom Operator ein String ist.

        Eigentlich ist das ein nützliches Feature von JavaScript, aber beim Debuggen muss man vorsichtig sein. Sofern man die Konsole-API (console.log und Freunde) verwendet, ist man in neueren Browsern eigentlich sicher. alert() eignet sich aus verschiedenen Gründen nicht gut zum Inspizieren von JavaScript-Werten.

        Wen die ECMAScript-Interna interessieren:
        ToString
        ToPrimitive
        [[DefaultValue]] (hint)

        Ferner:
        http://www.2ality.com/2012/03/converting-to-string.html
        http://www.2ality.com/2011/03/javascript-values-not-everything-is.html

        Mathias

        1. Meine Herren!

          Ferner:
          http://www.2ality.com/2012/03/converting-to-string.html
          http://www.2ality.com/2011/03/javascript-values-not-everything-is.html

          Für die lese-faulen werf ich mal noch dieses Video hinzu:
          http://www.2ality.com/2014/02/video-fake-operator-overloading.html

          Es geht dabei eigentlich nur oberflächlich um Operator-Überladung, und eigentlich viel mehr um die Interna von toString() und valueOf().

          --
          “All right, then, I'll go to hell.” – Huck Finn
  3. Meine Herren!

    Ich möchte gerne via JavaScript Daten zu einem Online-Artikel erfassen ... den Autor und den Server.

    Handelt es sich dabei um ein User-Skript? Also ein Skript, das nicht zu der Webseite gehört, sondern von dir im Kontext der Webseite ausgeführt wird? Zum Beispiel durch ein Bookmarklet oder Greasemonkey-Skript?

    Wieso kannst du den Autor nicht auf natürliche Art (zum Beispiel über DOM-Traversierung) ermitteln? Ich habe den Eindruck, du willst irgend einen Arbeitsvorgang automatisieren, da sind doch Benutzer-Eingaben nur hinderlich.

    --
    “All right, then, I'll go to hell.” – Huck Finn
    1. Handelt es sich dabei um ein User-Skript? Also ein Skript, das nicht zu der Webseite gehört, sondern von dir im Kontext der Webseite ausgeführt wird? Zum Beispiel durch ein Bookmarklet oder Greasemonkey-Skript?

      Ich möchte es für mich als Bookmarklet einbinden, um danach den Gesamt-String erstmals als Text, später in eine Datenbank übernehmen zu können.

      Wieso kannst du den Autor nicht auf natürliche Art (zum Beispiel über DOM-Traversierung) ermitteln? Ich habe den Eindruck, du willst irgend einen Arbeitsvorgang automatisieren, da sind doch Benutzer-Eingaben nur hinderlich.

      ... Ja, ich mag mir von JavaScript helfen lassen ... um jedoch so universell, wie möglich herangehen zu können, erscheint mir an dieser Stelle die "händische" Eingabe mit ggf. Korrektur über JavaScript die beste Vorgehensweise. Es gibt einfach zu viele unterschiedliche Verfahrensweisen, wie WebSite-Betreiber vorgehen.

      Ich möchte also innerhalb des Zielkorridors zugleich möglichst eng und flexibel sein.

      1. Meine Herren!

        Wieso kannst du den Autor nicht auf natürliche Art (zum Beispiel über DOM-Traversierung) ermitteln? Ich habe den Eindruck, du willst irgend einen Arbeitsvorgang automatisieren, da sind doch Benutzer-Eingaben nur hinderlich.

        Es gibt einfach zu viele unterschiedliche Verfahrensweisen, wie WebSite-Betreiber vorgehen.

        Plausibler und legitimer Grund. Ich habe gehofft, dass du nur für eine überschaubare Menge an Seiten berücksichtigen willst.

        --
        “All right, then, I'll go to hell.” – Huck Finn
  4. Hallo,

    getSelection gibt ein Selection-Objekt zurück. Das hat direkt keine Eigenschaft length. Du kannst aber explizit die Methode toString aufrufen, welche dir dann einen String zurückgibt, der bekanntlich eine length-Eigenschaft hat.

    Der Internet Explorer unterstützt getSelection übrigens erst auf Version 9. document.selection.createRange().text ist das Äquivalent zu document.getSelection().toString(), sofern ich mich richtig erinnere.

    Siehe meinen älteren Artikel zum Thema und die entsprechende Fähigkeitenerkennung im Script.

    Mathias

    1. Hallo,

      getSelection gibt ein Selection-Objekt zurück. Das hat direkt keine Eigenschaft length. Du kannst aber explizit die Methode toString aufrufen, welche dir dann einen String zurückgibt, der bekanntlich eine length-Eigenschaft hat.

      ... das hört sich nach einer möglichen Lösung an ... das werde ich heut Abend mal durchtesten.

      vielen Dank schon mal für den Hinweis :-)

    2. getSelection gibt ein Selection-Objekt zurück. Das hat direkt keine Eigenschaft length. Du kannst aber explizit die Methode toString aufrufen, welche dir dann einen String zurückgibt, der bekanntlich eine length-Eigenschaft hat.

      Besten Dank für den Hinweis ... vor allem auch langfristig hilfreich: In diese Richtung hätte ich nicht von allein nachgedacht.

      Der Internet Explorer unterstützt getSelection übrigens erst auf Version 9. document.selection.createRange().text ist das Äquivalent zu document.getSelection().toString(), sofern ich mich richtig erinnere.

      Das Skript ist nur für einen sehr überschaubaren Nutzerkreis, von denen Keiner MSIE nutzt ... auch danke für diesen Tipp.

      Siehe meinen älteren Artikel zum Thema und die entsprechende Fähigkeitenerkennung im Script.

      Interessante Texte hast Du da verlinkt, danke :-)

      Ich habe nun mal das Skript entsprechend umgestellt und nun läuft leider garnix mehr :-(

        
      var eingabe=window.getSelection().toString();  
      if(eingabe()!='')  
         {if(eingabe.length>5)  
            {author=eingabe;}  
            else{author="''"+server+"''-Autor "+eingabe;};}  
         else{author=server;};  
      
      

      üblicherweise nutze ich das Skript (bookmarklet-typisch) einzeilig:

        
      var eingabe=window.getSelection().toString(); if(eingabe()!='') {if(eingabe.length>5) {author=eingabe;} else{author="''"+server+"''-Autor "+eingabe;};} else{author=server;};  
      
      

      Jetzt produziert das Skript in allen Fällen:
      ''Server''-Autor Server
      ... egal, wie lang der markierte Text ist ... sogar ohne marktierten Text kommt es zu dem gennanten Ergebnis.
      Ich bin sehr erstaunt, ins Deutsche übersetzt, soll das Skript folgendes tun:

      Wenn eingabe nicht-gleich leer,  
         dann wenn eingabe-länge größer als 5,  
                 dann author gleich eingabe  
                 sonst author gleich ''server''-Autor eingabe  
         sonst author gleich server
      

      ... und zu allem Überfluss bricht das Skript danach ab, statt weiterzulaufen und weitere Parameter abzufragen. Ich bin inzwischen völlig ratlos, denn im FireBug habe ich keine Möglichkeit gefunden ein Bookmarklet prüfen zu lassen ... er will nur in HTML eingebettetes oder von HTML nachgeladenes JavaScript ... vllt. nervt mich dieses vermeintlich klitzekleine und banal wirkende Skript so sehr damit an, dass es nicht laufen will, das ich nur noch Tomaten auf den Augen und Rauch aus den Ohren habe :-(

      vllt hat ja einer hier noch eine Idee oder einen Schubser, in welche Richtung ist noch denken / forschen könnte. Das wäre echt super. Trotzdem schon mal allen, die sich bemüht haben, ein großes Dankeschön ... falls ich noch irgendwie zu einer Lösung komme, dann poste ich es natürlich hier.

      1. ... wußte ich es doch: Tomaten auf den Augen:

          
        var eingabe=window.getSelection().toString();  
        if(eingabe!='')  
           {if(eingabe.length>5)  
              {author=eingabe;}  
              else{author="''"+server+"''-Autor "+eingabe;};}  
           else{author=server;};
        

        Flasch war (in der 2. Zeile) "eingabe()" ... richtig ist "eingabe"

        ManManMan ... Danke Euch für Eure Anregungen und Euer Bemühen.

        Pietro