【发布时间】: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