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


这看起来真的很蠢。我尝试了一些不同的方法,但它只是不起作用。我有一个带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://),它可以正常工作!

帮帮我!


4564
2017-10-27 02:40


起源



答案:


我找到了你的帖子,同时玩了以下为我工作的东西:

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?

问候


11
2018-03-22 01:08



收到此错误:{“此类型的HtmlElement不支持该属性。”} - MonsterMMORPG
可能只在IE中工作 - womd
它有效,但在尝试设置一个大脚本时 elm.InnerText,这个过程刚刚停止响应了很长一段时间。 - Gildor


答案:


我找到了你的帖子,同时玩了以下为我工作的东西:

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?

问候


11
2018-03-22 01:08



收到此错误:{“此类型的HtmlElement不支持该属性。”} - MonsterMMORPG
可能只在IE中工作 - womd
它有效,但在尝试设置一个大脚本时 elm.InnerText,这个过程刚刚停止响应了很长一段时间。 - Gildor


尝试添加 file:// 到URL。


4
2017-10-27 02:43



我实际上是这样做的,并尝试了我能找到的所有其他已知的命名法。我已经使用了Absolutes,Relatives,使用了URI等等。不行。 - IAmAN00B


有一个很长的故事 关于MS的“安全修复”的解决方法。从IE7开始实施了新的行为。看看“基础”标签和 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");
                }

1
2017-08-04 16:10





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

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

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

您将能够运行您的代码。


0
2018-06-03 18:07