如何在不渲染的前提下正确使用NativeScript WebView调用evaluateJavascript
问题解答
1. 直接new WebView()创建的实例是否会触发loadFinished事件,如何绑定监听?
默认不会触发。你手动new出来的只是NativeScript框架层的JS包装对象,没有触发后续的原生视图初始化、资源加载流程,自然不会触发loadFinished事件。
你写的事件绑定写法本身是对的,只要后续把这个WebView实例挂载到当前应用的视图树上,事件就能正常触发。
2. 直接new的WebView实例和loadFinished回调返回的实例有什么区别,为什么前者android属性为undefined?
- 直接new的实例:仅初始化了JS层的属性配置,还没有完成原生平台的视图实例创建,框架没有把原生WebView实例绑定到JS包装对象上,所以
android/ios属性都是undefined。 loadFinished回调返回的实例:已经完成了原生视图挂载、原生WebView实例创建、页面加载完成的全流程,框架已经把原生实例绑定到了JS包装对象的对应平台属性上,所以可以正常访问android属性调用原生API。
3. 未被渲染、没有对应模板元素的WebView实例可以调用evaluateJavascript吗,如何实现?
不能直接调用,evaluateJavascript本质是调用原生WebView提供的API,原生实例未创建的情况下无法调用。
实现方案:你可以把手动创建的WebView实例挂载到一个不可见的容器上,比如给容器设置width:0、height:0、opacity:0或者直接偏移到屏幕可视区域外,不需要给用户看到,只要完成挂载流程,原生实例就会正常初始化,等loadFinished触发后就能正常调用JS执行方法。
4. 是否必须渲染WebView才能正常使用其功能?
不需要用户可见,但必须走完原生视图的挂载流程才能使用完整功能。你不需要把WebView渲染到用户可视区域,但是不能完全不挂载到视图树,只要让框架完成原生实例的创建绑定即可,完全可以用不可见的WebView做数据预处理。
小提示:你贴的最后一段示例代码有笔误,
this.webVie.android少了字母w,应该是this.webView.android。
内容的提问来源于stack exchange,提问作者Sanyos
相关产品推荐
相关产品推荐

