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

11

这似乎非常愚蠢。我尝试了很多不同的方法,但都没有成功。我有一个带有WebBrowser控件的WinForms应用程序。如果我尝试使用桌面上的原始html文件并使用相同的src字符串,那么我组合的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个回答

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

以下内容为引用,用于脚本调用的参考: 如何在WebBrowser控件中注入Javascript?

你好


1
出现以下错误: {"在此类型的HtmlElement上不支持该属性。"} - Furkan Gözükara
它可以工作,但是当尝试将一个大脚本设置到 elm.InnerText 时,该过程会停止响应相当长的一段时间。 - Gildor
根据您的Windows功能仿真版本(较旧的ie),elm.InnerText可能会失败。相反,我们可以使用elm.SetAttribute("TEXT", ... ) - clamchoda

4
尝试在URL中添加file://

我实际上已经尝试过这样做,并尝试了我能找到的所有其他已知命名方式。我已经使用了绝对路径、相对路径、使用URI等,但都不行。 - IAmAN00B

1

有一个长故事关于 MS 的“安全修复”工作方法。从 IE7 开始实施了新的行为。看一下“base”标签和IE 功能控件

我做了以下操作:

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

0
这是出于安全原因。否则,您可以访问系统上的任何文件,这将是一个巨大的安全漏洞。您需要一个Web服务器才能实现这一点。
在开发模式下,您可以在Chrome上设置:
chrome.exe --allow-file-access-from-files  

然后你就可以运行你的代码了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接