• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

xhtml-request im Formular

ZENeca

New member
Hallo allerseits,

bin mir nicht sicher, ob das hier überhaupt noch jemand liest,
aber ich finde jetzt auch keine wirkliches Alternativ-Forum
oder hätte dazu jemand einen Tip?

wie auch immer
Mein Problem ist eigentlich eher allgemeiner Art,
ich habe innerhalb eines Formular (method=POST)
einen XHTML request und es scheint, daß dieser Request letztlich nur das Formular-submit auslöst
und nicht das tut für was es programmiert wurde.
Ich frage mich warum das so ist bzw. ob mir da ein grundsätzlicher Verständnis fehlt,
denn eigentlich möchte ich mit dem Request nur eine prompt-abfrage erzeugen
die im Hintergrund (php-) SESSION-Variablen setzten soll.

im Speziellen:

html-teil:

Code:
<form enctype="application/x-www-form-urlencoded"  name="AddNote_" action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
  <button onclick="call_db('cmd=2');">call-db</button>
<form>

java-script:
Code:
function call_db(paras) { // diese Funktion ruft am Ende get_data() als Callback-Funkton auf
  try {  //erstellen des requests
    req = new XMLHttpRequest();
  }
  catch (e) {
    try {
      req = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e) {
      try {
        req = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (failed) {
        req = null;
      }
    }
  }
  if (req == null)  alert("Error creating request object!");
  req.open("GET", "./hidden_access.php?"+paras, true);
  req.onreadystatechange = get_data;    // call-back   (s. nächste Fnkt) 
  req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  req.send(null);
}
function get_data() {  // ist die callback-Funktion von call_db() 
  switch (req.readyState) {
    case 4: if (req.status != 200) {  } 
            else {    //antwort des servers                                                                  
              if (req.responseText != '')
                var dataset = eval('('+req.responseText+')'); // hier kommen die Daten (Antwort) als json-string an
              switch (dataset.cmd)  {
                case  2: call_db('cmd=3&ans='+prompt(dataset.quest)); break;
                case  3: if (dataset.bin == 0 && dataset.ans != 'null') call_db('cmd=3&ans='+prompt(dataset.quest)); break;
              }                       
            }
    break;
    default: return false;
    break;
  }
}

php (hidden_access.php) eigentlich nicht wichtig, da er bis dahin gar nicht mehr kommt,
bei der Netzwerkanalyse heißt es: NS_BINDING_ABORTED und danach kommt der (POST) submit

Code:
switch ((int)$_GET['cmd'])  {
    case 2:  // human request Frage stellen
        $_SESSION['frage'] = 'gegenteil von warm';
        $_SESSION['antwort'] = 'kalt';
        print(trim(json_encode(array("cmd" => 2, "quest" => $_SESSION['frage']))));
    break;
    case 3:  // human request  // Antwort prüfen
        $answer_giv = strtolower(preg_replace('/[^0-9A-Za-zäüöÄÜÖ]/', '', $_GET['ans'])); 
        if ($answer_giv == $_SESSION['antwort'] && $_SESSION['antwort'] != '')  {
          $_SESSION['human'] = true;
          print(trim(json_encode(array("cmd" => 3, "bin" => 1))));
        }
        else if ($_GET['ans'] == '')  {  // abbruch
          $_SESSION['human'] = false;
          print(trim(json_encode(array("cmd" => 3, "quest" => $_SESSION['frage'], "ans" => $answer_giv, "antwort" => 'falsch', "bin" => 0))));
        }
        else  {
          $_SESSION['human'] = false;
          print(trim(json_encode(array("cmd" => 3, "bin" => 2))));
        }
    break;
}

wie gesagt, ich würde erst mal einf gerne verstehen warum mit dem XHR ein Submit ausgeführt wird
und noch schöner wäre es, wenn ich einen Tip bekäme wie das und der NS_BINDING_ABORTED zu verhindern wäre?

vielen Dank
Zen
 
Hi,
doch, ich lese schon mit, aber die Webforen sind, wenn es nicht gerade die großen sind, eher vereinsamt. Leider.

Zu deiner Frage:

Dein Problem liegt hauptsächlich an der onclick-Eigenschaft des Buttons im Formular. Standardmäßig lösen <button>-Elemente innerhalb eines <form>-Elements einen Submit aus, es sei denn, man verhindert das explizit.

Der Button hat kein type="button", daher wird er als submit-Button interpretiert. Das bedeutet:
• Der Klick auf den Button führt dazu, dass das Formular gesendet wird.
• Dein call_db('cmd=2'); wird zwar ausgeführt, aber gleichzeitig wird das Formular abgeschickt, was deine XHR-Anfrage möglicherweise unterbricht.

Lösung: Prevent Default oder Button-Typ ändern
Es gibt zwei einfache Lösungen:
Möglichkeit 1: type="button" hinzufügen
HTML:
<form enctype="application/x-www-form-urlencoded" name="AddNote_" action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
  <button type="button" onclick="call_db('cmd=2');">call-db</button>
</form>

Möglichkeit 2: event.preventDefault() verwenden
Falls du type="button" nicht verwenden möchtest, kannst du das Standardverhalten von <button> mit event.preventDefault() unterdrücken:
HTML:
<button onclick="event.preventDefault(); call_db('cmd=2');">call-db</button>

Das sorgt dafür, dass das Formular nicht gesendet wird, aber dein call_db() weiterhin ausgeführt wird.
 
Hai mo,

vielen Dank für deine Antwort.
Ja, im Prinzip macht es ja auch Sinn, wenn sich ein Forum durchsetzt, dann zerstreuen sich die Experten ja auch nicht so arg
aber ich habe ja praktisch überhaupt keins mehr gefunden
hast du da eine gute Adresse?
früher war ich gelegentlich auch im XHTML-Forum, das fand ich auch recht gut,
aber der hat ja auch die Schotten dicht gemacht :eek:(
Dann habe ich noch das html.de gefunden, aber da hatte ich hier schon meine Frage gestellt
und nachdem der view-Zähler ja ein bisschen geklettert ist
wollte ich euch/dir schon ein paar Tage die Chance geben zu antworten
bevor ich es bei html.de (natürlich mit dem Hinweis auf mein Thread hier) noch mal probiere

so, jetzt zum eigentlichen Thema.
ob da noch der type explizit aufgeführt ist hätte für mich für mich keine Rolle gespielt
...oder warum könnte das zu einem Problem werden?
wie auch immer, beide Varianten haben funktioniert,
nur, daß meine Fragmente hier schon sehr eingedampft waren
eigentlich ist das onklick in einem <input type="imgage" .... > und da hat auch dein Vorschlag
mit dem preventDefault nicht geklappt...weil es vermutlich "defaulter" auch nicht werden kann ;-)
aber das eigentlich Problem hast du mir verdeutlicht, so habe ich es einfach in ein <img ....> umgewandelt...und siehe da...
mal schauen, ob es deshalb noch andere Probleme gibt, aber ich wüsste nicht warum

vielen Dank für die Hilfe und daß du dir am Sonntag die Zeit für mich genommen hast ♥

gruß
Zen // catal0g.de
 
  • Like
Reaktionen: mo
Zurück
Oben