如何在WP7 WebBrowser控件中注入Javascript?

时间:2011-12-01 21:24:26

标签: c# javascript silverlight windows-phone-7

我可以通过此链接在C#windows窗体中的WebBrowser控件中注入JavaScript

How to inject JavaScript in WebBrowser control?

但我不能在WP7中这样做,请帮助我。

2 个答案:

答案 0 :(得分:7)

不幸的是,{7}在WP7上无法使用WebBrowser.Document。但您可以使用InvokeScript创建和调用JavaScript函数。看看over here我在哪里描述。

简而言之:您不使用.Document和C#,而是创建一段JavaScript。然后使用此脚本作为参数调用eval以调用它。像这样:

webBrowser1.InvokeScript("eval", "  ...code goes here... ");

答案 1 :(得分:1)

对于桌面WebBrowser(WinForms / WPF),<script>工作的网页上必须至少有一个InvokeScript("eval", ...)标记。即,如果页面不包含任何JavaScript(例如<body></body>),则eval不会按原样运行。

我没有安装Windows Phone SDK /模拟器来验证Windows Phone WebBrowser是否也是如此。

尽管如此,以下适用于Windows应用商店应用。诀窍是先使用this.webBrowser.InvokeScript("setTimeout", ...)注入一些JavaScript。我使用它而不是execScript,这是自IE11以来不推荐使用的。

async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    // 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'" });
}

如果有人可以确认WP WebBrowser是否有效,我将不胜感激。在上面的代码中,LoadCompleted应该用于WP而不是NavigationCompleted,并且WebBrowser.IsScriptEnabled必须设置为true