Как внедрить Javascript в элемент управления WebBrowser?

Кажется, это невозможно. Ошибка с Chrome в 2012 году с Chrome! https://bugs.chromium.org/p/chromium/issues/detail?id=150835

79
задан abatishchev 4 March 2011 в 14:41
поделиться

7 ответов

По некоторым причинам решение Richard не работало над моим концом (insertAdjacentText отказавший за исключением). Это однако, кажется, работает:

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");

Этот ответ объясняет, как добраться эти IHTMLScriptElement интерфейс в Ваш проект.

98
ответ дан Community 5 March 2011 в 00:41
поделиться

То, что Вы хотите сделать, использовать Page. RegisterStartupScript (ключ, сценарий):

Посмотрите здесь для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/aa478975.aspx

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

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

0
ответ дан mattlant 5 March 2011 в 00:41
поделиться
  • 1
    Временно назначенный. Nginx очень быстр, специально для обслуживания статического содержания. – Bob Somers 30 October 2008 в 14:06

Управляемая оболочка для документа HTML не полностью реализует функциональность, в которой Вы нуждаетесь, таким образом, необходимо опуститься в API MSHTML для выполнения то, что Вы хотите:

1) Добавляют ссылку на MSHTML, который, вероятно, назовут "Библиотекой объекта HTML Microsoft" под COM ссылки.

2) Добавляют 'использование mshtml'; к Вашим пространствам имен.

3) Получают ссылку на Ваш IHTMLElement элемента сценария:

IHTMLElement iScriptEl = (IHTMLElement)scriptEl.DomElement;

4) Вызов insertAdjacentText метод, с первым значением параметра "afterBegin". Все возможные значения перечислены здесь :

iScriptEl.insertAdjacentText("afterBegin", "function sayHello() { alert('hello') }");

5) Теперь Вы сможете видеть код в scriptEl. Свойство InnerText.

Hth, Richard

10
ответ дан ZeroBugBounce 5 March 2011 в 00:41
поделиться
  • 1
    По сравнению с другими решениями, предложенными выше, G-WAN, не является OpenSource (программное обеспечение Freeware, которое НЕ является Бесплатным программным обеспечением). Это только реализует HTTP 1.0 (и некоторый материал от HTTP 1.1 как Активный), не поддерживает заголовок Завершающего тега (но If-Modified-Since). Сравнительные тесты в его домашней странице удивительны, но лучший способ видеть, работает ли это на Вас или нет, тестирует Ваше приложение с нею, и сравните его с другими решениями. – krenel00 27 April 2012 в 21:29

Можно всегда использовать свойство "DocumentStream" или "DocumentText". Для работы с документами HTML я рекомендую Пакет Гибкости HTML .

1
ответ дан TcKs 5 March 2011 в 00:41
поделиться
  • 1
    Nginx медленнее и использует больше ЦП и ресурсов памяти, чем другие, как Lighty или G-WAN, видят forum.gwan.com/index.php?p=/discussion/525/… настолько складывающий +1 голос простой черлидинг, а не техническая информация. – Gil 18 May 2012 в 23:37

Если все, что вам действительно нужно, это запустить javascript, это будет проще всего ( VB .Net):

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

Я предполагаю, что это не будет "вводить" его, но оно запустит вашу функцию, если это то, что вам нужно. (На всякий случай, если вы слишком усложнили проблему.) И если вы можете понять, как внедрить в javascript, поместите это в тело функции «foo» и позвольте javascript сделать инъекцию за вас.

17
ответ дан 24 November 2019 в 09:26
поделиться

Кроме того, в .NET 4 это еще проще, если вы используете ключевое слово dynamic:

dynamic document = this.browser.Document;
dynamic head = document.GetElementsByTagName("head")[0];
dynamic scriptEl = document.CreateElement("script");
scriptEl.text = ...;
head.AppendChild(scriptEl);
21
ответ дан 24 November 2019 в 09:26
поделиться

это решение, использующее mshtml

IHTMLDocument2 doc = new HTMLDocumentClass();
doc.write(new object[] { File.ReadAllText(filePath) });
doc.close();

IHTMLElement head = (IHTMLElement)((IHTMLElementCollection)doc.all.tags("head")).item(null, 0);
IHTMLScriptElement scriptObject = (IHTMLScriptElement)doc.createElement("script");
scriptObject.type = @"text/javascript";
scriptObject.text = @"function btn1_OnClick(str){
    alert('you clicked' + str);
}";
((HTMLHeadElementClass)head).appendChild((IHTMLDOMNode)scriptObject);
7
ответ дан 24 November 2019 в 09:26
поделиться