简体   繁体   English

如何从Webbrowser C#返回javascript函数值

[英]how to return javascript function value from webbrowser c#

hi Awesomium browser provide JavaScript execute with result method to return values like this : 嗨,Awesomium浏览器向JavaScript提供了带有result方法的execute以返回如下值:

private const String JS_FAVICON = "(function(){links = document.getElementsByTagName('link'); wHref=window.location.protocol + '//' + window.location.hostname + '/favicon.ico'; for(i=0; i<links.length; i++){s=links[i].rel; if(s.indexOf('icon') != -1){ wHref = links[i].href }; }; return wHref; })();";
string val = webControl.ExecuteJavascriptWithResult(JS_FAVICON); 

however i need to perform this with c# builtin browser how to do it, i think there is method "webBrowser1.Document.InvokeScript" not sure how to use it.. 但是我需要使用c#内置浏览器执行此操作,我认为有方法“ webBrowser1.Document.InvokeScript”不确定如何使用它。

edited... this how Awesomium browser return the value: 编辑...这是Awesomium浏览器如何返回值:

private void Awesomium_Windows_Forms_WebControl_DocumentReady(object  sender, UrlEventArgs e)
    {
        // DOM is ready. We can start looking for a favicon.
        //UpdateFavicon();
    }


 private void UpdateFavicon()
    {
        // Execute some simple javascript that will search for a favicon.
        string val = webControl.ExecuteJavascriptWithResult(JS_FAVICON);

        // Check for any errors.
        if (webControl.GetLastError() != Error.None)
            return;

        // Check if we got a valid response.
        if (String.IsNullOrEmpty(val) || !Uri.IsWellFormedUriString(val, UriKind.Absolute))
            return;

        // We do not need to perform the download of the favicon synchronously.
        // May be a full icon set (thus big).
        Task.Factory.StartNew<Icon>(GetFavicon, val).ContinueWith(t =>
        {
            // If the download completed successfully, set the new favicon.
            // This post-completion procedure is executed synchronously.

            if (t.Exception != null)
                return;

            if (t.Result != null)
                this.Icon = t.Result;

            if (this.DockPanel != null)
                this.DockPanel.Refresh();
        },
        TaskScheduler.FromCurrentSynchronizationContext());
    }

    private static Icon GetFavicon(Object href)
    {
        using (WebClient client = new WebClient())
        {
            Byte[] data = client.DownloadData(href.ToString());

            if ((data == null) || (data.Length <= 0))
                return null;

            using (MemoryStream ms = new MemoryStream(data))
            {
                try
                {
                    return new Icon(ms, 16, 16);
                }
                catch (ArgumentException)
                {
                    // May not be an icon file.
                    using (Bitmap b = new Bitmap(ms))
                        return Icon.FromHandle(b.GetHicon());
                }
            }
        }
    }

and this is how i did it with WinForm browser: 这就是我使用WinForm浏览器的方法:

 private void webBrowser1_DocumentCompleted(object sender,   WebBrowserDocumentCompletedEventArgs e)
 {
        UpdateFavicon();
 }
 private void UpdateFavicon()
 {
   var obj = webBrowser1.Document.InvokeScript("_X_");
   string val = webBrowser1.DocumentText = "<script> function _X_(){return " + JS_FAVICON + ";} </script>"; 
 }

it is not imposible as @JohnSmith says 正如@JohnSmith所说,这是不可能的

With a simple trick you can get the return value from javascript 一个简单的技巧,您可以从javascript获取返回值

string JS_FAVICON = "(function(){links = document.getElementsByTagName('link'); wHref=window.location.protocol + '//' + window.location.hostname + '/favicon.ico'; for(i=0; i<links.length; i++){s=links[i].rel; if(s.indexOf('icon') != -1){ wHref = links[i].href }; }; return wHref; })();";

webBrowser1.DocumentCompleted += (s, e) =>
{
    var obj = webBrowser1.Document.InvokeScript("_X_");
    //obj will be about:///favicon.ico
    //write your code that handles the return value here
};

string val = webBrowser1.DocumentText = "<script> function _X_(){return " + JS_FAVICON + ";} </script>";

But since we can get the value in DocumentCompleted handler, you can not return it from calling method directly. 但是,由于我们可以在DocumentCompleted处理程序中获取该值,因此您不能直接从调用方法中返回它。 If you can continue your work, in that method, then no problem. 如果您可以用这种方法继续工作,那就没问题了。 If not, then it needs some more tricks to get it done. 如果没有,那么它需要更多技巧来完成它。 Let me know... 让我知道...

UPDATE 更新

Here is full working code, Just invoke TestJavascript somewhere in your form. 这是完整的工作代码,只需在表单中的某处调用TestJavascript

async void TestJavascript()
{
    string JS_FAVICON = "(function(){links = document.getElementsByTagName('link'); wHref=window.location.protocol + '//' + window.location.hostname + '/favicon.ico'; for(i=0; i<links.length; i++){s=links[i].rel; if(s.indexOf('icon') != -1){ wHref = links[i].href }; }; return wHref; })();";

    var retval = await Execute(webBrowser1, JS_FAVICON);
    MessageBox.Show(retval.ToString());
}

Task<object> Execute(WebBrowser wb,  string anonJsFunc)
{
    var tcs = new TaskCompletionSource<object>();
    WebBrowserDocumentCompletedEventHandler documentCompleted = null;
    documentCompleted = (s, e) =>
    {
        var obj = wb.Document.InvokeScript("_X_");
        tcs.TrySetResult(obj);
        wb.DocumentCompleted -= documentCompleted; //detach
    };

    wb.DocumentCompleted += documentCompleted; //attach
    string val = wb.DocumentText = "<script> function _X_(){return " +
                                    anonJsFunc +
                                    ";} </script>";

    return tcs.Task;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM