如何新的JavaScript附加到当前的HTML浏览器控件(How to append new ja

2019-10-20 18:30发布

我想插入我自己的JavaScript呈现HTML(index.html的 - 目前在IsolatedStorage)在运行时。 为了充分利用JavaScript调用C# webBrowser_ScriptNotify 。 我将如何做到这一点,这是我努力实现这一目标。

string script = " <script type=\"text/javascript\"> function scriptNotify() { window.external.notify(\"runtime\");}</script>";
byte[] param = GetBytes(script);

webBrowser.Navigate(new Uri("/index.html", UriKind.Relative), param,"Content-Type: application/x-www-form-urlencoded");


private void webBrowser_ScriptNotify(object sender, NotifyEventArgs e)
{            
   if (e.Value.ToString().Equals("runtime"))
   {
       Debug.WriteLine("Call from dynamic javascript");
   }
}   

static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

更新

在这里我的新尝试注入脚本标签在当前打开的HTML页面。

var scriptString = "var script=document.createElement('script');"
                                   + "script.type=\"text/javascript\";"
                                   + "script.InnerHTML=\"function callMe(){window.external.notify(\"runtime\")};\""
                                    + "document.getElementsByTagName('head')[0].appendChild(script);";

webBrowser.InvokeScript("eval", scriptString);

它与一些系统错误而失败。

System.SystemException was unhandled
Message: An unhandled exception of type 'System.SystemException' occurred in Microsoft.Phone.Interop.ni.dll
Additional information: An unknown error has occurred. Error: 80020101.

堆栈跟踪:

at Microsoft.Phone.Controls.NativeMethods.ValidateHResult(Int32 hr)
   at Microsoft.Phone.Controls.WebBrowserInterop.InvokeScript(String scriptName, String[] args)
   at Microsoft.Phone.Controls.WebBrowser.InvokeScript(String scriptName, String[] args)
   at WebBrowserJSTest.MainPage.webBrowser_LoadCompleted(Object sender, NavigationEventArgs e)

提前致谢。

Answer 1:

需要注意的是eval众所周知,当有已经至少一个工作<script>在页面上标记。

下面的解决方案使用webBrowser.InvokeScript("setTimeout", ...)执行一些JavaScript(,从而使eval )。 我测试了Windows商店应用这种方法,它在那里工作。 我希望它与Windows Phone的工作太,希望你能确认。

async Task ExecScriptNotify()
{
    // load a blank page
    var tcsLoad = new TaskCompletionSource<object>();
    this.webBrowser.NavigationCompleted += (s, eArgs) =>
        tcsLoad.TrySetResult(Type.Missing);
    this.webBrowser.NavigateToString("<body></body>");
    await tcsLoad.Task;

    // first add a script via "setTimeout", JavaScript gets initialized
    var tcsInit = new TaskCompletionSource<object>();
    this.webBrowser.ScriptNotify += (s, eArgs) =>
    {
        if (eArgs.Value == "initialized")
            tcsInit.TrySetResult(Type.Missing);
    };
    this.webBrowser.InvokeScript("setTimeout", 
        new string[] { "window.external.notify('initialized')", "0" });
    await tcsInit.Task;

    // then use "eval"
    this.webBrowser.InvokeScript("eval", 
        new string[] { "document.body.style.backgroundColor = 'yellow'" });
}


Answer 2:

WebBrowser.InvokeScript方法



Answer 3:

尝试是这样的:

字符串脚本=“//你的JS方法”; 串elementInnerText =(字符串)WebBrowser1.InvokeScript( “EVAL”,脚本);



文章来源: How to append new javascript to current HTML WebBrowser Control