c#的webbrowser调用本地javascript脚本?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#的webbrowser调用本地javascript脚本?相关的知识,希望对你有一定的参考价值。

运行后webbrowser自动导航到“广东移动”:http://gd.10086.cn/,这个功能已经完成了。
然后点击“开始”按钮,触发一个本地js,对网页进行操作。测试的js里放一条“alert('hello world');”就行了。但是点击“开始”后,报错了:第1行,第1个字符,无效字符。

文字不好叙述,有兴趣的大侠留下邮箱,我发代码。万分感谢。

开发环境:vs2010

参考技术A 你好!
你的意思是调用你自己写的JS文件,而不是链接过去页面里面的脚本对吧!
其实你可以换个思路的。
webBrowser1.Navigate(http://gd.10086.cn/);
webBrowser1链接这个网页后,它的DocumentText 里面就有内容了。这个时候你可以把你的脚本动态写到网页上去的。示例:
webBrowser1.DocumentText + = " <script type='text/javascript'>function Alert_ alert('hello world'); </script>";
然后再使用方法webBrowser1.Document.InvokeScript("Alert_");调用即可
如果是http://gd.10086.cn/本身存在的脚本,直接用上面的方法就行了。追问

威武!是这意思,刚开始定义个名为ele的script,ele.setAttribut("text", "alert(hello world)");插入到DocumentText中,是可以执行。但是我想,js脚本会很大,建立单独的js脚本好点,于是把alert("hello world");放在my.js中,然后ele.setAttribute("src", "d:/my.js");然后就报错了

追答

有尝试一下,貌似不可以,我这边是报权限的错误。这个可能需要研究了,度娘吧,少年!忘记要你的代码了。

495973872@qq.com

追问

htmlElement ele = webBrowser1.Document.CreateElement("script");
ele.SetAttribute("text", "alert('hello webbrowser')"); webBrowser1.Document.Body.AppendChild(ele);

这样是可以的,但是调用本地src就不行了。。。代码已发。

本回答被提问者采纳
参考技术B 295689412@qq.com追问

代码已发,谢谢

追答

刚下班吃饭休息下,就试试

参考技术C chentsong@163.com 我试试追问

代码已发,谢谢

参考技术D 1297742264@qq.com追问

代码已发,谢谢

C# WebBrowser HTML 与脚本和图像的引用

【中文标题】C# WebBrowser HTML 与脚本和图像的引用【英文标题】:C# WebBrowser HTML with references to scripts and images 【发布时间】:2010-09-21 10:03:34 【问题描述】:

我正在使用 WebBrowser 控件编写一个 C# 应用程序,我希望我显示的所有内容都来自嵌入式资源 - 不是静态本地文件,也不是远程文件。

将控件的初始文本设置为嵌入的 HTML 文件非常适用于受this post启发的这段代码:

browser.DocumentText=loadResourceText("myapp.index.html");

private string loadResourceText(string name)

    Assembly assembly = Assembly.GetExecutingAssembly();
    Stream stream = assembly.GetManifestResourceStream(name);
    StreamReader streamReader = new StreamReader(stream);
    String myText = streamReader.ReadToEnd();
    return myText;

尽管如此,HTML 中引用的文件 - javascript、&lt;img src="whatever.png"/&gt; 等图像都不起作用。我发现了类似的问题here 和here,但两者都没有问确切我的意思,即引用exe 中的嵌入 资源,而不是文件。

我尝试了res://... 并使用了&lt;base href='...",但似乎都不起作用(尽管我可能没有做对)。

也许(按照我自己对 this question 的建议),使用一个小的嵌入式 C# 网络服务器是唯一的方法......但我会认为有一些技巧可以实现这一点?

谢谢!

【问题讨论】:

【参考方案1】:

我可以看到三种方法来实现这一点:

1:将需要的文件写入临时区域的平面文件,将WebBrowser导航到html文件,页面加载后将其删除

2:正如你所说,一个嵌入式网络服务器 - 也许是 HttpListener - 但请注意,这使用 HTTP.SYS,因此需要管理员权限(或者你需要 pre-open the port)

3: 类似 1,但使用命名管道服务器来避免写入文件

不得不说,第一种简单很多,需要零配置。

【讨论】:

【参考方案2】:
/// Hi try this may help u.
private string CheckImages(ExtendedWebBrowser browser)

      StringBuilder builderHTML = new StringBuilder(browser.Document.Body.Parent.OuterHtml);
      ProcessURLS(browser, builderHTML, "img", "src");                
      ProcessURLS(browser, builderHTML, "link", "href");
      // ext...

      return builderHTML.ToString();



private static void ProcessURLS(ExtendedWebBrowser browser, StringBuilder builderHTML, string strLink, string strHref)

     for (int k = 0; k < browser.Document.Body.Parent.GetElementsByTagName(strLink).Count; k++)
     
          string strURL = browser.Document.Body.Parent.GetElementsByTagName(strLink)[k].GetAttribute(strHref);
          string strOuterHTML = browser.Document.Body.Parent.GetElementsByTagName(strLink)[k].OuterHtml;
          string[] strlist = strOuterHTML.Split(new string[]  " " , StringSplitOptions.None);
          StringBuilder builder = new StringBuilder();
          for (int p = 0; p < strlist.Length; p++)
          
              if (strlist[p].StartsWith(strHref))                        
                  builder.Append (strlist[p].Contains("http")? strlist[p] + " ":
                      (strURL.StartsWith("http") ?  strHref + "=" + strURL + " ":
                           strHref + "= " + "http://xyz.com" + strURL + " " ));                           
              else
                  builder.Append(strlist[p] + " ");
          

          builderHTML.Replace(strOuterHTML, builder.ToString());
      

【讨论】:

以上是关于c#的webbrowser调用本地javascript脚本?的主要内容,如果未能解决你的问题,请参考以下文章

在 WebBrowser 的文档中从 JavaScript 调用 C# 代码

在 C# webBrowser 控件中调用 Javascript 函数

C# webbrowser 里如何调用网页里的js函数?

C# webbrowser 调用JS函数 求教!!

MFC中WebBrowser.Navigate方法如何调用本地的.htm文件?

如何在 C# 中由 .NET WebBrowser 控件托管的页面中调用 JavaScript 方法并将参数传递给 JavaScript 方法? [复制]