2k Aufrufe
Gefragt in Anwendungen(Java,C++...) von mixmax Experte (2.2k Punkte)
ich bastel gerade an einer Anwendung, die eine Webseite öffnet und ein Javascript anhängen soll. Die Anwendung schreibe ich in C#


COMMAND = "alert('HELLO WORLD');";
HtmlElement ExecuteCom = WBO.Document.CreateElement("script");
ExecuteCom.SetAttribute("language", "javascript");
ExecuteCom.InnerHtml = COMMAND;
//ExecuteCom.SetAttribute("InnerHtml", COMMAND);

also in beiden Varianten stoße ich auf den Fehler das ich nicht auf innerHTML beim Scripttag zugreifen kann.

Hier stehts auch:
msdn.microsoft.com/en-us/library/system.windows.forms.htmlelement.innerhtml.aspx#CommunityContent

was hier nicht steht - wie führe ich einen einfachen Text-string in dem Browser als Javascript aus.
mit befehlen wie "WBO.ExecCommand" muss ich funktionen und Objekte erst definieren, das ist aber leider nicht möglich da der Befehl recht dynamisch bleiben soll (oder ich verstehe den Befehl nicht).

Funktioneren würde:
MyScript.SetAttribute("src", Application.StartupPath + "\\scripts\\scipts.js");
MyScript.SetAttribute("language", "javascript");

Wenn ich also für jedes mal eine Text-datei auf die platte schreiben würde und ein Scripttag mit extern verlinkten Javascript anhänge - das ist aber sehr unsauber geschrieben dann.

Danke für jede Idee

6 Antworten

0 Punkte
Beantwortet von
innerHTML fügt statische Texte ein, also keinen ausführbaren JS-Code.
Dazu müsstest du DOM-Methoden nutzen.

BTW: das javascript-Attribut in <script> ist veraltet und muss durch das type-Attribut ersetzt werden

Und was ist an externen JavaScripten so "unsauber", letztlich ist das die allgemein übliche Vorgehensweise.
0 Punkte
Beantwortet von mixmax Experte (2.2k Punkte)
Danke erstmal für die allgemeine Antwort.

Unsauber ist halt das ich dann für das ausführen einer Javascript-zeile eine Datei anlegen muss, und diese dann einbinde und später lösche - ich habe es derzeit so auch erfolgreich hingekriegt, finde es aber sehr umständlich.

das Type-Attribut setz ich bei Script ja auch. Ein Ansatz zu einer direkten Lösung kann ich aber nicht erkennen, denn wie du an der "appendChild" methode erkennen kannst benutze ich DOM um ein Script-tag an den Body zu hängen, nur kann ich den inhalt nicht setzen.
Wenn jemand mir helfen möchte dann nenne bitte den Befehl womit man den Script-tag dann mit inhalt füllen kann.

Danke
René
0 Punkte
Beantwortet von
benutze ich DOM um ein Script-tag an den Body zu hängen
um dann mit der innnerHTML-Brechstange weiter zu arbeiten, statt weiterhin DOM-Methoden zu nutzen
0 Punkte
Beantwortet von mixmax Experte (2.2k Punkte)
ok was immer noch keine antwort auf meine frage ist - deine sogenannte brechstange war der direkteste versucht der ja wie in dem microsoftartikel beschrieben nicht geht.

Also ich ändere mal meine frage dahingehend wie sähe denn der befehl dann aus, denn eine antwort auf die Frage ist das nicht sondern nur eine bestätigung von dem was ich eh schon weiß.
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
In HTML sieht das mehr als einfach aus:

<html><head>
</head><body>
<script type="text/javascript">
var eScript= document.createElement( 'script' );
var eText= document.createTextNode( 'alert( \'hallo welt\' );' );
eScript.appendChild( eText );
document.getElementsByTagName( 'head' )[0].appendChild( eScript );
</script>
</body></html>


Bezogen auf deine Sprache könnte das so aussehen (einzelne Teile frei erfunden):
HtmlElement ExecuteCom = WBO.Document.CreateElement("script");
TextNode ExecuteCom = WBO.Document.CreateTextNode("alert('hallo welt');");
ExecuteCom.SetAttribute("type", "text/javascript");
ExecuteCom.AppendChild(TextNode);
Feld ExecuteCom = WBO.Document.GetElementsByTagName;
Feld[0].AppendChild(ExecuteCom);
0 Punkte
Beantwortet von mixmax Experte (2.2k Punkte)
Hi SonQuatsch,

leider hat C# nur CreateElement(String ElementTag) aber nicht CreateTextNode.... es ist leider wirklich zum Haare raufen.

ich fürchte das es auch nicht mit appendchild realisierbar ist:
ich habe mal folgendes getestet:

HtmlElement S = wbo.Document.CreateElement("script");
wbo.Document.Body.AppendChild(S);
MessageBox.Show(S.CanHaveChildren.ToString());


leider gibt die messagebox "false" aus sprich ein scripttag wird wohl keine kinder kriegen können.


ich danke dir für den ehrlichen Versuch - ich lasse es erstmal so wie es derzeit läuft mit eine JS-Datei erstellen und extern einbinden.
...