Ich habe das versucht:
string newScript = textBox1.Text;
HtmlElement head = browserCtrl.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = browserCtrl.Document.CreateElement("script");
lblStatus.Text = scriptEl.GetType().ToString();
scriptEl.SetAttribute("type", "text/javascript");
head.AppendChild(scriptEl);
scriptEl.InnerHtml = "function sayHello() { alert('hello') }";
scriptEl.InnerHtml und scriptEl.InnerText geben beide Fehler:
System.NotSupportedException: Property is not supported on this type of HtmlElement.
at System.Windows.Forms.HtmlElement.set_InnerHtml(String value)
at SForceApp.Form1.button1_Click(Object sender, EventArgs e) in d:\jsight\installs\SForceApp\SForceApp\Form1.cs:line 31
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Gibt es eine einfache Möglichkeit, ein Skript in den Dom einzufügen?
c#
javascript
.net
winforms
webbrowser-control
jsight
quelle
quelle
(getestet in .NET 4 / Windows Forms App)
Bearbeiten: Fallproblem im Funktionssatz behoben.
quelle
IHTMLSCriptElement
Abhängigkeit.Hier ist der einfachste Weg, den ich gefunden habe, nachdem ich daran gearbeitet habe:
Die globale JavaScript-Funktion
eval(str)
analysiert und führt alles aus, was in str geschrieben ist. Überprüfen Sie w3schools ref hier .quelle
In .NET 4 ist dies außerdem noch einfacher, wenn Sie das dynamische Schlüsselwort verwenden:
quelle
Wenn Sie nur Javascript ausführen möchten, ist dies am einfachsten (VB .Net):
Ich denke, das würde es nicht "injizieren", aber es wird Ihre Funktion ausführen, wenn Sie danach suchen. (Nur für den Fall, dass Sie das Problem zu kompliziert haben.) Und wenn Sie herausfinden können, wie man Javascript injiziert, fügen Sie dies in den Hauptteil der Funktion "foo" ein und lassen Sie das Javascript die Injektion für Sie durchführen.
quelle
Der verwaltete Wrapper für das HTML-Dokument implementiert die von Ihnen benötigten Funktionen nicht vollständig. Sie müssen daher in die MSHTML-API eintauchen, um das zu erreichen, was Sie möchten:
1) Fügen Sie einen Verweis auf MSHTML hinzu, der unter COM- Verweisen wahrscheinlich als "Microsoft HTML Object Library" bezeichnet wird .
2) Fügen Sie 'using mshtml;' zu Ihren Namespaces.
3) Holen Sie sich einen Verweis auf das IHTMLElement Ihres Skriptelements:
4) Rufen Sie die Methode insertAdjacentText mit dem ersten Parameterwert "afterBegin" auf. Alle möglichen Werte sind hier aufgelistet :
5) Jetzt können Sie den Code in der Eigenschaft scriptEl.InnerText sehen.
Hth, Richard
quelle
Als Folge der akzeptierten Antwort ist dies eine minimale Definition der
IHTMLScriptElement
Schnittstelle, für die keine zusätzlichen Typbibliotheken erforderlich sind:Ein vollständiger Code in einer vom WebBrowser-Steuerelement abgeleiteten Klasse würde also folgendermaßen aussehen:
quelle
Ich glaube, die einfachste Methode zum Einfügen von Javascript in ein WebBrowser Control-HTML-Dokument aus c # besteht darin, die "execScript" -Methode mit dem als Argument einzufügenden Code aufzurufen.
In diesem Beispiel wird der Javascript-Code im globalen Bereich eingefügt und ausgeführt:
Wenn Sie die Ausführung verzögern möchten, fügen Sie Funktionen ein und rufen Sie sie anschließend auf:
Dies gilt für Windows Forms- und WPF-WebBrowser-Steuerelemente.
Diese Lösung ist nicht browserübergreifend, da "execScript" nur in IE und Chrome definiert ist. Die Frage bezieht sich jedoch auf Microsoft WebBrowser-Steuerelemente, und nur der IE wird unterstützt.
Erstellen Sie für eine gültige browserübergreifende Methode zum Einfügen von Javascript-Code ein Funktionsobjekt mit dem neuen Schlüsselwort. In diesem Beispiel wird eine anonyme Funktion mit injiziertem Code erstellt und ausgeführt (Javascript implementiert Schließungen und die Funktion hat Zugriff auf den globalen Raum ohne lokale variable Verschmutzung).
Natürlich können Sie die Ausführung verzögern:
Ich hoffe es hilft
quelle
Dies ist eine Lösung mit mshtml
quelle
((HTMLHeadElement)head).appendChild((IHTMLDOMNode)scriptObject);
Sie sonst Fehler erhalten.Ich habe das benutzt: D.
Dann können Sie ausführen und das Ergebnis erhalten mit:
Ich hoffe hilfreich zu sein
quelle
Hier ist ein VB.Net-Beispiel, wenn Sie versuchen, den Wert einer Variablen innerhalb einer in ein WebBrowser-Steuerelement geladenen Seite abzurufen.
Schritt 1) Fügen Sie der Microsoft HTML Object Library eine COM-Referenz in Ihrem Projekt hinzu
Schritt 2) Fügen Sie als Nächstes diesen VB.Net-Code zu Form1 hinzu, um die mshtml-Bibliothek zu importieren:
Importiert mshtml
Schritt 3) Fügen Sie diesen VB.Net-Code über Ihrer Zeile "Public Class Form1" hinzu:
<System.Runtime.InteropServices.ComVisibleAttribute (True)>
Schritt 4) Fügen Sie Ihrem Projekt ein WebBrowser-Steuerelement hinzu
Schritt 5) Fügen Sie diesen VB.Net-Code zu Ihrer Form1_Load-Funktion hinzu:
WebBrowser1.ObjectForScripting = Me
Schritt 6) Fügen Sie dieses VB.Net-Sub hinzu, das eine Funktion "CallbackGetVar" in das Javascript der Webseite einfügt:
Schritt 7) Fügen Sie das folgende VB.Net-Sub hinzu, nach dem das Javascript beim Aufrufen sucht:
Schritt 8) Um den Javascript-Rückruf aufzurufen, fügen Sie diesen VB.Net-Code hinzu, wenn eine Taste gedrückt wird oder wo immer Sie möchten:
Schritt 9) Wenn Sie überrascht sind, dass dies funktioniert, sollten Sie sich über die in Schritt 6 verwendete Javascript-Funktion "eval" informieren, die dies ermöglicht. Es wird eine Zeichenfolge verwendet, um festzustellen, ob eine Variable mit diesem Namen vorhanden ist, und in diesem Fall wird der Wert dieser Variablen zurückgegeben.
quelle
Sie können jederzeit eine "DocumentStream" - oder "DocumentText" -Eigenschaft verwenden. Für die Arbeit mit HTML-Dokumenten empfehle ich ein HTML Agility Pack .
quelle
ich benutze das:
quelle
Sie möchten Page.RegisterStartupScript (Schlüssel, Skript) verwenden:
Weitere Informationen finden Sie hier: http://msdn.microsoft.com/en-us/library/aa478975.aspx
Grundsätzlich erstellen Sie Ihre Javascript-Zeichenfolge, übergeben sie an diese Methode und geben ihr eine eindeutige ID (falls Sie versuchen, sie zweimal auf einer Seite zu registrieren).
EDIT: Dies ist, was Sie Trigger glücklich nennen. Fühlen Sie sich frei, es zu tun. :) :)
quelle
Wenn Sie eine ganze Datei einfügen müssen, können Sie Folgendes verwenden:
Denken Sie daran, zu importieren,
System.IO
um die zu verwendenStreamReader
. Ich hoffe das hilft.quelle
input type="file"
Abschnitt einfügen?