Веб-просмотр.Eval не вызывает функцию javascript внутри моих форм HTML — Xamarin

#javascript #html #xamarin #webview #xamarin.forms

#javascript #HTML #xamarin #webview #xamarin.forms

Вопрос:

Я пытаюсь использовать функцию Eval элемента управления WebView для запуска функции javascript в моем WebView. WebView правильно загрузил мой HTML с помощью функции Javascript, но когда я использую WebView.Eval(javascript_function), ничего не происходит, и функция не вызывается. Вот мой CS-код:

 var _Script = string.Format("enableBeacon("{0}") ", id);
        _WebViewMap.Eval(_Script);
  

Здесь мой Xaml:

 <StackLayout VerticalOptions="Center" HorizontalOptions="Center">
<WebView x:Name="WebViewMap" WidthRequest="1000" HeightRequest="1000" Source="{Binding HtmlSource.HtmlUrlSource}"/> 
</StackLayout>
  

Вот моя функция Javascript:

 function enableBeacon(id)
{
 var myBeacon = document.getElementById(id);
 myBeacon.style.display = "";
alert("I am an alert box!");
}
  

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

Комментарии:

1. Все это выглядит правильно. Однако не уверен, насколько требователен WebView.Eval() метод к пробелам. В вашем примере кода после закрывающей круглой скобки отображается дополнительный пробел. У вас есть "enableBeacon("{0}") " , поэтому, возможно, попробуйте "enableBeacon("{0}")" отметить, что после закрывающей круглой скобки нет дополнительного пробела.

2. Я попытался удалить пустое пространство из моей функции «enableBeacon», но все равно WebView не вызывает Javascript внутри..

Ответ №1:

Пожалуйста, попробуйте это:

 webView.Navigated  = (o, s) => {
 webView.Eval("alert('text')");
 };
  

Комментарии:

1. Добавьте некоторое объяснение с ответом о том, как этот ответ помогает OP в устранении текущей проблемы

Ответ №2:

Я считаю, что Камил был прав.

Веб-страница должна завершить загрузку, прежде чем вы сможете вызвать Javascript с помощью WebView.Eval.

Вот мой код для демонстрации:

 public partial class WebViewPage : ContentPage
{
    public WebViewPage ()
    {
        InitializeComponent ();
        BindingContext = new WebViewPageViewModel();
        this.Title = App.CurrentProfileHeader;

        MyWebView.Navigated  = MyWebView_Navigated;

    }

    private void MyWebView_Navigated(object sender, WebNavigatedEventArgs e)
    {
        string token = "Hello from the C# World! 2";
        MyWebView.Eval("displayToken('"   token   "')");
    }

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

        string token = "Hello from the C# World!";
        MyWebView.Eval("displayToken('"   token   "')");

    }
}


<html>
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body onload="myFunction()">
    <p>Hello Cruel World!</p>
    <script type="text/javascript">
        function displayToken(token)
        {
            alert(token);
        }
        function myFunction() {
            alert("Page has loaded");
        }

    </script>
</body>
</html>
  

Используя этот код, вы должны увидеть, что «onappearing» срабатывает перед событием загрузки HTML-страницы. Однако событие навигации срабатывает после полной загрузки HTML-страницы.