如何在WebBrowser控件中注入Javascript

时间:2011-11-03 17:07:42

标签: c# wpf webbrowser-control inject

这里有关于Windows窗体的很棒的教程

How to inject Javascript in WebBrowser control?

我尝试了它并且效果很好

但问题是在wpf应用程序中无法识别所使用的对象。所以我要问的是wpf应用程序中下面函数的等价物。谢谢。

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

上面的函数在Windows窗体应用程序c#4.0中完美运行,但在WPF应用程序中无法识别HtmlElement等已使用的对象。

4 个答案:

答案 0 :(得分:5)

这有用吗?

    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<mshtml.IHTMLElement>().First();
        ahref.setAttribute(
           "onmouseenter",
           "javascript:alert('Hi');", 1);
    }

您需要Microsoft.mshtml(.net API而不是MS office one)参考。

另请参阅此代码,以获取使用ObjectForScripting WebBrowser属性的WPF webbrowser控件,它可以帮助您注入javascript ...

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

如果有帮助,请告诉我。

答案 1 :(得分:2)

我在网上找到的最佳答案来自http://clistax.com/question/qt/153748/st/4eb64b29180c4

我认为从c#在WebBrowser控件HTML文档中注入Javascript的最简单方法是调用&#34; execStrip&#34;将代码作为参数注入的方法。

在此示例中,javascript代码在全局范围内注入并执行:

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

如果要延迟执行,请注入函数并在以下情况后调用它们:

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

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

这适用于Windows窗体和WPF WebBrowser控件。

此解决方案不是跨浏览器,因为&#34; execScript&#34;仅在IE和Chrome中定义。但问题是关于Microsoft WebBrowser控件和IE是唯一支持的。

答案 2 :(得分:1)

动态使这变得容易。您只需要记住我们正在使用Microsoft.mshtml

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('hello world');";
        try { document.head.appendChild(script); } catch (Exception ex) { } // Dynamic property head does not exist.
    }
}

提示:请确保使用Navigated而非Navigating来确保文档已填充。

我发现自己经常使用script.text来设置System.IO.File.ReadAllText(pathToJs)来加载本地javascript文件。由于嵌入式的我们浏览器通常可以过时,因此将polyfill之类的东西注入Windows窗体和WPF WebBrowser应用程序已成为我的标准。

答案 3 :(得分:0)

我发现这有助于在wpf中讨论invokes脚本eqivilent,只是在html中执行脚本代码: http://msdn.microsoft.com/en-us/library/cc452443.aspx