Ergebnis von eval global verfügbar machen
Jörg Peschke
- javascript
0 Struppi
0 Jörg Peschke0 Struppi
0 Jörg Peschke0 Jörg Peschke
0 Andreas Lindig
Hallo,
Ich möchte eine JavaScript-Funktion schreiben, die beim Aufruf JavaScript-Code in der globalen Ablaufumgebung verfügbar macht, also konkret:
JSEval ("function test() {alert('test');}");
soll dazu führen, dass ich eine Funktion "test" habe, die ich aufrufen kann.
Mein erster kläglicher Versuch:
function JSEval (jscode) {
eval(jscode);
}
funktioniert logischerweise nicht, weil ich ja die erzeugte "test"-Funktion nur innerhalb von JSEval verfügbar ist.
Ich hoffe, ich konnte mein Problem verständlich schildern.
Ich möchte eine JavaScript-Funktion schreiben, die beim Aufruf JavaScript-Code in der globalen Ablaufumgebung verfügbar macht, also konkret:
JSEval ("function test() {alert('test');}");
soll dazu führen, dass ich eine Funktion "test" habe, die ich aufrufen kann.
wieso nicht
var test = function() { alert('test'); };
Mein erster kläglicher Versuch:
function JSEval (jscode) {
eval(jscode);
}
Es wäre interessant zu Wissen, was in jscode stehen kann.
Struppi.
Hallo,
var test = function() { alert('test'); };
Ähm ja, aber ich kriege den Inhalt von Test nur als String :(
Hintergrund ist der folgende: Ich will den JavaScript-Code eines Dokumentes, welches ich in einem Iframe-eingebunden habe im Parent-Frame einbinden. Sodass ich praktisch alle Funktionen und Variablen im Parent-Frame habe, die ich auch im Iframe zur Verfügung habe.
Also hole ich mit "document.getElementsByTagName("script")" erstmal alle javaScript-Sections.
Wenn ich jetzt diese aber einfach mit einem innerHTML ins Dokument klattsche, gehts glaube ich schief (IE speziell schätzt es nicht, wenn man ihm zur Laufzeit mit innerHTML neuen Code unterjubelt).
Also war meine Idee:
1.) den Script-Code als string exportieren
2.) störende Zeichen (<!-- oder //-->) mit Replace ersetzen
3.) auf den resultierenden String ein eval, noch mit einem try...catch drumrum damits nicht kracht.
Ich gebe zu, ein kühnes UNterfangen ;)
var test = function() { alert('test'); };
Ähm ja, aber ich kriege den Inhalt von Test nur als String :(
Dann hilft nur eval:
var string = "function() { alert('test'); };";
var x = eval ('window.test = ' + string);
test();
x();
Hintergrund ist der folgende: Ich will den JavaScript-Code eines Dokumentes, welches ich in einem Iframe-eingebunden habe im Parent-Frame einbinden. Sodass ich praktisch alle Funktionen und Variablen im Parent-Frame habe, die ich auch im Iframe zur Verfügung habe.
Hast du doch sowieso.
Also hole ich mit "document.getElementsByTagName("script")" erstmal alle javaScript-Sections.
Wenn ich jetzt diese aber einfach mit einem innerHTML ins Dokument klattsche, gehts glaube ich schief (IE speziell schätzt es nicht, wenn man ihm zur Laufzeit mit innerHTML neuen Code unterjubelt).
Versuch's mal mit createElement()
Struppi.
Tag,
Hintergrund ist der folgende: Ich will den JavaScript-Code eines Dokumentes, welches ich in einem Iframe-eingebunden habe im Parent-Frame einbinden. Sodass ich praktisch alle Funktionen und Variablen im Parent-Frame habe, die ich auch im Iframe zur Verfügung habe.
Hast du doch sowieso.
Aeh ja, aber die muesste ich dann mit "frames[0].funktion" oder so aufrufen. Das will ich nicht, der Funktionsaufruf soll identisch mit dem im Iframe sein.
Versuch's mal mit createElement().
Des is ne Idee. Probier ich mal aus. Danke Dir.
Des is ne Idee. Probier ich mal aus. Danke Dir.
Wo-how! "Unerwarteter Aufruf" sagt IE, und Mozilla scheidet mit einem Total-Absturz aus dem Leben...impressive, ich mache heute meinem Nick alle Ehre ;)
Des is ne Idee. Probier ich mal aus. Danke Dir.
Wo-how! "Unerwarteter Aufruf" sagt IE, und Mozilla scheidet mit einem Total-Absturz aus dem Leben...impressive, ich mache heute meinem Nick alle Ehre ;)
Ich probier das gleich mal aus, aber du hast nicht eval und createElement gekoppelt?
Struppi.
Moin,
Ich probier das gleich mal aus, aber du hast nicht eval und createElement gekoppelt?
Nö:
var scripts = sourceDoc.getElementsByTagName("script");
for (var i = 0; i < scripts.length; i++) {
var myScriptTag = document.createElement("script");
var type= document.createAttribute ("type");
type.nodeValue = "text/javascript";
myScriptTag.setAttributeNode(type);
var textnode = document.createTextNode(scripts[i].innerHTML);
myScriptTag.appendChild(textnode);
document.getElementsByTagName("body")[0].appendChild(myScriptTag);
}
Gruesse,
Joerg
Des is ne Idee. Probier ich mal aus. Danke Dir.
Wo-how! "Unerwarteter Aufruf" sagt IE, und Mozilla scheidet mit einem Total-Absturz aus dem Leben...impressive, ich mache heute meinem Nick alle Ehre ;)
Ich hab mal kurz gesucht und einige Varianten gefunden:
Die einfachste:
window.onload = function()
{
var string = "function test(){ alert('test') };"
addScript( string);
}
function addScript( src, win)
{
if(!win) win = window;
var s = win.document.createElement('script');
s.type = 'text/javascript';
if( typeof s.text != 'undefined')
{
s.text = src;
}
win.document.getElementsByTagName('head')[0].appendChild( s );
}
geht bei mir im IE 6 und FF 1.0.4 nicht im OP
Struppi.
Hintergrund ist der folgende: Ich will den JavaScript-Code eines Dokumentes, welches ich in einem Iframe-eingebunden habe im Parent-Frame einbinden. Sodass ich praktisch alle Funktionen und Variablen im Parent-Frame habe, die ich auch im Iframe zur Verfügung habe.
kannst Du es nicht umdrehen? - alle Funktionen in den Parent-Frame schreiben? Dann kannst Du von überall her drauf zugreifen. Für den gleichartigen Aufruf könnte doch jede Einzelseite den Framepfad einmalig in so einer Aufruf-Funktion stehen haben.
Gruß, Andreas