alfie: Variablenübergabe

Hallo!

Ich versuche gerade die Auswahl von BBCodes in 'mein kleines Forum' anzupassen.
Bisher generiert das PHP-Skript eine Reihe von Buttons, deren Beschriftung, Title-Attribut und BBCode (zB [b]foo[/b] für Ausgabe von <strong>foo</strong>) mittels JavaScript gesetzt wird.
Für Benutzer ohne JavaScript sind die Buttons daher funktionslos.
Die Idee ist also, die Buttons mittels JavaScript ins Dokument zu schreiben, oder bei deaktiviertem JavaScript eine Erklärung, wie die jeweiligen BBCodes manuell zu verwenden sind.

Ich habe folgenden Test gebastelt:

  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">  
  <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
    <meta http-equiv="Content-Script-Type" content="text/javascript" />  
    <script type="text/javascript">  
      /* <![CDATA[ */  
        function Test1() {  
          alert("Hello World!");  
          }  
        function Test2(text) {  
          if (lenght(text) >= 1)  
            {  
              alert("..." + text + "...");  
            }  
          else  
            {  
              alert("call containing no text");  
            }  
          }  
      /* ]]> */  
    </script>  
    <title>JavaScript from PHP</title>  
    <style type="text/css">  
      html, body { margin:0; }  
      body {  
        font-size:100.01%;  
        padding:7px;  
      }  
      h1 { font-size:1.1em; }  
      p, form {  
        padding:10px;  
        border:1px solid #000;  
      }  
    </style>  
  </head>  
  <body>  
    <h1>Paragraph (generated by PHP)</h1>  
    <?php  
      $JavaScript = '<script type="text/javascript">/* <![CDATA[ */document.write("<p>JavaScript active.</p>");/* ]]> */</script><noscript><p>JavaScript <strong>not</strong> active.</p></noscript>';  
      echo $JavaScript;  
    ?>  
    <h1>Form (generated by PHP)</h1>  
    <form id="Form" action="">  
    <?php  
      $JavaScript = '<script type="text/javascript">/* <![CDATA[ */document.write("<input type=\'button\' name=\'test1\' id=\'test1\' value=\'button 1\' title=\'information 1\' onclick=\'Test1();\' /><br />");/* ]]> */</script><noscript><p>JavaScript <strong>not</strong> active (#1).</p></noscript>';  
      echo $JavaScript;  
    ?>  
    <?php  
      $JavaScript = '<script type="text/javascript">/* <![CDATA[ */document.write("<input type=\'button\' name=\'test2\' id=\'test2\' value=\'button 2\' title=\'information 2\' onclick=\'Test2(\'Hello World!\');\' /><br />");/* ]]> */</script><noscript><p>JavaScript <strong>not</strong> active (#2).</p></noscript>';  
      echo $JavaScript;  
    ?>  
    </form>  
  </body>  
</html>  

Online hier zu finden.

Während der 1. Button (ohne Text-Übergabe) 'funktioniert', d.h. den Alert auslöst; geht der 2. (mit Text) in's Leere.
Aus den Fehlermeldungen werde ich leider nicht schlau.
JavaScript-Console: Fehler ''SyntaxError: syntax error'' [xs] in Datei ''http://www.maloer.org/jstest2.htm'', Zeile 1, Buchstabe 5.
IE: Zeile: 43, Zeichen: 1, Fehler: Syntaxfehler, Code: 0

Die gerenderten Skript-Bereiche sehen so aus:
Button 1:

  
<script type="text/javascript">  
  /* <![CDATA[ */  
    document.write("<input type='button' name='test1' id='test1' value='button 1' title='information 1' onclick='Test1();' /><br />");  
  /* ]]> */  
</script>  

Button 2:

  
<script type="text/javascript">  
  /* <![CDATA[ */  
    document.write("<input type='button' name='test2' id='test2' value='button 2' title='information 2' onclick='Test2('Hello World!');' /><br />");  
  /* ]]> */  
</script  

Aufgrund des Quellcodes denke ich, alle Backslashes korrekt für PHP maskiert zu haben; aber ich finde den Fehler bei der Übergabe des Strings an den JavaScript einfach nicht. ;-)

Irgendwelche Tipps eurerseits?

mfg Alfie

  1. Hellihello

    if (len_gh_t(text) >= 1)

    length??

    oder text.length??

    Gruß,

    frankx

    1. Hallo frankx!

      if (len_gh_t(text) >= 1)

      length??

      Herrje! Danke, aber das war's leider nicht...

      mfg Alfie

  2. Hellihello

    mein Tip: trenne PHP von JS für diese Frage:

    onclick='Test2('Hello World!');

    Du willst onclick="Test('Hallo World2')".

    Du hast: onclick='Test('Hallo World2')'

    Gruß,

    frankx

    1. Hallo frankx!

      mein Tip: trenne PHP von JS für diese Frage:
      onclick='Test2('Hello World!');
      Du willst onclick="Test('Hallo World2')".
      Du hast: onclick='Test('Hallo World2')'

      Jetzt verrenne ich mich in den Maskierungen...

      onclick="Test2('Hello World!');"
      liefert
      onclick="Test2('Hello World!');"
      was natürlich falsch ist & nicht funktioniert

      onclick="Test2('Hello World!');"
      bricht den PHP-Skript ab (auch klar)

      Verwirrend...

      1. Hellihello

        Hallo frankx!
        Jetzt verrenne ich mich in den Maskierungen...

        onclick="Test2('Hello World!');"

        nein, da fehlt "was", nämlich der umgebende Teil:

        '... onclick="...' liefert ".

        Viel "besser" vielleicht, im externen Script:

        window.onload=function () {
         meinKnopf=document.getElementById("meinKnopf");
         meinKnopf.onclick=function() {
          alert("hallo welt2");
         }
        }

        Gruß,

        frankx

        1. Hallo franxx!

          onclick="Test2('Hello World!');"

          nein, da fehlt "was", nämlich der umgebende Teil:

          '... onclick="...' liefert ".

          was meinst du mit "umgebender Teil"?

          Source
          onclick="Test2('Hello World!');"
          liefert
          onclick="Test2('Hello World!');"

          1. mir ist nicht klar, warum im HTML die Backslahes vor den Double-Quotes angezeigt werden
          2. erwarten würde ich ja:
          onclick="Test2('Hello World!');"

          Viel "besser" vielleicht, im externen Script:

          window.onload=function () {
          meinKnopf=document.getElementById("meinKnopf");
          meinKnopf.onclick=function() {
            alert("hallo welt2");
          }
          }

          Lieber nicht. Meine Versuche sollen ja später in's mkF eingebaut werden und ich habe keine Lust neben dem PHP-Skript auch noch im externen JavaScript 'herumzubasteln'.

          1. Hellihello

            Hallo franxx!

            onclick="Test2('Hello World!');"

            nein, da fehlt "was", nämlich der umgebende Teil:

            '... onclick="...' liefert ".

            was meinst du mit "umgebender Teil"?

            s. dedlfix: Das ist doch kein reines HTML, sondern entweder ein JS-writeln oder in PHP-echo. Also hast du außendrum nochmal Hochkommas, sind es einfache Hochkommas, unterdrücken sie das Escapen.

            Lieber nicht. Meine Versuche sollen ja später in's mkF eingebaut werden und ich habe keine Lust neben dem PHP-Skript auch noch im externen JavaScript 'herumzubasteln'.

            Oh, ich könnte vermuten, du hast somit am Ende mehr Arbeit.

            Gruß,

            frankx

            1. Hallo franxx!

              was meinst du mit "umgebender Teil"?

              s. dedlfix: Das ist doch kein reines HTML, sondern entweder ein JS-writeln oder in PHP-echo. Also hast du außendrum nochmal Hochkommas, sind es einfache Hochkommas, unterdrücken sie das Escapen.

              Ja, siehe meinen ersten Post.
              PHP echo schreibt JavaScript document.write, also

                
              <?php  
                $JavaScript = '<script type="text/javascript">/* <![CDATA[ */document.write("<input type=\'button\' name=\'test2\' id=\'test2\' value=\'button 2\' title=\'information 2\' onclick=\"Test2(\'Hello World!\');\" /><br />");/* ]]> */</script><noscript><p>JavaScript <strong>not</strong> active (#2).</p></noscript>';  
                echo $JavaScript;  
              ?>  
              
              

              mfg Alfie

              1. Hellihello

                $JavaScript = '...

                Nach einem einfachen Hochkomma ist kein Escapen mehr.

                echo '\\' gibt \\\

                Gruß,

                frankx

                1. Hellihello

                  $JavaScript = '...

                  Nach einem einfachen Hochkomma ist kein Escapen mehr.

                  ... möglich und nötig.

                  echo '"Hallo\\"' gibt "Hallo\\"

                  Gruß,

                  frankx

                  1. Hallo frankx!

                    $JavaScript = '...

                    Nach einem einfachen Hochkomma ist kein Escapen mehr.

                    ... möglich und nötig.

                    echo '"Hallo\\"' gibt "Hallo\\"

                    Ja, aber...
                    1. warum funktioniert das Escapen sonst auf meiner Beispielseite (im gerenderten HTML-Quelltext sind alle Backslashes entfernt)
                    2. gibt es das Problem (bei sonst identem Code) nur bei Button 2 (mit Variablen-Übergabe an den JavaScript), während Button 1 mit ...Test() anstandslos funktioniert?

                    mfg
                    Alfie

                    1. Hallo frankx!

                      P.S. unmaskiert

                        
                      <?php  
                        $JavaScript = '<script type="text/javascript">/* <![CDATA[ */document.write("<input type='button' name='test2' id='test2' value='button 2' title='information 2' onclick="Test2('Hello World');" /><br />");/* ]]> */</script><noscript><p>JavaScript <strong>not</strong> active (#2).</p></noscript>';  
                        echo $JavaScript;  
                      ?>  
                      
                      

                      gibt
                      Parse error: syntax error, unexpected T_STRING in /home/maloer/www.maloer.org/jstest5.htm on line 52

                      mfg Alfie

                      1. Hellihello

                        ja, denn

                        $JavaScript = '<script type="text/javascript">/* <![CDATA[ */document.write("<input type='<--- hier ist schluss mit lustig...;

                        Dank und Gruß,

                        frankx

                    2. Hellihello

                      Das versuchte ich mit der Trennung anzudeuten. Du musst ja doppelt escapen, einmal von PHP zu HTML, dort von JS zu HTML.

                      aus : onclick='Test2('Hello World!')

                      müsstest Du eigentlich im HTML-Quelltext wohl machen: onclick='Test2("Hello World2!"')

                      Um das Aber wiederum über PHP zu erzeugen, müsste es dort

                      $JS="...'Test2("Hello World2!"') heißen.

                      Dies Doppeltescaperei ersparst Du Dir m.M.N., indem Du JS dort definierst, wos hingehört, nämlich ins externe JS-Script.

                      1. gibt es das Problem (bei sonst identem Code) nur bei Button 2 (mit Variablen-Übergabe an den JavaScript), während Button 1 mit ...Test() anstandslos funktioniert?

                      Weil du dort nochmal Hochkommas intern verwenden musst ('Inhalt...') und onclick='machwas('wasdenn')' "funzt" net(;-);

                      Gruß,

                      frankx

                      1. Hallo frankx!

                        Das versuchte ich mit der Trennung anzudeuten. Du musst ja doppelt escapen, einmal von PHP zu HTML, dort von JS zu HTML.

                        Das war der letzte Hinweis ;-)

                        Hier die funktionierende Version

                          
                        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
                         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
                        <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">  
                          <head>  
                            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
                            <meta name="robots" content="noindex" />  
                            <meta http-equiv="Content-Script-Type" content="text/javascript" />  
                            <script type="text/javascript">  
                              /* <![CDATA[ */  
                                function Test1() {  
                                  alert("button no 1 clicked");  
                                  }  
                                function Test2(text) {  
                                  if (text.length >= 1)  
                                    {  
                                      alert(text);  
                                    }  
                                  else  
                                    {  
                                      alert("call containing no text");  
                                    }  
                                  }  
                              /* ]]> */  
                            </script>  
                            <title>JavaScript from PHP</title>  
                            <style type="text/css">  
                              html, body { margin:0; }  
                              body {  
                                font-size:100.01%;  
                                padding:7px;  
                              }  
                              h1 { font-size:1.1em; }  
                              p, form {  
                                padding:10px;  
                                border:1px solid #000;  
                              }  
                            </style>  
                          </head>  
                          <body>  
                            <h1>Paragraph (PHP &gt; JavaScript &gt; HTML)</h1>  
                            <?php  
                              $JavaScript = '<script type="text/javascript">/* <![CDATA[ */document.write("<p>JavaScript active.</p>");/* ]]> */</script><noscript><p>JavaScript <strong>not</strong> active.</p></noscript>';  
                              echo $JavaScript;  
                            ?>  
                            <h1>Form (plain HTML)</h1>  
                            <form id="Form1a" action="">  
                              <input type='button' name='test1a' id='test1a' value='button 1a' title='information 1' onclick="Test1();" /><br />  
                              <input type='button' name='test2a' id='test2a' value='button 2a' title='information 2' onclick="Test2('Hello World!');" /><br />  
                            </form>  
                            <h1>Form (JavaScript &gt; HTML)</h1>  
                            <form id="Form1b" action="">  
                              <script type="text/javascript">  
                                /* <![CDATA[ */  
                                  document.write("<input type='button' name='test1b' id='test1b' value='button 1b' title='information 1' onclick=\"Test1();\" /><br />");  
                                /* ]]> */  
                              </script>  
                              <noscript>  
                                <p>JavaScript <strong>not</strong> active (#1).</p>  
                              </noscript>  
                            <script type="text/javascript">  
                              /* <![CDATA[ */  
                                document.write("<input type='button' name='test2b' id='test2b' value='button 2b' title='information 2' onclick=\"Test2('Hello World!');\" /><br />");  
                              /* ]]> */  
                            </script>  
                            <noscript>  
                              <p>JavaScript <strong>not</strong> active (#2).</p>  
                            </noscript>  
                            </form>  
                            <h1>Form (PHP &gt; JavaScript &gt; HTML)</h1>  
                            <form id="Form2" action="">  
                            <?php  
                              $JavaScript = '<script type="text/javascript">/* <![CDATA[ */document.write("<input type=\'button\' name=\'test1\' id=\'test1\' value=\'button 1\' title=\'information 1\' onclick=\'Test1();\' /><br />");/* ]]> */</script><noscript><p>JavaScript <strong>not</strong> active (#1).</p></noscript>';  
                              echo $JavaScript;  
                            ?>  
                            <?php  
                              $JavaScript = '<script type="text/javascript">/* <![CDATA[ */document.write("<input type=\'button\' name=\'test2\' id=\'test2\' value=\'button 2\' title=\'information 2\' onclick=\"Test2(\'Hello World!\');\" /><br />");/* ]]> */</script><noscript><p>JavaScript <strong>not</strong> active (#2).</p></noscript>';  
                              echo $JavaScript;  
                            ?>  
                            </form>  
                          </body>  
                        </html>  
                        
                        

                        Dies Doppeltescaperei ersparst Du Dir m.M.N., indem Du JS dort definierst, wos hingehört, nämlich ins externe JS-Script.

                        Da hast ja recht, aber ich will es dabei belassen, neben einem 1000+ Zeilen PHP-Skript noch in einem 150+ Zeiler JavaScript - den ich noch viel weniger verstehe - herumzustochern.

                        Nocheinmal vielen Dank!

                        mfg Alfie

                        1. Hellihello alfi

                          Da hast ja recht, aber ich will es dabei belassen, neben einem 1000+ Zeilen PHP-Skript noch in einem 150+ Zeiler JavaScript

                          nein: 1000+ - 150+

                          »»- den ich noch viel weniger verstehe -

                          ja, das mag sein, das finde ich auch immer wieder gewöhnungsbedürftig. Der Witz ist aber, dass Du u.U. zb so

                          window.onload=function () {
                            meineBilder=document.getElementsByTagName("img");
                            for (i=0;i<meineBilder.length;i++) {
                              meinBilder[i].onlick=function() {
                              alert (this.src);
                             }
                            }
                          }

                          mit acht zeilen allen Bild-Elementen (in dem Fall) eine onclick-Funktion zuweisen kannst.

                          herumzustochern.

                          Das kann dann plötzlich (irgendwann) ziemlich übersichtlich werden.

                          Gruß,

                          frankx

      2. echo $begrüßung;

        Jetzt verrenne ich mich in den Maskierungen...
        Verwirrend...

        Dieses Problem löst man am besten von innen nach außen auf. Ganz innen hast du einen String. Der muss begrenzt werden und enthält möglicherweise Zeichen, die maskiert werden müssen. Du schaust dir also den String Zeichen für Zeichen an und setzt die Maskierungen so, wie sie der umgebende Kontext braucht. Nun geht es einen Kontext weiter nach außen, und für den ist es völlig uninteressant, warum die Zeichenfolge nun wie auch immer aussieht. Du betrachtest wieder Zeichen für Zeichen und setzt die entsprechenden Maskierungen gemäß dem umgebenden Kontext. Usw. usf.

        echo "$verabschiedung $name";

        1. Hallo dedlfix!

          Ja, du hast das sehr gut beschrieben.

          Aber was stimmt hier nicht?
          onclick="Test2('Hello World!');"

          zuerst wird
          'Hello World!' zu 'Hello World!'

          aber warum wird im nächsten Schritt
          onclick="Test2('Hello World!');" zu
          onclick="Test2('Hello World!');"

          und nicht zu
          onclick="Test2('Hello World!');"

          Still confused...

          mfg Alfie

          1. echo $begrüßung;

            Aber was stimmt hier nicht?
            onclick="Test2('Hello World!');"

            Das ist jetzt aber der umgekehrte Fall, also aus der Sicht des Ausführenden und nicht der des Programmierers.

            Dein Code-Fragment ist aus dem Zusammenhang gerissen. Man erkennt den Kontext nicht, in dem es steht.

            Angenommen, das sei ein Teil eines PHP-Strings, so muss das Fragment als Ganzes betrachtet werden. Dass da ein onclick-Attribut zu sehen ist, dessen Inhalt Javascript ist, ist für das PHP uninteressant. Es sieht einfach nur eine Folge von Zeichen.

            Weiterhin angenommen, der PHP-String ist mit ' eingefasst (single quoted), so gibt es nur zwei Sonderfälle: ' und \. Alle anderen Kombinationen, also auch ", werden als zwei eigenständige Zeichen interpretiert. Die " bleiben so wie sie sind, die ' werden zu einfachen '.

            echo "$verabschiedung $name";

            1. Hallo dedlfix!

              Aber was stimmt hier nicht?
              onclick="Test2('Hello World!');"
              Das ist jetzt aber der umgekehrte Fall, also aus der Sicht des Ausführenden und nicht der des Programmierers.
              Dein Code-Fragment ist aus dem Zusammenhang gerissen. Man erkennt den Kontext nicht, in dem es steht.

              Ja das stimmt; da ich aber der komplette Code (+ Link zur Ausgabe der gerenderten HTML-Seite) in meinem ersten Post enthalten war, habe ich angenommen, der Kontext ist klar. ;-)

              Angenommen, das sei ein Teil eines PHP-Strings, so muss das Fragment als Ganzes betrachtet werden. Dass da ein onclick-Attribut zu sehen ist, dessen Inhalt Javascript ist, ist für das PHP uninteressant. Es sieht einfach nur eine Folge von Zeichen.

              Das habe schön langsam auch ich begriffen...

              Weiterhin angenommen, der PHP-String ist mit ' eingefasst (single quoted), so gibt es nur zwei Sonderfälle: ' und \. Alle anderen Kombinationen, also auch ", werden als zwei eigenständige Zeichen interpretiert. Die " bleiben so wie sie sind, die ' werden zu einfachen '.

              Die 'working solution' ist hier zu finden.

              Danke auch für den Link; den Satz mit Arnold habe ich schon früher öfter gelesen.