【问题标题】:How to inject Javascript in WebBrowser control如何在 WebBrowser 控件中注入 Javascript
【发布时间】:2011-12-21 09:21:27
【问题描述】:

这里有一个很棒的关于 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。

【问题讨论】:

  • HtmlElement 存在于 SYStem.Windows.Browser 和 System.Windows.Forms 中
  • 我很漂亮这个函数也可以写给WPF应用
  • 此代码使用 Winforms 中用于 HtmlElement 和 HtmlDocument 的漂亮包装类。 WPF 没有它们。使用 Winforms 浏览器是一种明显的解决方法。
  • Hans Passant 所以你的意思是这不能在更高级的应用程序 WPF 中完成?

标签: c# wpf webbrowser-control inject


【解决方案1】:

这行得通吗?

    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 的)参考。

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

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

如果这有帮助,请告诉我。

【讨论】:

  • 我需要注入javascript而不是设置元素的属性。
  • 您是否按照我的指示探索了WebBrowser.ObjectForScripting 的范围。
【解决方案2】:

我发现这有助于讨论 wpf 中的 invokescript equivilent 仅在 html 中执行脚本代码: http://msdn.microsoft.com/en-us/library/cc452443.aspx

【讨论】:

    【解决方案3】:

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

    我相信从 c# 向 WebBrowser Control HTML 文档中注入 Javascript 的最简单方法是调用“execStrip”方法,并将要注入的代码作为参数。

    在本例中,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 控件有效。

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

    【讨论】:

      【解决方案4】:

      Dynamic 让这一切变得简单。你只需要记住我们正在使用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 以确保填充文档。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-26
        • 2019-09-30
        • 1970-01-01
        • 2015-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多