Как добавить локальный файл script в HTML-код элемента управления WebBrowser?
Это кажется действительно глупым. Я пробовал кучу разных способов, и он просто не работает. У меня есть приложение WinForms с элементом управления WebBrowser. Если я попытаюсь с сырым 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 не получает script. Однако, если я изменю "mySource" на внешний ресурс (через http://), он отлично работает!
Help!
Ответы
Ответ 1
Я поднялся на ваш пост, играя со своими работами:
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");
здесь как ссылка для script invoke: Как добавить Javascript в элемент управления WebBrowser?
привет
Ответ 2
Попробуйте добавить file://
к URL-адресу.
Ответ 3
Существует длинная история об обходных решениях этого "исправления безопасности" от 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");
}
Ответ 4
Это из соображений безопасности. Для этого вам нужен веб-сервер, иначе вы можете получить доступ к любому файлу в системе, которая будет большой дырой в безопасности.
В режиме разработки вы можете установить, например, на хром:
chrome.exe --allow-file-access-from-files
И вы сможете запустить свой код.