【问题标题】:Calling JavaScript function in Xamarin.Forms IOS WebViewRenderer在 Xamarin.Forms IOS WebViewRenderer 中调用 JavaScript 函数
【发布时间】:2015-08-04 02:29:52
【问题描述】:

我正在使用 Xamarin.Forms 构建一个跨平台的 IOS Android 和 windows phone 应用程序。我的一个观点是一个 web 视图,它调用一个指向一个页面的 url,该页面中有一个 javascript 函数。我需要从移动应用程序中调用此函数,并将其传递给字符串值。

到目前为止一切都很好,我在 WindowsPhone 中通过使用带有自定义视图的 WebViewRenderer 实现了这一点。在渲染器的OnElementPropertyChanged 处理程序中,我可以访问我的视图和我需要的属性,如下所示:

protected override async void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    base.OnElementPropertyChanged(sender, e);

    if(e.PropertyName == SessionWebView.SessionIdProperty.PropertyName)
    {
        view = Element as SessionWebView;               

        Control.LoadCompleted += Control_LoadCompleted;         
        if (view != null)
        {
            _currentSessionId = view.SessionId;
        }
    }
}

上面我附加了控件的加载完成处理程序,它是实际的浏览器控件。那么下面我就可以在网页中调用想要的JavaScript函数了。

void Control_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e)
{       
    if (!scriptCalled)
    {
        Control.IsScriptEnabled = true;
        var param = new string[1];
        param[0] = _currentSessionId;
        Control.InvokeScript("initWebView", param);
        scriptCalled = true;
    }       
}

这一切都可以在 Windows Phone 中完美运行。在 IOS 中——这就是这个问题的意义所在——我使用自定义渲染做了类似的事情,我可以获得我的视图及其属性。

但是 - 我无法让 IOS 中的本机浏览器控件能够在其上调用 JavaScript 函数。这是我目前所拥有的:

protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
    base.OnElementChanged(e);
    if (_view == null && e.NewElement is SessionWebView)
    {
        _view = (SessionWebView) e.NewElement;
        // Attach to the PropertyChanged event on the view
        _view.PropertyChanged += _view_PropertyChanged;
    }
}

private void _view_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    // Look for the sessionId propery
    if (e.PropertyName == SessionWebView.SessionIdProperty.PropertyName)
    {
        if(_view != null && !string.IsNullOrEmpty(_view.SessionId))
        {
            // if we have a view set the sessionId
            _currentSessionId = _view.SessionId;
            // Now need Browser to attach to loaded or navaigated events...
        }
    }
}

知道如何访问浏览器控件来调用 JavaScript 函数吗?

【问题讨论】:

    标签: javascript c# ios xamarin xamarin.forms


    【解决方案1】:

    您看过 XLabs HybridWebView 吗? https://github.com/XLabs/Xamarin-Forms-Labs/blob/master/src/Forms/XLabs.Forms.iOS/Controls/HybridWebView/HybridWebViewRenderer.cs 它基于 UIWebView 控件并使用 UIWebView.EvaluateJavascript 方法。您使用哪种本机浏览器控件?你能透露完整的渲染器代码吗?

    【讨论】:

    • 嗨,Artur 我设法使用 WebViewDelegate 方法解决了这个问题。这允许我在 LoadingFinished 事件中获取 UIWebView。然后我可以通过访问 webView.EvaluateJavascript(...) 函数来调用脚本并传递参数。到目前为止一切顺利。
    • 您的方法与 XLabs 使用的方法有何不同?我的意思是,您的渲染器是否具有相同的“签名”公共部分类 HybridWebViewRenderer : ViewRenderer
    • 我在渲染器中使用这个签名公共类 SessionWebViewRenderer:Xamarin.Forms.Platform.iOS.WebViewRenderer,在委托中使用这个:内部类 WebViewDelegate:UIWebViewDelegate。我肯定会看看 XLabs。谢谢。
    • 试试他们的方法,它给你更多的灵活性。
    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多