Próbowałem tego:
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 i scriptEl.InnerText wyświetlają błędy:
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)
Czy istnieje łatwy sposób na wprowadzenie skryptu do domeny?
c#
javascript
.net
winforms
webbrowser-control
jsight
źródło
źródło
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");
(testowane w .NET 4 / aplikacji Windows Forms)
Edycja: Naprawiono problem z zestawem funkcji.
źródło
IHTMLSCriptElement
zależności.Oto najłatwiejszy sposób, jaki znalazłem po pracy nad tym:
string javascript = "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[] { javascript });
To, co
eval(str)
robi globalna funkcja JavaScript , to analizuje i wykonuje wszystko, co jest napisane w str. Sprawdź referencje w3schools tutaj .źródło
Ponadto w .NET 4 jest to jeszcze łatwiejsze, jeśli używasz dynamicznego słowa kluczowego:
dynamic document = this.browser.Document; dynamic head = document.GetElementsByTagName("head")[0]; dynamic scriptEl = document.CreateElement("script"); scriptEl.text = ...; head.AppendChild(scriptEl);
źródło
Jeśli wszystko, czego naprawdę chcesz, to uruchomić javascript, byłoby to najłatwiejsze (VB .Net):
MyWebBrowser.Navigate("javascript:function foo(){alert('hello');}foo();")
Myślę, że to nie „wstrzyknie” tego, ale uruchomi twoją funkcję, jeśli tego szukasz. (Na wypadek gdybyś zbytnio skomplikował problem.) A jeśli potrafisz wymyślić, jak wykonać wstrzyknięcie w javascript, umieść to w treści funkcji „foo” i pozwól, aby javascript wykonał wstrzyknięcie za Ciebie.
źródło
Zarządzany wrapper dla dokumentu HTML nie implementuje w pełni potrzebnej funkcjonalności, więc musisz zagłębić się w API MSHTML, aby osiągnąć to, co chcesz:
1) Dodaj odniesienie do MSHTML, które prawdopodobnie będzie nazywane „Biblioteką obiektów Microsoft HTML” w COM odniesieniach .
2) Dodaj „używając mshtml;” do twoich przestrzeni nazw.
3) Uzyskaj odniesienie do IHTMLElement elementu skryptu:
4) Wywołaj metodę insertAdjacentText z pierwszą wartością parametru „afterBegin”. Wszystkie możliwe wartości są wymienione tutaj :
iScriptEl.insertAdjacentText("afterBegin", "function sayHello() { alert('hello') }");
5) Teraz będziesz mógł zobaczyć kod we właściwości scriptEl.InnerText.
Hth, Richard
źródło
Jako kontynuacja zaakceptowanej odpowiedzi , jest to minimalna definicja
IHTMLScriptElement
interfejsu, która nie wymaga dołączania dodatkowych bibliotek typów:[ComImport, ComVisible(true), Guid(@"3050f28b-98b5-11cf-bb82-00aa00bdce0b")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] [TypeLibType(TypeLibTypeFlags.FDispatchable)] public interface IHTMLScriptElement { [DispId(1006)] string text { set; [return: MarshalAs(UnmanagedType.BStr)] get; } }
Tak więc pełny kod wewnątrz klasy pochodnej kontrolki WebBrowser wyglądałby następująco:
protected override void OnDocumentCompleted( WebBrowserDocumentCompletedEventArgs e) { base.OnDocumentCompleted(e); // Disable text selection. var doc = Document; if (doc != null) { var heads = doc.GetElementsByTagName(@"head"); if (heads.Count > 0) { var scriptEl = doc.CreateElement(@"script"); if (scriptEl != null) { var element = (IHTMLScriptElement)scriptEl.DomElement; element.text = @"function disableSelection() { document.body.onselectstart=function(){ return false; }; document.body.ondragstart=function() { return false; }; }"; heads[0].AppendChild(scriptEl); doc.InvokeScript(@"disableSelection"); } } } }
źródło
Uważam, że najprostszą metodą wstrzyknięcia JavaScript do dokumentu HTML kontrolnego WebBrowser z języka c # jest wywołanie metody „execScript” z kodem, który ma zostać wstrzyknięty jako argument.
W tym przykładzie kod javascript jest wstrzykiwany i wykonywany w zasięgu globalnym:
var jsCode="alert('hello world from injected code');"; WebBrowser.Document.InvokeScript("execScript", new Object[] { jsCode, "JavaScript" });
Jeśli chcesz opóźnić wykonanie, wstrzyknij funkcje i wywołaj je po:
var jsCode="function greet(msg){alert(msg);};"; WebBrowser.Document.InvokeScript("execScript", new Object[] { jsCode, "JavaScript" }); ............... WebBrowser.Document.InvokeScript("greet",new object[] {"hello world"});
Dotyczy to formantów Windows Forms i WPF WebBrowser.
To rozwiązanie nie działa na wiele przeglądarek, ponieważ „execScript” jest zdefiniowany tylko w przeglądarkach IE i Chrome. Ale pytanie dotyczy formantów Microsoft WebBrowser, a IE jest jedynym obsługiwanym.
Aby uzyskać prawidłową metodę wstrzykiwania kodu JavaScript w różnych przeglądarkach, utwórz obiekt Function z nowym słowem kluczowym. Ten przykład tworzy anonimową funkcję z wstrzykniętym kodem i wykonuje ją (javascript implementuje domknięcia, a funkcja ma dostęp do globalnej przestrzeni bez lokalnego zanieczyszczenia zmiennego).
var jsCode="alert('hello world');"; (new Function(code))();
Oczywiście możesz opóźnić wykonanie:
var jsCode="alert('hello world');"; var inserted=new Function(code); ................. inserted();
Mam nadzieję, że to pomoże
źródło
jest to rozwiązanie wykorzystujące 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);
źródło
((HTMLHeadElement)head).appendChild((IHTMLDOMNode)scriptObject);
, w przeciwnym razie wystąpią błędy.Użyłem tego: D
HtmlElement script = this.WebNavegador.Document.CreateElement("SCRIPT"); script.SetAttribute("TEXT", "function GetNameFromBrowser() {" + "return 'My name is David';" + "}"); this.WebNavegador.Document.Body.AppendChild(script);
Następnie możesz wykonać i uzyskać wynik za pomocą:
string myNameIs = (string)this.WebNavegador.Document.InvokeScript("GetNameFromBrowser");
Mam nadzieję, że będę pomocny
źródło
Oto przykład VB.Net, jeśli próbujesz pobrać wartość zmiennej ze strony załadowanej do kontrolki WebBrowser.
Krok 1) Dodaj odwołanie COM w swoim projekcie do biblioteki obiektów Microsoft HTML
Krok 2) Następnie dodaj ten kod VB.Net do formularza Form1, aby zaimportować bibliotekę mshtml:
Importuje mshtml
Krok 3) Dodaj ten kod VB.Net nad wierszem „Public Class Form1”:
<System.Runtime.InteropServices.ComVisibleAttribute (True)>
Krok 4) Dodaj formant WebBrowser do projektu
Krok 5) Dodaj ten kod VB.Net do funkcji Form1_Load:
WebBrowser1.ObjectForScripting = Me
Krok 6) Dodaj ten podrzędny VB.Net, który wstrzyknie funkcję „CallbackGetVar” do JavaScript strony internetowej:
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
Krok 7) Dodaj następującą podrzędną wartość VB.Net, której JavaScript będzie szukał po wywołaniu:
Public Sub Callback_GetVar(ByVal vVar As String) Debug.Print(vVar) End Sub
Krok 8) Na koniec, aby wywołać wywołanie zwrotne Javascript, dodaj ten kod VB.Net po naciśnięciu przycisku lub gdziekolwiek chcesz:
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
Krok 9) Jeśli zaskoczy Cię, że to działa, możesz poczytać o funkcji Javascript „eval”, użytej w kroku 6, która to umożliwia. Pobierze łańcuch i określi, czy istnieje zmienna o tej nazwie, a jeśli tak, zwróci wartość tej zmiennej.
źródło
Zawsze możesz użyć właściwości „DocumentStream” lub „DocumentText”. Do pracy z dokumentami HTML polecam HTML Agility Pack .
źródło
używam tego:
webBrowser.Document.InvokeScript("execScript", new object[] { "alert(123)", "JavaScript" })
źródło
To, co chcesz zrobić, to użyć Page.RegisterStartupScript (klucz, skrypt):
Więcej informacji można znaleźć tutaj: http://msdn.microsoft.com/en-us/library/aa478975.aspx
To, co w zasadzie robisz, to budowanie ciągu javascript, przekazanie go do tej metody i nadanie mu unikalnego identyfikatora (na wypadek, gdybyś próbował zarejestrować go dwukrotnie na stronie).
EDYCJA: To jest to, co nazywasz wyzwalaczem szczęśliwym. Możesz go opuścić. :)
źródło
Jeśli chcesz wstrzyknąć cały plik, możesz użyć tego:
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
Pamiętaj, aby zaimportować
System.IO
, aby użyć rozszerzeniaStreamReader
. Mam nadzieję, że to pomoże.źródło
input type="file"
sekcji?