2010-10-27 91 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"); 
       } 
相關問題