【问题标题】:Call JavaScript function in Xamarin在 Xamarin 中调用 JavaScript 函数
【发布时间】:2020-06-12 07:54:28
【问题描述】:

如何在 Xamarin 中调用 JavaScript 方法?我找到了这个库(https://github.com/chkn/HybridKit),但不幸的是,这个工具可以在 JavaScript 中调用 C# 函数。对于 Xamarin.Forms,我找到了一种解决方案 https://docs.microsoft.com/en-au/xamarin/xamarin-forms/app-fundamentals/custom-renderer/hybridwebview

【问题讨论】:

    标签: xamarin.android


    【解决方案1】:

    你可能想在C#中调用html JavaScript函数,如果可以,你可以看看:

    有index.html,在PCL中添加,设置Build Action为EmbeddedResource,有一个函数,名为printMultiplicationTable

    <html>
    <body>
    <script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
    <div id='multiplicationtable'></div>
    <script type="text/javascript">
        function printMultiplicationTable(num, stop)
    {
    var number = parseInt(num);
    var stopNumber = parseInt(stop);
    
    $('#multiplicationtable').empty();
    for (var index = 1; index <= stopNumber; index++) {
        $('#multiplicationtable').append(number + ' x ' + index + " = " + number * index + '<br/>');
    }
    }</script>
    </body>
    </html>
    

    现在,你想在 C# 中调用这个 JavaScript 函数,

    <StackLayout>
        <Label
            FontSize="Medium"
            HorizontalOptions="Center"
            Text="Multiplication Table" />
        <StackLayout HorizontalOptions="Center" Orientation="Horizontal">
            <Label Text="Number: " VerticalOptions="Center" />
            <Entry
                x:Name="numberEntry"
                Text="5"
                WidthRequest="40" />
            <Label Text="Stop:" VerticalOptions="Center" />
            <Entry
                x:Name="stopEntry"
                Text="10"
                WidthRequest="40" />
        </StackLayout>
        <Button
            x:Name="callJavaScriptButton"
            Clicked="OnCallJavaScriptButtonClicked"
            Text="Call JavaScript" />
        <WebView
            x:Name="webView"
            HorizontalOptions="FillAndExpand"
            VerticalOptions="FillAndExpand" />
    </StackLayout>
    
     public MainPage()
        {
            InitializeComponent();
            webView.Source = LoadHTMLFileFromResource();
        }
        HtmlWebViewSource LoadHTMLFileFromResource()
        {
            var source = new HtmlWebViewSource();
    
            // Load the HTML file embedded as a resource in the PCL
            var assembly = typeof(MainPage).GetTypeInfo().Assembly;
            var stream = assembly.GetManifestResourceStream("CallJavaScript.index.html");
            using (var reader = new StreamReader(stream))
            {
                source.Html = reader.ReadToEnd();
            }
            return source;
        }
    
        private void OnCallJavaScriptButtonClicked(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(numberEntry.Text) || string.IsNullOrWhiteSpace(stopEntry.Text))
            {
                return;
            }
    
            int number = int.Parse(numberEntry.Text);
            int end = int.Parse(stopEntry.Text);
    
            webView.Eval(string.Format("printMultiplicationTable({0}, {1})", number, end));
        }
    

    这是我的示例,你可以从 github 获取:

    https://github.com/CherryBu/CallJavaScript

    更新:

    再次更新:

    如果你想从C#调用html JavaScript函数,你可以在MainActivity.cs中配置webview:

      WebSettings settings = webview1.Settings;
            settings.JavaScriptEnabled = true;
            // load the javascript interface method to call the foreground method
            //webview1.AddJavascriptInterface(new MyJSInterface(this), "CSharp");
            webview1.SetWebViewClient(new WebViewClient());        
            webview1.LoadUrl("file:///android_asset/login.html");
    

    请在 Assets 文件夹中添加 html 文件,并将 BuildAction 设置为 AndroidAsset。

    然后C#调用JS中的方法并获取回调值

    class EvaluateBack : Java.Lang.Object, IValueCallback
    {
    
        public void OnReceiveValue(Object value)
        {
    
            Toast.MakeText(Android.App.Application.Context,value.ToString(), ToastLength.Short).Show();// you will get the value "100"
        }
    
    
    }
    
    webview1.EvaluateJavascript("javascript: check();", new EvaluateBack());
    

    这是github上的示例,你可以看看:

    https://github.com/CherryBu/CallJavaFunction

    【讨论】:

    • 感谢您的示例,但是当我尝试运行您的项目时,我得到了如下信息: [INFO:CONSOLE(1)] "Uncaught ReferenceError: printMultiplicationTable is not defined",来源:( 1)03-02 09:38:14.234 I/铬(13561):
    • 当我尝试在真实设备上运行时,我得到了 Uncaught ReferenceError: $ is not defined",来源:file:///android_asset/ (13)
    • @Kamerel 您是否尝试下载我的示例进行测试?因为我在运行我的项目时没有任何问题,你可以看到 gif。所以请尝试从github下载我的示例进行测试:github.com/CherryBu/CallJavaScript/tree/master/CallJavaScript/…
    • 是的,我正在使用您的示例
    • @Kamerel 在我在模拟器上进行测试之前,它工作正常。如果你想在真机上测试,请确认先连接互联网,然后你就可以看到它工作正常了。
    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 2019-05-31
    • 2017-02-20
    • 2012-09-28
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多