如何将本地脚本文件添加到WebBrowser控件的HTML中?

时间:2010-10-27 02:40:40

标签: c# javascript html webbrowser-control

这看起来真的很蠢。我尝试了一些不同的方法,但它只是不起作用。我有一个带WebBrowser控件的WinForms应用程序。如果我使用相同的src字符串在我的桌面上尝试使用原始html文件,我放在一起的src工作正常。但是将相同的东西插入WebBrowser控件将无法正常工作。

这是我的代码:

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

WebBrowser无法获取脚本。但是,如果我将“mySource”更改为外部资源(通过http://),它可以正常工作!

帮助!

4 个答案:

答案 0 :(得分: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 :(得分:4)

尝试将file://添加到网址。

答案 2 :(得分: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");
                }

答案 3 :(得分:0)

这是出于安全原因。您需要一个Web服务器来执行此操作,否则您可以访问系统上的任何文件,这将是一个很大的安全漏洞。

在开发模式中,您可以在chrome上设置例如:

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

您将能够运行您的代码。