Как внедрить Javascript в элемент управления WebBrowser? - PullRequest
78 голосов
/ 30 сентября 2008

Я пробовал это:

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 и scriptEl.InnerText выдают ошибки:

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)

Есть ли простой способ ввести скрипт в домен?

Ответы [ 15 ]

2 голосов
/ 16 ноября 2011

Вот пример VB.Net, если вы пытаетесь получить значение переменной со страницы, загруженной в элемент управления WebBrowser.

Шаг 1) Добавьте ссылку COM в вашем проекте в библиотеку объектов Microsoft HTML

Шаг 2) Затем добавьте этот код VB.Net в форму Form1 для импорта библиотеки mshtml:
Импортирует mshtml

Шаг 3) Добавьте этот код VB.Net над строкой «Public Class Form1»:

Шаг 4) Добавьте элемент управления WebBrowser в ваш проект

Шаг 5) Добавьте этот код VB.Net в функцию Form1_Load:
WebBrowser1.ObjectForScripting = Me

Шаг 6) Добавьте эту подпрограмму VB.Net, которая будет вставлять функцию "CallbackGetVar" в Javascript веб-страницы:

Public Sub InjectCallbackGetVar(ByRef wb As WebBrowser)
    Dim head As HtmlElement
    Dim script As HtmlElement
    Dim domElement As IHTMLScriptElement

    head = wb.Document.GetElementsByTagName("head")(0)
    script = wb.Document.CreateElement("script")
    domElement = script.DomElement
    domElement.type = "text/javascript"
    domElement.text = "function CallbackGetVar(myVar) { window.external.Callback_GetVar(eval(myVar)); }"
    head.AppendChild(script)
End Sub

Шаг 7) Добавьте следующую подпрограмму VB.Net, которую Javascript будет искать при вызове:

Public Sub Callback_GetVar(ByVal vVar As String)
    Debug.Print(vVar)
End Sub

Шаг 8) Наконец, чтобы вызвать обратный вызов Javascript, добавьте этот код VB.Net при нажатии кнопки или в любом месте:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    WebBrowser1.Document.InvokeScript("CallbackGetVar", New Object() {"NameOfVarToRetrieve"})
End Sub

Шаг 9) Если вас удивит, что это работает, вы можете прочитать о функции eval Javascript, используемой на шаге 6, что и делает это возможным. Он возьмет строку и определит, существует ли переменная с этим именем, и, если это так, вернет значение этой переменной.

1 голос
/ 30 сентября 2008

Вы всегда можете использовать свойство «DocumentStream» или «DocumentText». Для работы с документами HTML я рекомендую HTML Agility Pack .

0 голосов
/ 28 мая 2018

Я использую это:

webBrowser.Document.InvokeScript("execScript", new object[] { "alert(123)", "JavaScript" })
0 голосов
/ 08 ноября 2014

Если вам нужно внедрить целый файл, вы можете использовать это:

With Browser.Document
   Dim Head As HtmlElement = .GetElementsByTagName("head")(0)
   Dim Script As HtmlElement = .CreateElement("script")
   Dim Streamer As New StreamReader(<Here goes path to file as String>)
   Using Streamer
       Script.SetAttribute("text", Streamer.ReadToEnd())
   End Using
   Head.AppendChild(Script)
   .InvokeScript(<Here goes a method name as String and without parentheses>)
End With

Не забудьте импортировать System.IO, чтобы использовать StreamReader. Надеюсь, это поможет.

0 голосов
/ 30 сентября 2008

Что вы хотите сделать, это использовать Page.RegisterStartupScript (ключ, скрипт) :

Подробнее см. Здесь: http://msdn.microsoft.com/en-us/library/aa478975.aspx

Что вы в основном делаете, это строите свою строку javascript, передаете ее этому методу и присваиваете ей уникальный идентификатор (в случае, если вы пытаетесь зарегистрировать ее дважды на странице.)

РЕДАКТИРОВАТЬ: Это то, что вы называете триггер счастливым. Не стесняйтесь опустить его. :)

...