问题描述
我有一个简单的登录网页,该网页在Xamarin的ContentPage中的WebView中加载。我已经添加了JavaScript渲染器,如下所示(https://www.xamarinhelp.com/xamarin-forms-webview-executing-javascript/),它工作正常。我可以通过这种方式检索文本框的值:
var email = await EvaluateJavascript("document.getElementById('Email').value;");
但是有一种方法可以在WebView加载时设置文本框的默认值。在这里不能更改WebView的html。
我尝试这样做,但是不起作用:
await EvaluateJavascript("document.getElementById('Email').value = 'defaultemail@email.com';");
解决方法
有没有一种方法可以在WebView加载时设置文本框的默认值。在这里不能更改WebView的html。
此答案为否,无法实现。如果我们要从html设置textBox的值。此网络视图此网络视图必须完成加载。
因此,当您使用await EvaluateJavascript("document.getElementById('Email').value = 'defaultemail@email.com';");
时,它不起作用。
如果我们使用await EvaluateJavascript("document.getElementById('Email').value = 'defaultemail@email.com';");
当webview加载完成时,它将起作用。
因此,我们可以创建Webview的自定义渲染器。覆盖OnPageFinished
中的MyWebviewClient
方法,如果页面加载完成,我们可以发送messageCenter。
[assembly: ExportRenderer(typeof(WebView),typeof(MyWebview))]
namespace XFormsWebview.Droid
{
class MyWebview : WebViewRenderer
{
public MyWebview(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
Control.Settings.JavaScriptEnabled = true;
Control.SetWebViewClient(new MyWebviewClient());
}
}
internal class MyWebviewClient : Android.Webkit.WebViewClient
{
public override void OnPageFinished(Android.Webkit.WebView view,string url)
{
base.OnPageFinished(view,url);
MessagingCenter.Send<App,string>(App.Current as App,"OpenPage","finish");
}
}
}
在PCL中,如果我们收到消息。我们可以通过 mywebview.EvaluateJavaScriptAsync("document.getElementById('txt').value= 'my url that I want to copy';");
来设置它的值。
namespace XFormsWebview
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
mywebview.Source = LoadHTMLFileFromResource();
MessagingCenter.Subscribe<App,string>(App.Current,(snd,arg) =>
{
Device.BeginInvokeOnMainThread(() => {
mywebview.EvaluateJavaScriptAsync("document.getElementById('Email').value= 'defaultemail@email.com';");
});
});
}
HtmlWebViewSource LoadHTMLFileFromResource()
{
var source = new HtmlWebViewSource();
// Load the HTML file embedded as a resource in the .NET Standard library
var assembly = typeof(MainPage).GetTypeInfo().Assembly;
var stream = assembly.GetManifestResourceStream("XFormsWebview.indexd.html");
using (var reader = new StreamReader(stream))
{
source.Html = reader.ReadToEnd();
}
return source;
}
}
}
这是我的html页面。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>www.test.net</title>
</head>
<body>
<script language="javascript">
function c1(myvalue)
{
var t=document.getElementById("Email");
t.value="ttt";
}
</script>
<input type="text" id="Email" value="init content" size="30"/>
<input type="button" value="change" name="btn" onclick="c1();" />
</body>
</html>
此处正在运行屏幕截图。