3 Stimmen

Wie man Javascript im WebBrowser-Control injiziert

Es gibt ein großartiges Tutorial hier über Windows Forms

Wie fügt man JavaScript in die WebBrowser-Steuerelemente ein?

Ich habe es ausprobiert und es funktioniert großartig

Aber das Problem ist, dass die dort verwendeten Objekte in der WPF-Anwendung nicht erkannt werden. Daher frage ich mich, was das Äquivalent der unten stehenden Funktion in der WPF-Anwendung ist. Vielen Dank.

HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
string srJquery = File.ReadAllText("jquery.txt");
element.text = srJquery;
head.AppendChild(scriptEl);  

Die oben stehende Funktion funktioniert einwandfrei bei Windows Forms Anwendung C# 4.0, aber die verwendeten Objekte wie HtmlElement werden in der WPF-Anwendung nicht erkannt.

5voto

WPF-it Punkte 19187

Funktioniert das?

    private void WebBrowser_LoadCompleted
       (object sender,
        System.Windows.Navigation.NavigationEventArgs e)
    {
        var webBrowser = sender as WebBrowser;

        var document
           = webBrowser.Document as mshtml.HTMLDocument;
        var ahref
           = document.getElementsByTagName("A").Cast().First();
        ahref.setAttribute(
           "onmouseenter",
           "javascript:alert('Hi');", 1);
    }

Sie benötigen den Microsoft.mshtml (die .net API und nicht die von MS Office) Verweis.

Bitte sehen Sie auch diesen Code für das WPF-Webbrowser-Steuerelement, das die ObjectForScripting-Eigenschaft des WebBrowser verwendet, die Ihnen helfen kann, JavaScript einzufügen...

http://blogs.msdn.com/b/wpf/archive/2011/05/27/how-does-wpf-webbrowser-control-handle-window-external-notify.aspx

Lassen Sie mich wissen, ob Ihnen das hilft.

3voto

espaciomore Punkte 31

Die beste Antwort, die ich im Netz gefunden habe, stammt von http://clistax.com/question/qt/153748/st/4eb64b29180c4

Ich glaube, die einfachste Methode, um Javascript in ein HTML-Dokument von c# aus in einem WebBrowser-Control einzufügen, ist die "execStrip"-Methode mit dem einzufügenden Code als Argument aufzurufen.

In diesem Beispiel wird der Javascript-Code eingefügt und auf globaler Ebene ausgeführt:

var jsCode="alert('hello world from injected code');";
WebBrowser.Document.InvokeScript("execScript", new Object[] { jsCode, "JavaScript" });

Wenn Sie die Ausführung verzögern möchten, Funktionen einfügen und diese anschließend aufrufen möchten:

var jsCode="function greet(msg){alert(msg);};";
WebBrowser.Document.InvokeScript("execScript", new Object[] { jsCode, "JavaScript" });

WebBrowser.Document.InvokeScript("greet",new object[] {"hello world"});

Dies gilt für Windows Forms und WPF WebBrowser-Controls.

Diese Lösung ist nicht plattformübergreifend, da "execScript" nur in IE und Chrome definiert ist. Aber die Frage betrifft Microsoft WebBrowser-Controls und IE ist der einzige unterstützte Browser.

1voto

clamchoda Punkte 3347

Dynamisch macht dies einfach. Du musst nur daran denken, dass wir mit einem Microsoft.mshtml arbeiten.

private void wb_Navigated(object sender, NavigationEventArgs e)
{

    if (wb != null && wb.Document != null)
    {
        dynamic document = wb.Document;
        dynamic script = document.createElement("script");
        script.type = @"text/javascript";
        script.text = @"alert('Hallo Welt');";
        try { document.head.appendChild(script); } catch (Exception ex) { } // Dynamische Eigenschaft head existiert nicht.
    }
}

Hinweis: Stelle sicher, dass du Navigated verwendest und nicht Navigating, um sicherzustellen, dass das Dokument befüllt ist.

Ich finde es oft nützlich, script.text mit System.IO.File.ReadAllText(pathToJs) einzustellen, um lokale JavaScript-Dateien zu laden. Da der eingebettete Webbrowser oft veraltet sein kann, ist es für mich ziemlich üblich geworden, Dinge wie polyfill in meine Windows Forms und WPF WebBrowser-Anwendungen zu injizieren.

0voto

jeffery Punkte 322

Ich fand dies, was hilft, das über invokescript äquivalent in wpf spricht, um nur Skriptcode innerhalb von html auszuführen: http://msdn.microsoft.com/en-us/library/cc452443.aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X