hänger bei readystate 1

ruNN0r

Erfahrenes Mitglied
hi,
dieses Problem haben ja scheinbar schon viele gehabt doch irgendwie habe ich bis jetzt keine brauchbare Lösung für mich gefunden. Hoffentlich könnt ihr mir helfen.
Also mein script hängt sich einfach bei readyState 1 auf. Es läuft nicht weiter.
Hier mal die Schnipsel:

Ajax (ganze Datei):
HTML:
var resobjekt;
if(navigator.appName.search("Microsoft") > -1){
  resobjekt = new ActiveXObject("MSXML2.XMLHTTP");
}else{
  resobjekt = new XMLHttpRequest();
}
  function selectWert(sObj) {
    with (sObj) return options[selectedIndex].value;
  }
  function multipleWert(sObj, trenn) {
    var rVal = '';
    for (var i=0; i<sObj.options.length; i++) with (sObj.options[i])
      if (selected) rVal += trenn + value;
    return rVal.substring(trenn.length);
  }
function sndReq(id) {
  resobjekt.open('post', 'n/filme/editit.php' , true);
  resobjekt.onreadystatechange=handleResponse(id);
  resobjekt.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  resobjekt.send('titel=' + encodeURIComponent(document.edit[id].titel.value) +
                 '&subtitel=' + encodeURIComponent(document.edit[id].subtitel.value) +
                 '&nachfolger=' + encodeURIComponent(selectWert(document.edit[id].nachfolger)) +
                 '&medium=' + encodeURIComponent(selectWert(document.edit[id].medium)) +
                 '&med_anzahl=' + encodeURIComponent(document.edit[id].med_anzahl.value) +
                 '&art=' + encodeURIComponent(multipleWert(document.edit[id].art,',')) +
                 '&jahr=' + encodeURIComponent(document.edit[id].jahr.value) +
                 '&laenge=' + encodeURIComponent(document.edit[id].laenge.value) +
                 '&kopie=' + encodeURIComponent(document.edit[id].kopie.value) +
                 '&bewertung=' + encodeURIComponent(document.edit[id].bewertung.value)
                );
}
function handleResponse(e){
  if(resobjekt.readyState == 1){
    document.getElementById('ant_'+e).innerHTML = "<center>Loading...<br><img src='pics/design/load.gif'></center>";
  }else if(resobjekt.readyState == 2){
    document.getElementById('ant_'+e).innerHTML = "<center>Loaded...<br><img src='pics/design/load.gif'></center>";
  }else if(resobjekt.readyState == 3){
    document.getElementById('ant_'+e).innerHTML = "<center>interactive<br><img src='pics/design/load.gif'></center>";
  }else if(resobjekt.readyState == 4){
    document.getElementById('ant_'+e).innerHTML = resobjekt.responseText;
  }
}

Ausgangsdatei (gekürzt):
PHP:
<?php
  foreach($_POST['edit'] as $ed){
      $anfrage1=mysql_query("SELECT * FROM $_db_filme WHERE film_id='$ed'");
      $row1=mysql_fetch_array($anfrage1);

      echo"
          <div id='ant_".$row1['film_id']."'>
            <form action=\"javascript: sndReq('".$row1['film_id']."')\" method='post' name=\"edit['".$row1['film_id']."']\">

BLA BLA BLA ich denke hier ist nichts relevantes wenn ihr es trotz allem braucht poste ich auch dies.
            </form>
          </div>
      ";
  }
?>
Die Ausgangs Datei ist zur Editierung mehrerer Datensätze Gedacht. Wenn ich auf den Button Klicke startet das sndReq() und der Datensatz wird geändert (so die Theorie).

Ausgabe (editit.php, ganze Datei):
PHP:
<?php
  echo"
    Test:
    <br>
      ".$_POST['titel']."
  ";
?>
Nicht sehr spannend wie man sieht ^^ Die ist aktuell ja auch nur zum Testen... ob alles ankommt was ich sende. Aber bei readyState 1 geht es nicht weiter. in dem DIV steht Loading (wie ich es festgelegt habe) und es passiert nichts... nichtmal nach einer Zigarettenpause ist was passiert.
Ich finde den Fehler einfach nicht! Hoffentlich könnt ihr mir helfen. Danke euch!
 
:(:(:(
Code:
resobjekt.onreadystatechange=handleResponse(id);
:):):)
Code:
var _id=id;
resobjekt.onreadystatechange=function(){handleResponse(_id);}
 
------
hmmm also eine Veränderung hat es bewirkt ^^
Jedoch leider keine gewünschte :(
Nun wenn ich auf meinen Button Klicke passiert nichts!
der Zeite klick wird angenommen... jedoch passiert dort das gleiche wie vorher ...
-----
Das obere lasse ich mal stehen aber ich denke ich habe den Fehler gefunden!
aber Wollmaus: Das hat mich schonmal weitergebracht.
Folgendes war Falsch: document.edit[id].titel.value
den hat der nicht erkannt. weil ich den Formnamen so eingegeben habe: name="edit[".$_row1['film_id']."]"
anders habe ich es leider nicht hin bekommen also habe ich dem Form nun eine ID gegeben und lese die ID aus.
PHP:
  <form id=\"edit_".$row1['film_id']."\" action=\"javascript: sndReq('".$row1['film_id']."')\" method='post'>
  //und so im Ajax:
  'titel=' + encodeURIComponent(document.getElementById('edit_'+id).titel.value)
Nun funktioniert es mit einem Wert im Send... mit zwei werten passiert wieder nichts... vielleicht finde ich den Fehler ja noch.! Danke erstmal
 
Zuletzt bearbeitet:
hi nochmal!
Hat nun geklappt. hab den Fehler gefunden!
Jedoch gibt es nun noch eine kleinigkeit die ich gerne weg hätte ^^
Es wird alles übertragen und das Div wird auch geändert.
Jedoch wenn ich nun mehrere Divs habe z.B.
ant_1
ant_2
ant_3
...
und ändere den 2ten (ant_2) klappt das! wenn ich nun ant_1 oder ant_3 ändere ändert sich ant_2 auch. Es sieht so aus als würde der dann bis rdy readystate 1 arbeiten und somit steht dann dort loading...[Bild].

hier mal meine Aktuelle Ajaxdatei:
HTML:
var resobjekt;
if(navigator.appName.search("Microsoft") > -1){
  resobjekt = new ActiveXObject("MSXML2.XMLHTTP");
}else{
  resobjekt = new XMLHttpRequest();
}
  function selectWert(sObj) {
    with (sObj) return options[selectedIndex].value;
  }
  function multipleWert(sObj, trenn) {
    var rVal = '';
    for (var i=0; i<sObj.options.length; i++) with (sObj.options[i])
      if (selected) rVal += trenn + value;
    return rVal.substring(trenn.length);
  }
function sndReq(id) {
  var _id=id;
  resobjekt.open('post', 'ajax/editit.php' , true);
  resobjekt.onreadystatechange=function(){handleResponse(_id);}
  resobjekt.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  resobjekt.send('titel=' + encodeURIComponent(document.getElementById('edit_'+id).titel.value) +
                 '&subt=' + encodeURIComponent(document.getElementById('edit_'+id).subtitle.value) +
                 '&nachfolger=' + encodeURIComponent(selectWert(document.getElementById('edit_'+id).nachfolger)) +
                 '&medium=' + encodeURIComponent(selectWert(document.getElementById('edit_'+id).medium)) +
                 '&med_anzahl=' + encodeURIComponent(document.getElementById('edit_'+id).med_anz.value) +
                 '&art=' + encodeURIComponent(multipleWert(document.getElementById('edit_'+id).art , ',')) +
                 '&jahr=' + encodeURIComponent(document.getElementById('edit_'+id).jahr.value) +
                 '&laenge=' + encodeURIComponent(document.getElementById('edit_'+id).laenge.value) +
                 '&kopie=' + encodeURIComponent(document.getElementById('edit_'+id).kopie.value) +
                 '&fsk=' + encodeURIComponent(selectWert(document.getElementById('edit_'+id).fsk))+
                 '&bew=' + encodeURIComponent(selectWert(document.getElementById('edit_'+id).bewertung))+
                 '&edit_id=' + encodeURIComponent(id)
                );
}
function handleResponse(e){
  if(resobjekt.readyState == 1){
    document.getElementById('ant_'+e).innerHTML = "<center>Loading...<br><img src='pics/design/rs33.png'></center>";
  }else if(resobjekt.readyState == 2){
    document.getElementById('ant_'+e).innerHTML = "<center>Loaded...<br><img src='pics/design/rs66.png'></center>";
  }else if(resobjekt.readyState == 3){
    document.getElementById('ant_'+e).innerHTML = "<center>interactive<br><img src='pics/design/rs99.png'></center>";
  }else if(resobjekt.readyState == 4){
    document.getElementById('ant_'+e).innerHTML = resobjekt.responseText;
  }
}
Ein alert(e); im if(resobjekt.readyState == 1){} hat gezeigt das die vorherige Variable (z.B. 1) nochmal gesendet wird! Aber woher kommt die?
 
Zuletzt bearbeitet:
Hi,

was meinst du mit "... funktioniert es mit einem Wert im Send... mit zwei werten passiert wieder nichts ..."?

Folgendes Beispiel, reduziert auf zwei übermittelte Werte, funktioniert bei mir tadellos:
Code:
<html>
<head>
<title>www.tutorials.de</title>
<meta name="author" content="Quaese">
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
  <!--
var resobjekt;
// Funktion zum Erstellen eines XHR-Objektes
function createXHR(){
  if(navigator.appName.search("Microsoft") > -1){
    resobjekt = new ActiveXObject("MSXML2.XMLHTTP");
  }else{
    resobjekt = new XMLHttpRequest();
  }
}

function selectWert(sObj) {
  with (sObj) return options[selectedIndex].value;
}
function multipleWert(sObj, trenn) {
  var rVal = '';
  for (var i=0; i<sObj.options.length; i++) with (sObj.options[i])
    if (selected) rVal += trenn + value;
  return rVal.substring(trenn.length);
}

function sndReq(id) {
  // Neues XHR-Objekt erstellen
  createXHR();

  resobjekt.open('post', 'n/filme/editit.php', true);
  resobjekt.onreadystatechange=function(){
  	handleResponse(id);
  };
  resobjekt.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

  resobjekt.send('titel=' + encodeURIComponent(document.getElementById('edit_'+id).titel.value) +
                 '&subtitel=' + encodeURIComponent(document.getElementById('edit_'+id).subtitel.value)
                );
}
function handleResponse(e){
  if(resobjekt.readyState == 1){
    document.getElementById('ant_'+e).innerHTML = "<center>Loading...<br><img src='pics/design/load.gif'></center>";
  }else if(resobjekt.readyState == 2){
    document.getElementById('ant_'+e).innerHTML = "<center>Loaded...<br><img src='pics/design/load.gif'></center>";
  }else if(resobjekt.readyState == 3){
    document.getElementById('ant_'+e).innerHTML = "<center>interactive<br><img src='pics/design/load.gif'></center>";
  }else if(resobjekt.readyState == 4){
    document.getElementById('ant_'+e).innerHTML = resobjekt.responseText;
  }
}
 //-->
</script>
</head>
<body>
<?php
// Testarray
$row1[0]['film_id'] = "id_01";
$row1[1]['film_id'] = "id_02";
$row1[2]['film_id'] = "id_03";

  foreach($row1 as $array){
      echo"
          <div id='ant_".$array['film_id']."'>
            <form action=\"javascript: sndReq('".$array['film_id']."');\" method='post' id=\"edit_".$array['film_id']."\" name=\"edit['".$array['film_id']."']\">
              <input type=\"text\" name=\"titel\" value=\"titel__".$array['film_id']."\" />
              <input type=\"text\" name=\"subtitel\" value=\"subtitel__".$array['film_id']."\" />
              <input type=\"submit\" name=\"cmdSubmit\" value=\"Senden\" />
            </form>
          </div>
      ";
  }
?>
</body>
</html>
Problematisch wird es mit deinem Code lediglich, wenn du ein zweites Formular sendest. Dann besitzt im Augenblick des Sendens die ID den Wert des vorangegangenen Requests und das Load-Bild wird eingeblendet.
Um das Verhalten zu ändern kannst du wie im obigen Code das XHR-Objekt erst beim Anstossen des Requests erstellen.

Ciao
Quaese
 
hi,
wie oben schon geschrieben hat sich das Problem erledigt... war ein doofer fehler von mir!
Aber erstmal danke. Das mit dem XHR Objekt hat super Funktioniert! So ganz habe ich noch nicht verstanden wie das mit der ID da zusammen hängt aber ich denke da komme ich noch hinter. Aber vielen Dank für deine Hilfe funktioniert wie gewünscht!
 
Zurück