82 votes

Comment injecter du Javascript dans le contrôle WebBrowser?

J'ai essayé ceci:

 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 et scriptEl.InnerText donnent tous deux des erreurs:

 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)
 

Existe-t-il un moyen facile d’injecter un script dans le dom?

102voto

Atanas Korchev Points 20945

Pour une raison quelconque, la solution de Richard n'a pas fonctionné de mon côté (insertAdjacentText a échoué avec une exception). Cela semble cependant fonctionner:

 HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
element.text = "function sayHello() { alert('hello') }";
head.AppendChild(scriptEl);
webBrowser1.Document.InvokeScript("sayHello");
 

52voto

Thomas Points 201
 HtmlDocument doc = browser.Document;
HtmlElement head = doc.GetElementsByTagName("head")[0];
HtmlElement s = doc.CreateElement("script");
s.SetAttribute("text","function sayhello() { alert('hello'); }");
head.AppendChild(s);
browser.Document.InvokeScript("sayHello");
 

(testé dans .NET 4 / Windows Forms App)

33voto

Ilya Rosikhin Points 71

Voici le moyen le plus simple que j'ai trouvé après avoir travaillé sur ceci:

 string jCode = "alert("Hello");"
// or any combination of your JavaScript commands
// (including function calls, variables... etc)

// WebBrowser webBrowser1 is what you are using for your web browser
webBrowser1.Document.InvokeScript("eval", new object[] { jCode });
 

Ce que la fonction JavaScript globale eval(str) fait, analyse et exécute tout ce qui est écrit dans str. Vérifiez w3schools ref ici .

22voto

justin.m.chase Points 3529

En outre, dans .NET 4, cela est encore plus facile si vous utilisez le mot-clé dynamic:

 dynamic document = this.browser.Document;
dynamic head = document.GetElementsByTagName("head")[0];
dynamic scriptEl = document.CreateElement("script");
scriptEl.text = ...;
head.AppendChild(scriptEl);
 

17voto

Eyal Points 2552

Si tout ce que vous voulez, c'est exécuter du javascript, ce serait plus simple (VB .Net):

 MyWebBrowser.Navigate("javascript:function foo(){alert('hello');}foo();")
 

J'imagine que cela ne "l'injecterait" pas, mais que votre fonction serait exécutée, si c'est ce que vous recherchez. (Juste au cas où vous auriez trop compliqué le problème.) Et si vous savez comprendre comment injecter du javascript, mettez cela dans le corps de la fonction "foo" et laissez le javascript l'injecter à votre place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X