如何在Xamarin中的WebView中设置文本框的默认值?

问题描述

我有一个简单的登录网页,该网页在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>

此处正在运行屏幕截图。

enter image description here