AJAX liefert html und Javascript zurück und das JS soll sofort ausgeführt werden.

TuxCommander

Mitglied
Hallo zusammen :)

also ich hab eine html Seite (mit PHP generiert) welche beim Body onLoad ein http Request absetzt. (wieder auf PHP Script.)

Das funktioniert auch alles sehr gut und ich bekomme den geforderten html und Javascript Code auch zurück geliefert.

Der Code wird auch per innerHTML in das von mir gewünschte <div> geschrieben.
=ABER=

Der angeforderte JS-Code muss noch selbst einmal von JS ausgeführt werden.
Der dafür benötigte befehl ist innerhalb des per AJAX angeforderten html Code und genau da liegt IMHO das Problem.

Ich habe schon hier im Board geschaut und jemand hatte ein ähnliches Problem und sagte amEnde etwas von "onComplete".
Ich konnte jetzt aber aus dem Kontext heraus, und auch unter Zuhilfenahme von google nicht erkennen wie oder ob mir das helfen könnte.

Was muss ich tun damit der JS Befehl ausgeführt wird?

mfg Sebastian
 
Das Problem hatte ich auch, ich glaube die Person mit dem Problem war auch ich ;), das liegt an folgendem... du kannst keine <script> container mehr ausführen in Dateien, die per AJAX in ein div geladen wird. Das wurde alles bereits abgeschlossen, wird also quasi einfach ignoriert.

Du kannst diverse Sachen noch initiieren indem du über den Parameter OnComplete eine Funktion aufrufst, die dann diverse Dinge initiiert. (Das ist sehr einfach zu machen mit Prototype.js, ist zu empfehlen)

Bsp:

Code:
new Ajax.Updater(element, 'ajax.php?action=' + action + param, { asynchronous:true, onComplete: function(){ doinplace(param,userid); }});

doinplace ist hierbei eine von mir erstellte JavaScript-Funktion, die bei mir InPlace-Editing Felder initiierte.

Gruß,
Chris
 
Zuletzt bearbeitet:
Das ist nicht so ganz einfach...da man den JS Code nicht per eval() ausführen kann, weil er auch HTML-Code beinhaltet.

Hier mal nen Workaround:
Code:
<html>
<head>
<title>Test</title>
<script type="text/javascript">
<!--
String.prototype.eval_js=function()
{
  d=document.createElement('div');
  d.innerHTML=this;
  c='';
  for(s=0;s<d.getElementsByTagName('script').length;++s)
    {
      c+=d.getElementsByTagName('script')[s].innerHTML;
    }
  eval(c);
  delete d;
}

//-->
</script>
</head>
<body><input type="button" value="myeval" onclick="String(document.getElementsByTagName('body')[0].innerHTML).eval_js()">
<script type="text/javascript">

function funktion()
{
  return 'Moin - Moin'
}

  alert(funktion());

</script>
</body>
</html>

Die Sache erweitert das String-Objekt um die Methode "eval_js()".
Was macht die Methode?
Sie sucht nach <script>-Elementen in der Zeichenkette, extrahiert ihren Inhalt und führt diesen aus. Diese Methode müsstest du dann halt auf den responseText deines Requests anwenden.


Ist nur ein Vorschlag...vielleicht hat ja noch wer bessere Ideen
 
Danke euch beiden :)

@Chris danke für deinen Beitrag hat bei mir leider nicht funktioniert...

@Sven deine Antwort is genau das wa ich brauchte :)
werde zwar noch etwas basteln müssen aber ist schonmal echt super *händeklatsch*
 
Hallo ich weiß die Antwort kommt spät aber, sie kommt!

Sven's Code war/ist genau der den ich gesucht habe :)
funktioniert bestens !

Vielen Dank
und bis zum nächsten mal.
 
Hi Sven,

vielen Dank für den Workaround! Im Forefox funktioniert es, aber im MSIE leider nicht. Der MSIE beschwert sich über das eval(c); ...die MSIE Developer Toolbar liefert dazu leider keine weitere Meldung, ausser dass das eval(c) im Debugger gelb markiert wird.

Er sagt einfach nur "Syntaxfehler". Die JavaScript-Codes in dem String sind allerdings frei von Syntaxfehlern, und wenn ich sie "hart" in den Quelltext einbaue laufen sie auch im MSIE.

Hast Du noch eine Idee wie man das ganze auch im MSIE zum laufen bringen könnte?

Besten Dank!

Gruß
Laura
 
Hi,

ich hab etwas mit dem Script von Sven experimentiert, mit folgendem Ergebnis:

Der IE hat offensichtlich nur dann Probleme, wenn der zurückkommende String mit einem script-Tag beginnt. In diesem Fall ist die innerHTML-Eigenschaft des Hilf-DIVs leer.

Als Lösung habe ich einfach ein br-Element an den Anfang des Hilfselements gesetzt und es hat zumindest in meinen Tests (IE6 und IE7) funktioniert.
Code:
<script type="text/javascript">
<!--
String.prototype.eval_js=function()
{
  d=document.createElement('div');
  var objDummy = document.createElement("br");
  d.appendChild(objDummy);

  d.innerHTML += this;
  c='';
  for(s=0;s<d.getElementsByTagName('script').length;++s)
    {
      c+=d.getElementsByTagName('script')[s].innerHTML;
    }
  eval(c);
  delete d;
}
//-->
</script>
Ciao
Quase
 
Hallo

kann mir jemand sagen, wie ich dieses eval hier in diesem Beispiel einbinde?

Ich versteh das ganze nicht und sollte dringed eine Lösung haben.

grüsse
 
Hi,

mit eval_js wird das String-Objekt durch eine Methode erweitert. Als solche wird diese auf Zeichenketten angewendet.

Ist in deinem Beispiel die JS-Anweisung, die ausgeführt werden soll, in der Eigenschaft responseText enthalten, sollte folgender Aufruf weiterhelfen.
Code:
// Quelle: http://www.w3schools.com/PHP/php_ajax_database.asp
function stateChanged(){ 
  if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete"){ 
   xmlHttp.responseText.eval_js();
  } 
}
Vielleicht hilft dir das weiter.

Ciao
Quaese
 
Hallo

mitlerweile bin ich auch schon weitergekommen. es lag an dem html und zusätzlich noch an einem falschen pfad.

nun habe ich aber noch eine Frage:



Ich habe dieses Formular: => siehe Anhang.



in der combobox kann ich adressen wählen. wie kann ich diese texte nun
mit ajax in die textboxen unterhalb schreiben?

da ich ja eine seperate datei habe, die mir die ausgabe macht, kann
ich es bis jetzt nur neu einblenden lassen, das heisst z.B ein neuer
table, dann schiebt es mir aber das ganze form nach unten.



grüsse
 

Anhänge

  • form.jpg
    form.jpg
    17,4 KB · Aufrufe: 40

Neue Beiträge

Zurück