【问题标题】:How to inject Javascript in the WP7 WebBrowser control?如何在 WP7 WebBrowser 控件中注入 Javascript?
【发布时间】:2011-12-01 21:24:26
【问题描述】:

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

How to inject JavaScript in WebBrowser control?

但我在 WP7 中无法做到这一点,请帮助我。

【问题讨论】:

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


    【解决方案1】:

    很遗憾,WebBrowser.Document 在 WP7 上不可用。但是您可以使用 InvokeScript 创建和调用 JavaScript 函数。看看over here 我描述的方法。

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

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

    【讨论】:

    • 但有些页面可能不包含eval函数
    • @Heinrich Ulbricht 我已经尝试过您的解决方案,但它不适用于我的情况。我想知道你能不能帮忙?我有来自liveside.net/2011/10/21/… Find On Page 选项的 javascript 代码,似乎无法将其正确插入 InvokeScript 函数。我收到错误:80020101 SystemException unhandled.
    • @Matthew 尝试用引号发送您的代码。例如。 webBrowser1.InvokeScript("\" ... 代码在这里... \"");
    • @sma6871 eval 是内置的 JavaScript 函数,无论网页内容如何,​​始终可用。
    • @TomLint,这样的基本页面怎么样:<body></body>?有了这个,eval 肯定 not 与桌面 WebBrowser 一起工作,至少需要一个 <script> 标记。你认为 Windows Phone 不需要它吗?
    【解决方案2】:

    对于桌面版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

    【讨论】:

    • 从我早期的调查来看,settimeout hack 似乎也适用于带有 IE11 的 WPF WebBrowser Control。实际上调用 InvokeScript("settimeout", "ANYFUNCTIONHERE") 会导致 JavaScript 在页面上被激活,因此后续的 eval 调用似乎也可以工作。
    • @jpierson,我确实测试了桌面和 Windows 应用商店应用程序的 setTimeout 技巧,但我没有测试 Windows Phone,这就是这个问题的意义所在。
    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2011-07-26
    • 2019-09-30
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多