2010-10-27 107 views
11

这似乎很愚蠢。我尝试了一堆不同的方法,但它不起作用。我有一个带有WebBrowser控件的WinForms应用程序。如果我用我的桌面上的原始html文件尝试使用相同的src字符串,我放在一起的src工作正常。但将相同的东西插入WebBrowser控件将不起作用。如何将本地脚本文件添加到WebBrowser控件的HTML中?

这里是我的代码:

HtmlElementCollection head = this.wbPreview.Document.GetElementsByTagName("head"); 
if (head != null) 
{ 
    HtmlElement elm = this.webBrowserControl.Document.CreateElement("script"); 
    string mySource = Environment.CurrentDirectory + @"\MyScriptFile.js"; 
    elm.SetAttribute("src", mySource); 
    elm.SetAttribute("type", "text/javascript"); 
    ((HtmlElement)head[0]).AppendChild(elm); 
} 

web浏览器并没有拿到剧本。但是,如果我将“mySource”更改为外部资源(通过http://),它可以正常工作!

帮助!

回答

11

我想出了您的文章,而玩的东西左右,我下面的工作:

HtmlElementCollection head = webBrowser1.Document.GetElementsByTagName("head"); 
if (head != null) 
{ 
    HtmlElement elm = webBrowser1.Document.CreateElement("script"); 
    elm.SetAttribute("type", "text/javascript"); 
    elm.InnerText = System.IO.File.ReadAllText(Environment.CurrentDirectory + @"\helperscripts.js"); 
    ((HtmlElement)head[0]).AppendChild(elm); 
} 

,所以helperscript.js的所有方法可以使用

webBrowser1.Document.InvokeScript("methodname"); 

,这里作为脚本调用的参考:How to inject Javascript in WebBrowser control?

问候

+1

出现此错误:{“属性在此类型的HtmlElement上不受支持。”} – MonsterMMORPG 2013-07-21 12:45:19

+0

可能只适用于IE – womd 2013-11-14 14:17:01

+0

它可以工作,但是当尝试将大脚本设置为'elm.InnerText'时,进程停止响应一段时间。 – Gildor 2015-06-04 20:49:26

4

尝试将URL添加到file://

+0

我真的这样做了,并试图找到我能找到的所有其他已知术语。我使用Absolutes,Relatives,使用URI来代替,等等。不行。 – IAmAN00B 2010-10-27 13:17:18

0

这是因为安全原因。你需要一个网络服务器来做到这一点,否则你可以访问系统上的任何文件,这将是一个很大的安全漏洞。

在研究与开发模式下,可以e.g在Chrome设置:

chrome.exe --allow-file-access-from-files 

而且你将能够运行代码。

1

There is a long story有关来自MS的“安全修复程序”的变通方法。新行为从IE7开始实施。看看“基地”标签和IE Feature controls

我做了以下内容:

    //TODO: if not mono 
       var executableFilename = Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location); 
       var keys = new[] { executableFilename, [vsname]+".vshost.exe" }; //check! 

       Action<string, object, string> SetRegistryKeyOrFail = 
        (key, val, regStr) => 
         { 
          var reg = 
           Registry.CurrentUser.CreateSubKey(regStr); 
          if (reg == null) throw new Exception("Failed registry: " + regStr); 
          reg.SetValue(key, val); 
         }; 

       foreach (var key in keys) 
       { 
        SetRegistryKeyOrFail(key, 1, @"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BLOCK_LMZ_IMG"); 
        SetRegistryKeyOrFail(key, 0, @"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BLOCK_LMZ_SCRIPT"); 
       } 
相关问题