如何从浏览器c#返回javascript函数值
本文关键字:javascript 函数 返回 浏览器 | 更新日期: 2023-09-27 18:10:48
Awesomium浏览器提供JavaScript execute with result方法返回如下值:
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);
然而,我需要执行这与c#内置浏览器如何做到这一点,我认为有方法"webBrowser1.Document。不知道如何使用它…
编辑……这就是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());
}
}
}
}
,这是我在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>";
}
正如@JohnSmith所说的,这不是不可能的
用一个简单的技巧你可以从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>";
但是由于我们可以在DocumentCompleted
处理程序中获得该值,因此不能直接调用方法返回该值。如果你能用这种方法继续你的工作,那就没问题了。如果没有,那么它需要更多的技巧来完成它。让我知道……
这里是完整的工作代码,只需调用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;
}