neue Javascript Funktionen mittels AJAX

AMoKx666

Mitglied
Hallo,
Weiss jemand, wie ich mittels AJAX neue Javascript Funktionen in eine Seite einbauen kann und der Browser diese dann auch kennt ?
ich bekomme eine komplette HTML-Seite geschickt, in der neue Javascript Funktionen enthalten sind. Wenn ich nun eine dieser Funktionen ausführen möchte, bekomme ich einen von der Fehlerkonsole einen netten Hinweis darauf, dass diese Funktion nicht definiert ist. Hinzu kommt noch, dass ich nicht weiss, um welche Funktion es sich handelt. Die Funktionen können also von Request zu Request verschieden sein.
 
Könntest du das bitte etwas näher ausführen?

Du bekommst eine HTML-Seite von wem geschickt...wie ist das zu verstehen?
Wie versuchst du denn, den Inhalt dieser Seite mit der aktuellen Seite zusammenzuführen?

Und diese unbekannten Funktionen...sind das eine oder mehrere, poste mal den Quellcode einer solchen "zugeschickten" Seite.
 
Ein Servlet schickt mir eine dynamisch erzeugt HTML Seite. eingefügt wird das ganze über innerHTML.
hier mal meine Funktion, die den Inhalt einpflegt:

Code:
function setContent() 
{
	if (http_request.readyState == 4) 
	{
		if (http_request.status == 200) 
		{
			var outnode = parent.servlet.document.getElementsByTagName("body")[0];
			var pagecontent = http_request.responseXML.getElementsByTagName("content")[0];
			
			//ist dafür da, die aktuelle Anzeige komplett zu löschen								
			if(pagecontent.getAttribute("action",0) == "clear")
			{
				outnode.innerHTML = "";
			}
						
			var text = http_request.responseText;
			
			//getindex ist eine kleine Parserfunktion von mir, die den Index eines bestimmten Zeichens in einem String ermittelt
			var htmlbegin = getindex(text , '>', 'f', 3);
			var htmlend = getindex(text , '<', 'b', 2);
						
			if(htmlbegin != -1 && htmlend != -1)
			{
				var tmp = text.slice(htmlbegin,htmlend);
				
				outnode.innerHTML = outnode.innerHTML + tmp;
				//hier beginnt der Versuch die Funktionen dem Browser irgendwie bekannt zu machen
var h = parent.servlet.document.getElementsByTagName("head")[0];
				var s = parent.servlet.document.createElement('script');
				s.setAttribute('type','text/javascript');
				s.text = "";
				
				var a = pagecontent.getElementsByTagName('script');
				for(var i = 0; i < a.length; ++i)
				{
					s.text += a[i].firstChild.nodeValue;
				}
				h.appendChild(s);
				
				
				//Funktion ist von Anfang an bekannt
				parent.servlet.smoothScroll()
			}
			else
			{
				alert("Beim Parsen der Serverantwort trat ein Fehler auf");
			}
						
		} 
		else
		{
			alert('Bei dem Request ist ein Problem aufgetreten.');
		}
	}
}


ein Beispiel für eine solche Seite, die ich vom Servlet bekomme wäre :
Code:
<div>
   <script xml:space="preserve">
      <![CDATA[ function openWindow() { /*die definition der funktion*/ };]]>
   </script>
   <form action="irgendwas.jsp">
      ...
   </form>
</div>

die seiten können natürlich beliebig komplex sein, d.h. es können auch mehrere Funktionen dazu kommen oder auch nur eine. Außerdem müssen die Funktionen auch nicht, wie in dem kleinen Beispiel, direkt am Anfang stehn, sondern können auch mittendrin stehen.
 
Zuletzt bearbeitet:
extrahier den javascript quelltext (machst du ja schon) und führ ihn mit eval( src ) aus. danach müsstest du auch auf die funktionen zugreifen können, wenn ich mich nicht irre
 
Hi,
du musst wie OnlyFoo bereits gesagt hat den Javascript Code aus Extrahieren. Das heißt du musst wenn du dir die gesamte Seite holst den String so manipulieren, dass du Javascript und Html in 2 neuen Variablen erhältst oder du schickst zwei anfragen ab - eine nach dem HTML Code und eine nach dem Javascript Code.
Den Js Code führst du dann über die funktion eval() aus.
zb.:
HTML:
var testsstring = 'function test(){ alert("xyz"); }';
eval(testsstring);
danach ist die Funktion test() verfügbar.
 
ok, ich habs es jetzt mal soweit hinbekommen, dass ich, wenn ich die Funktionen kenne, die funktionen aufrufen kann. Leider bleibt mir da aber noch das problem, dass ich ja eben nicht die Namen der Funktionen kenne, die ich bekomme.
ein Beispiel, damit ihr wisst, wie ich das meine:

Ich klicke auf meiner Seite auf den Button "neues aufgabenblatt". Dadurch wird ein AJAX Request angestossen. Als Antwort bekomme ich eine HTML Seite mit einer dynamisch erzeugten Funktion. Ich baue also die HTML Seite ein. Zu sehen ist nun ein Link auf das neue Aufgabenblatt. Durch einen klick auf diesen Link soll funktion x1() aufgerufen werden. Klicke ich jetzt nun nochmal auf "neues Aufgabenblatt" habe ich uf meiner HTML Seite sowohl einen Link für Aufgabenblatt 1, als auch für das neue Aufgabenblatt 2. Aufgabenblatt 2 wird mit Funktion x2() geöffnet.
das heisst, ich könnte dieses Prozedere noch y mal durchführen und hätte dann irgendwann auf der Seite Links für die Aufgabeblätter 1 bis y. Aufgabenblatt y wird dann mit der Funktion xy() geöffnet
ich hoffe ihr wisst was ich meine.
 
Zuletzt bearbeitet:
Hat denn niemand ne Idee wie das funktionieren könnte ? Langsam aber sicher beschleicht mich das Gefühl, das sowas garnicht möchlich ist.
 
Hallo,
ich denke mal schon, dass es irgendwie möglich ist, wenn auch eventuell etwas kompliziert ;-) . Ich finde nur deine Angabe etwas schwer zu verstehen:
AMoKx666 hat gesagt.:
Dadurch wird ein AJAX Request angestossen. Als Antwort bekomme ich eine HTML Seite mit einer dynamisch erzeugten Funktion. Ich baue also die HTML Seite ein. Zu sehen ist nun ein Link auf das neue Aufgabenblatt.Durch einen klick auf diesen Link soll funktion x1() aufgerufen werden
Wo baust du die Seite ein?
Wo soll der Link hin?
Wohin schickst du deinen ajax request, dass du nicht weißt wie die dynamich erzeugte Funktion heißt? Könnte man das ganze nicht erheblich erleichtern, in dem man die Daten anders strukturiert und mit mehreren Requests genau die Information bekommt die man benötigt - bzw Objekte verschickt.
Wohin kommt der Link für das nächste Aufgabenblatt?
usw.
Ohne genaue Beschreibung wirds bei so einem vermutlich komplexen Vorhaben für einen Ausenstehenden einfach schwer dir zu helfen.
 
Hallo,
ich denke mal schon, dass es irgendwie möglich ist, wenn auch eventuell etwas kompliziert ;-) . Ich finde nur deine Angabe etwas schwer zu verstehen:

Wo baust du die Seite ein?
Wo soll der Link hin?
Wohin schickst du deinen ajax request, dass du nicht weißt wie die dynamich erzeugte Funktion heißt? Könnte man das ganze nicht erheblich erleichtern, in dem man die Daten anders strukturiert und mit mehreren Requests genau die Information bekommt die man benötigt - bzw Objekte verschickt.
Wohin kommt der Link für das nächste Aufgabenblatt?
usw.
Ohne genaue Beschreibung wirds bei so einem vermutlich komplexen Vorhaben für einen Ausenstehenden einfach schwer dir zu helfen.

ok stell dir folgendes vor:
du hast eine seite, die aus 2 iframes besteht. sagen wir oben ist iframe 1 und unten iframe 2. in iframe 1 befindet sich eine seite mit buttons. iframe 2 beinhaltet eine seite für usereingaben und sollte hier glaube ich nicht weiter von relevanz sein.
so...du möchtest jetzt nun ein aufgabenblatt generieren lassen. also klickst du ihn iframe 1 auf einen der buttons und schickst das ajax request ab. das request wird an ein servlet geschickt. dieses servlet generiert dir 100% dynamisch ein solches aufgabenblatt. ausserdem wird eine neue html seite erzeugt. in dieser html seite ist das besagte aufgabenblatt über einen link eingebettet. dieser link ruft eine ebenfalls dynamisch erzeugte javascript funktion auf. sagen wir sie würde in unserem beispiel test0() heissen. die definition dieser funktion test0() ist ebenfalls in der generierten html seite enthalten. hat das servlet dir das alles generiert, wird das alles zurück zum browser gesandt. dort angekommen wird die generierte seite in iframe 1 eingebaut.
soweit so gut. das problem besteht jetzt in dem eigentlichen link zum aufgabenblatt. ich hatte ja erwähnt, dass der link die dynamisch erzeugte javascript funktion test0() aufrufen soll. ein klick auf diesen link verursacht aber leider einfach nur eine ausgabe in der fehlerkonsole von firefox ( test0() is undefined ).
der tip mit der eval funktion funktioniert bestens, solange ich die funktion kenne, bzw in der server antwort auch direkt der aufruf einer solchen funktion enthalten ist. soll heissen, wenn ich in dem beispiel mit unserer test0() funktion direkt einen aufruf, nach der evaluierung mit eval(), in der "onreadystate"-funktion mache, funktioniert alles. aber ich muss dem browser irgendwie klar machen, das er beim klick auf den link für das aufgabenblatt die funktion test0() aufruft.
da die funktionen die ich vom servlet bekomme nicht immer test0() heissen, sondern auch test1(), test2(), ... , test4711() heissen können, wirds noch etwas kniffliger als es sowieso schon ist.
eine umstrukturierung der anwendung ist leider nicht möglich und mit erheblichem mehraufwand verbunden.
 

Neue Beiträge

Zurück