Передайте текст с javascript в WebView из Xamarin.Forms - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь отправить текст в элемент управления webView из xamarin.forms. Есть множество решений, которые я почти все пробовал ... ;-)

Так что на самом деле они отлично работают, но мне всегда нужно нажимать кнопку в файле html, который я загружаю в этот webView , что я могу передать текст в файл html. Но я бы хотел передать текст, не нажимая на эту кнопку. Текст должен быть там, когда веб-просмотр загружен.

Вот код:

В xaml.cs я загружаю WebView:

  protected override void OnAppearing()
    {
        base.OnAppearing();

        webViewElement.Source = new HtmlWebViewSource();
        webViewElement.Source = DependencyService.Get<IBaseUrl>().Get();

        webViewElement.RegisterAction(ExecuteActionFromJavascript);

        ExecuteSetFromJavascript();
    }

затем с ExecuteSetFrom Javascript () я вызываю функцию, которая находится в файле html:

  private async void ExecuteSetFromJavascript()
    {
        var result = "Hello";
        if (result != null)
        {
          var test =  await webViewElement.EvaluateJavaScriptAsync($"updatetextonwebview('{result}')");
        }
    }

это функция в файле html:

  function updatetextonwebview(text) {

                                alert(text);

                                   // document.getElementById("content").innerHTML = text;
                                }

Итак, теперь страница должна предупреждать "Hello", когда вызывается updatetextonwebview.

, но этого не происходит. Возможно, страница html не готова, когда я вызываю эту функцию!

Кто-нибудь знает, как я могу найти свое решение?

Заранее спасибо ...

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Мое решение: в HybridWebView я добавил свойство

using System;
using Xamarin.Forms;

namespace CustomRenderer

{
    public class HybridWebView : WebView
    {
        Action<string> action;

        public static readonly BindableProperty UriProperty = BindableProperty.Create(
            propertyName: "Uri",
            returnType: typeof(string),
            declaringType: typeof(HybridWebView),
            defaultValue: default(string));

        public static BindableProperty QuestionProperty = BindableProperty.Create(
            propertyName: "Question",
            returnType: typeof(string),
            declaringType: typeof(HybridWebView),
            defaultValue: default(string));

        public static BindableProperty AnswerProperty = BindableProperty.Create(
            propertyName: "Answer",
            returnType: typeof(string),
            declaringType: typeof(HybridWebView),
            defaultValue: default(string));

        public string Uri
        {
            get { return (string)GetValue(UriProperty); }
            set { SetValue(UriProperty, value); }
        }

        public string Question
        {
            get { return (string)GetValue(QuestionProperty); }
            set { SetValue(QuestionProperty, value); }
        }

        public string Answer
        {
            get { return (string)GetValue(AnswerProperty); }
            set { SetValue(AnswerProperty, value); }
        }

        public void RegisterAction(Action<string> callback)
        {
            action = callback;
        }

        public void Cleanup()
        {
            action = null;
        }

        public void InvokeAction(string data)
        {
            if (action == null || data == null)
            {
                return;
            }
            action.Invoke(data);
        }
    }
}

, к которому я могу получить доступ в JavaScriptWebViewClient, а на OnPageFinished я могу отправить данные на веб-страницу.

  public class JavascriptWebViewClient : FormsWebViewClient
{
    string _javascript;
    string _question;
    private string _answer;

    public JavascriptWebViewClient(HybridWebViewRenderer renderer, string javascript, string question, string answer) : base(renderer)
    {
        _javascript = javascript;
        _answer = answer;
        _question = question;
    }

    public override void OnPageFinished(WebView view, string url)
    {
        base.OnPageFinished(view, url);


        view.EvaluateJavascript($"factorial({_question}, {_answer})", null);

        view.EvaluateJavascript(_javascript, null);
    }
}
0 голосов
/ 05 мая 2020

То, что вы хотите, называется HybridWebView . Это означает, что он может как получать, так и отправлять данные.

Я вижу много несоответствий и проблем с кодом, который вы предоставили - почему вы настраиваете WebView в OnAppearing, почему источник устанавливается дважды, et c.

Поскольку предоставленного кода недостаточно и он полон проблем и вопросов - вместо того, чтобы пытаться выяснить, где он go ошибся, вы должны следовать официальному руководству по созданию HybridWebView от Microsoft - Настройка WebView .

Это работает, а также у вас есть готовое решение в GitHub здесь .

Если у вас есть еще вопросы, не стесняйтесь их задавать, но я считаю, что руководство довольно простое.

...