shoper: html code in JS Variablen?! Code funktioniert nicht.

<html><body>
<form action="itemid.php" method="post">
 <select name="itemid" size="10" >
    <option value="1">wasser</option>
    <option value="2">erde</option>
    <option value="3">luft</option>
    <option value="4">feuer</option>

</select>

</form>

<script type="text/javascript">

for (var i = 0; i < document.forms[0].itemid.length; ++i)

var html1 = '<htm'
var html2 = 'l><bod'
var html3 = 'y><form target=/"shop/" action=/"/';'
var html = html1 + html2 + html3;
var url = '/meinscript.php?itemid=';
var itemid = document.forms[0].itemid.options[i].value;
var htmlend1 = 'method=/"post/">'
var htmlend2 = '<input type=/"submit/" name=/"submit/" value=/"neu/" id=/"x/">'
var htmlend3 = '<input type=/"hidden/" name=/"entry/" value=/"bla/"></form>'
var htmlend4 = '<iframe name=/"shop/">'
var htmlend5 = '<script>alert(12345);
var ende1 = '</scri'
var ende2 = 'pt></bod'
var ende3 = 'y></htm'
var ende4 = 'l>'
var ende = ende1 + ende2 + ende3 + ende4
var htmlgesamt = htmlend1+ htmlend2 + htmlend3 + htmlend4 + htmlend5
var code = html + url + itemid + htmlgesamt + ende;
var codezwischenspeicher = "" + codezwischenspeicher + code;

document.write(codezwischenspeicher);

</script>

</html></body>

Wo liegt der Fehler? Ich bekomm es einfach nicht hin!

  1. Mahlzeit,

    var html1 = '<htm'

    Wo ist das notwendige abschließende ";"?

    var html2 = 'l><bod'

    Wo ist das notwendige abschließende ";"?

    var html3 = 'y><form target=/"shop/" action=/"/';'

    Was sollen die "/"?

    var htmlend1 = 'method=/"post/">'

    Wo ist das notwendige abschließende ";"?

    var htmlend2 = '<input type=/"submit/" name=/"submit/" value=/"neu/" id=/"x/">'

    Wo ist das notwendige abschließende ";"?

    var htmlend3 = '<input type=/"hidden/" name=/"entry/" value=/"bla/"></form>'

    Wo ist das notwendige abschließende ";"?

    var htmlend4 = '<iframe name=/"shop/">'

    Wo ist das notwendige abschließende ";"?

    var htmlend5 = '<script>alert(12345);

    Wo hört der String auf? Ich sehe kein begrenzendes "'" ...

    var ende1 = '</scri'

    Wo ist das notwendige abschließende ";"?

    var ende2 = 'pt></bod'

    Wo ist das notwendige abschließende ";"?

    var ende3 = 'y></htm'

    Wo ist das notwendige abschließende ";"?

    var ende4 = 'l>'

    Wo ist das notwendige abschließende ";"?

    var ende = ende1 + ende2 + ende3 + ende4

    Wo ist das notwendige abschließende ";"?

    var htmlgesamt = htmlend1+ htmlend2 + htmlend3 + htmlend4 + htmlend5

    Wo ist das notwendige abschließende ";"?

    var codezwischenspeicher = "" + codezwischenspeicher + code;

    Was soll der leere String?

    Wo liegt der Fehler? Ich bekomm es einfach nicht hin!

    1. Was bekommst Du nicht hin?

    2. Was soll die merkwürdige Zerstückelung der Tags?

    3. Du weißt, dass sowohl <http://de.selfhtml.org/html/allgemein/grundgeruest.htm#html@title=<html>- als auch <body>-Tags> nur genau einmal vorkommen dürfen?

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Hi,

      var html1 = '<htm'
      Wo ist das notwendige abschließende ";"?

      Wie kommst Du darauf, daß es notwendig wäre?
      Es ist am Zeilenende nicht notwendig (darf aber angegeben werden).

      cu,
      Andreas

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

        var html1 = '<htm'
        Wo ist das notwendige abschließende ";"?

        Wie kommst Du darauf, daß es notwendig wäre?

        <http://de.selfhtml.org/javascript/sprache/regeln.htm#anweisungen@title=Das steht in SELFHTML>.

        Es ist am Zeilenende nicht notwendig (darf aber angegeben werden).

        Und sollte auch. Zumindest bin ich der Meinung. Und so weit ich weiß, bin ich nicht der Einzige. Immerhin erleichtert das die Übersichtlichkeit und Fehlersuche ungemein.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Hi,

          var html1 = '<htm'
          Wo ist das notwendige abschließende ";"?

          Wie kommst Du darauf, daß es notwendig wäre?

          <http://de.selfhtml.org/javascript/sprache/regeln.htm#anweisungen@title=Das steht in SELFHTML>.

          Zitat: Eine Anweisung in JavaScript besteht immer aus einem Befehl, der mit einem Strichpunkt ; oder einem Zeilenumbruch abgeschlossen wird.

          Strichpunkt _ODER_ Zeilenumbruch.

          Und sollte auch.

          Daß es sinnvoll ist, den ; zu setzen, ist ja richtig. Aber _notwendig_ ist es nicht.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. Hallo shoper!

    Zusätzlich zu EKKis Bemerkungen:

    var htmlend2 = '<input type=/"submit/" name=/"submit/" value=/"neu/" id=/"x/">'

    Einen String definierst Du zwischen sogenannten Delimitern (Begrenzungszeichen). Diese können einfache Anführungszeichen sein »'« oder doppelte »"« sein.

    Wenn Du Deinen String zwischen einfachen Anführungszeichen schreibst, brauchst Du darin die doppelten nicht mehr zu maskieren. Und wenn Du Deinen String in doppelten Anführungszeichen geschrieben hättest, wäre Deine Maskierungen falsch, denn escaped wird mit einem Backslash:

    var htmlend2 = "<input type="submit" name="submit" value="neu" id="x">";

    ^^ Hier muss maskiert werden, sonst würde der String hier:

    "<input type="

    aufhören, mit dem Rest kann JavaScript nichts anfangen und bricht mit einer Fehlermeldung ab.

    Viele Grüße aus Frankfurt/Main,
    Patrick

    --

    _ - jenseits vom delirium - _
    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
    Nichts ist unmöglich? Doch!
    Heute schon gegökt?
  3. Hallo,

    <script type="text/javascript">
    for (var i = 0; i < document.forms[0].itemid.length; ++i)

    var html1 = '<htm'

    [...]

    document.write(codezwischenspeicher);

    Wo liegt der Fehler? Ich bekomm es einfach nicht hin!

    zusätzlich zu dem, was EKKi bereits schrieb, solltest Du Dich über die Verwendung von Anweisungsblöckenn informieren.

    Freundliche Grüße

    Vinzenz

  4. Der Code soll mir für jede Variable in dem Selectbereich
    ein frame schreiben. Und diesen nachdem für alle selects ein
    frame generiert wurde in die html Datei schreiben.
    Nun wird mir aber durch den </script> Tag der in den frames steckt,
    der Code an der Stelle abgebrochen. Firefox zeigt mir den Code nach dem
    Tag als text an.

    <html><head><title>Test</title>
    </head><body>

    <form action="itemid.php" method="post">
     <select name="itemid" size="10" >
        <option value="1">wasser</option>
        <option value="2">erde</option>
        <option value="3">luft</option>
        <option value="4">feuer</option>
     </select>
    </form>

    <script type="text/javascript">

    for (var i = 0; i < document.forms[0].itemid.length; ++i)
    {
    var htmlstart = '<form target="itemfr" action="';
    var url = '/itemid.php?ud=';
    var itid = document.forms[0].itemid.options[i].value;
    var htmlend1 = '&st=0" method="post">';
    var htmlend2 = '<input type="submit" name="submit" value="neu" id="x">';
    var htmlend3 = '<input type="hidden" name="entry" value="bla">;
    var htmlend4 = '<script>alert(/'test/');</script></form>';
    var htmlend5 = '<iframe name="itemfr">';

    var htmlgesamt = htmlend1+ htmlend2 + htmlend3 + htmlend4 + htmlend5;
    var code = htmlst + url + itid + htmlgesamt;
    var codezwischenspeicher = "" + codezwischenspeicher + code;
    }

    document.write(codezwischenspeicher);
    </script>

    </body></html>

    Der Code soll mir für jede option select value ein Frame schreiben mit dem
    Inhalt:
    <form target="itemfr" action="/itemid.php?ud=ITEMID&st=0" method="post">
    <input type="submit" name="submit" value="neu" id="x">
    <input type="hidden" name="entry" value="bla">
    <script>alert('test');</script></form>
    <iframe name="itemfr">

    Und wenn für jede ItemId so ein Frame generiert wurde, soll
    er mir das in mein html Dokument schreiben.

    1. Mahlzeit,

      var htmlend4 = '<script>alert(/'test/');</script></form>';

      Warum escapest Du die ' dann nicht vernünftig mit je einem \ davor (wie Patrick auch beschrieb)?

      MfG,
      EKKi

      --
      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      1. Ahh, hatte nicht gesehen, dass ich die falschen slashs genutz habe.
        So, die Stelle hab ich nun geändert.
        Weiterhin nutze ich ja als Delimitern jetzt überall das einfache >'<
        und in der Varianblen >"< in den html tags.
        Denoch interpretiert er mir jetzt meinen code nur
        bis zu var htmlend4 = '<script>alert('test');</script>
        Alles danach wird nicht mehr im script, sondern als normaler Text angesehn.
        Wodran liegt das, bzw wie lässt sich das vermeiden?
        soll ich den teil doch in 2 vars speichern, so dass er erst script durchlaufen lassen muß, bevor es zu einem ganzen tag wird?

        <script type="text/javascript">

        for (var i = 0; i < document.forms[0].itemid.length; ++i)
        {
        var htmlstart = '<form target="itemfr" action="';
        var url = '/itemid.php?ud=';
        var itid = document.forms[0].itemid.options[i].value;
        var htmlend1 = '&st=0" method="post">';
        var htmlend2 = '<input type="submit" name="submit" value="neu" id="x">';
        var htmlend3 = '<input type="hidden" name="entry" value="bla">;
        var htmlend4 = '<script>alert('test');</script></form>';
        var htmlend5 = '<iframe name="itemfr">';

        var htmlgesamt = htmlend1+ htmlend2 + htmlend3 + htmlend4 + htmlend5;
        var code = htmlst + url + itid + htmlgesamt;
        var codezwischenspeicher = "" + codezwischenspeicher + code;
        }

        document.write(codezwischenspeicher);
        </script>

        1. Mahlzeit,

          Denoch interpretiert er mir jetzt meinen code nur
          bis zu var htmlend4 = '<script>alert('test');</script>

          Nutze doch bitte mal eine vernünftige Javascript-Fehlerkonsole (z.B. die von Firefox), dann wäre Dir nämlich aufgefallen, dass hier

          var htmlend3 = '<input type="hidden" name="entry" value="bla">;

          das ' am Ende des Strings fehlt.

          MfG,
          EKKi

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          1. Gut, ein Fehler behoben, jetzt sieht der Code wie folgt aus:

            <html><body>
            <form action="itemid.php" method="post">
             <select name="itemid" size="10" >
                <option value="1">wasser</option>
                <option value="2">erde</option>
                <option value="3">luft</option>
                <option value="4">feuer</option>

            </select>

            </form>

            <script type="text/javascript">

            for (var i = 0; i < document.forms[0].itemid.length; ++i)
            {
            var htmlstart = '<form target="itemfr" action="';
            var url = '/itemid.php?ud=';
            var itid = document.forms[0].itemid.options[i].value;
            var htmlend1 = '&st=0" method="post">';
            var htmlend2 = '<input type="submit" name="submit" value="neu" id="x">';
            var htmlend3 = '<input type="hidden" name="entry" value="bla">';
            var htmlend4 = '</form><script>alert('test')</script>';
            var htmlend5 = '<iframe name="itemfr">';

            var htmlgesamt = htmlend1+ htmlend2 + htmlend3 + htmlend4 + htmlend5;
            var code = htmlstart + url + itid + htmlgesamt;
            var codezwischenspeicher = "" + codezwischenspeicher + code;
            }
            document.write(codezwischenspeicher);
            </script>

            </body>
            </html>

            Allerdings wird auch immernoch ein Fehler ausgeworfen:

            Fehler: unterminated string literal
            Quelldatei: file:///C:/Dokumente%20und%20Einstellungen/icke/Desktop/test2.html
            Zeile: 25, Spalte: 15
            Quelltext:
            var htmlend4 = '</form><script>alert('23')
            Obwohl der </script> tag noch vor dem Delimiter kommt.

            Lasse ich den <script>alert('test')</script> weg, dann
            wird mir auch nur genau 1 iframe generiert.
            Wodran liegt das? Viele Fragen, aber ich versuchs immerhin
            mit testen und selber schreiben, statt mit Fragen ala wer schreibt mir das.

            Grüße

            1. Mahlzeit,

              <script type="text/javascript">

              for (var i = 0; i < document.forms[0].itemid.length; ++i)
              {
              var htmlstart = '<form target="itemfr" action="';
              var url = '/itemid.php?ud=';
              var itid = document.forms[0].itemid.options[i].value;
              var htmlend1 = '&st=0" method="post">';
              var htmlend2 = '<input type="submit" name="submit" value="neu" id="x">';
              var htmlend3 = '<input type="hidden" name="entry" value="bla">';
              var htmlend4 = '</form><script>alert('test')</script>';
              var htmlend5 = '<iframe name="itemfr">';

              var htmlgesamt = htmlend1+ htmlend2 + htmlend3 + htmlend4 + htmlend5;
              var code = htmlstart + url + itid + htmlgesamt;
              var codezwischenspeicher = "" + codezwischenspeicher + code;
              }
              document.write(codezwischenspeicher);
              </script>

              Mal ein paar prinzipielle Fragen:

              1. Warum initialisierst Du 11 Variablen (bei jedem Durchlauf der Schleife neu!), wo doch eine ausreichen würde?

              2. Warum meinst Du in Deiner erzeugten Ausgabe kein valides HTML ausgeben zu dürfen (nicht-geschlossene <iframe>s)?

              3. Wieso willst Du überhaupt MEHRERE <iframe>s ausgeben (wo doch anscheinend ALLE Formulare den gleichen <iframe> als "target" haben)?

                
              var select = document.getElementsByName('itemid')[0];  
                
              if (select) {  
                var html = '';  
                
                for (var i = 0; i < select.options.length; ++i) {  
                  html += '<form target="itemfr" action="/itemid.php?ud=';  
                  html += select.options[i].value;  
                  html += '<input type="submit" name="submit" value="neu" id="x';  
                  html += i; // Jede ID darf in einem HTML-Dokument nur genau EINMAL vorkommen!  
                  html += '"><input type="hidden" name="entry" value="bla"></form><script>alert(\'test\')<\/script>';  
                }  
                
                html += '<iframe name="itemfr"></iframe>';  
                
                document.write(html);  
              }  
              
              

              Allerdings wird auch immernoch ein Fehler ausgeworfen:

              Fehler: unterminated string literal
              Quelldatei: file:///C:/Dokumente%20und%20Einstellungen/icke/Desktop/test2.html
              Zeile: 25, Spalte: 15
              Quelltext:
              var htmlend4 = '</form><script>alert('23')
              Obwohl der </script> tag noch vor dem Delimiter kommt.

              Siehe hierzu MudGuards Beitrag.

              Lasse ich den <script>alert('test')</script> weg, dann
              wird mir auch nur genau 1 iframe generiert.

              Am unsauberen Pseudo-HTML-Müll, den Du erzeugst?

              MfG,
              EKKi

              --
              sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    2. Hi,

      Der Code soll mir für jede Variable in dem Selectbereich
      ein frame schreiben.

      Er schreibt aber nur einen halben iframe (das schließende Tag fehlt, der zweite iframe wäre dann im Alternativ-Inhalt des ersten, der dritte im zweiten usw.)

      Nun wird mir aber durch den </script> Tag der in den frames steckt,

      Natürlich. Ein Script-Bereich endet am ersten Vorkommen der Zeichen-Kombination </ - diese muß also unterbrochen werden, z.B. durch Escapen des /, also </

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.