Uniapp 使用的是基于 webview 的跨平台解决方案,因此它不能直接 *** 作 DOM (Document Object Model)。实际上,其工作方式是通过将组件编译成小程序或 APP 的组件来实现跨平台。相比于直接 *** 作 DOM,使用组件编写 Ui 更容易实现跨平台兼容性。因此,Uniapp 的组件化能够大大提高开发效率和可维护性,同时缩短了开发周期,也降低了开发成本。
默认WebView没有开启LocalStorage存储。
代码如下:
mWebViewgetSettings()setDomStorageEnabled(true);
mWebViewgetSettings()setAppCacheMaxSize(102410248);
String appCachePath = getApplicationContext()getCacheDir()getAbsolutePath();
mWebViewgetSettings()setAppCachePath(appCachePath);
mWebViewgetSettings()setAllowFileAccess(true);
mWebViewgetSettings()setAppCacheEnabled(true);
或者是:
wvBrowsergetSettings()setJavaScriptEnabled(true);
// 开启DOM缓存。
wvBrowsergetSettings()setDomStorageEnabled(true);
wvBrowsergetSettings()setDatabaseEnabled(true);
wvBrowsergetSettings()setDatabasePath(contextgetApplicationContext()getCacheDir()getAbsolutePath());
setDatabasePath在API19时已经废弃,原因是因为在44WebView的内核已经换为了Chrome的内核,存储路径有WebView控制。
Android WebView加载>
需要添加宽度设置。webviewhtml的超过高度想要显示内容需要添加宽度,因此webviewhtml超过高度不显示需要添加宽度设置。webviewhtml是一个基于webkit的引擎,可以解析DOM元素,展示html页面的控件。
在做混合应用的时候,有几个痛点,一个是无网络无法使用,还有一个是受网络环境影响的网页加载速度。今天就这两个问题,和大家交流一下自己的经验。
离线缓存
这个比较容易,开启webView的缓存功能就可以了。
WebSettings settings = webViewgetSettings();
settingssetAppCacheEnabled(true);
settingssetDatabaseEnabled(true);
settingssetDomStorageEnabled(true);//开启DOM缓存,关闭的话H5自身的一些 *** 作是无效的settingssetCacheMode(WebSettingsLOAD_DEFAULT);
这边我们通过setCacheMode方法来设置WebView的缓存策略,WebSettingsLOAD_DEFAULT是默认的缓存策略,它在缓存可获取并且没有过期的情况下加载缓存,否则通过网络获取资源。这样的话可以减少页面的网络请求次数,那我们如何在离线的情况下也能打开页面呢,这里我们在加载页面的时候可以通过判断网络状态,在无网络的情况下更改webview的缓存策略。
ConnectivityManager cm = (ConnectivityManager)getSystemService(ContextCONNECTIVITY_SERVICE);
NetworkInfo info = cmgetActiveNetworkInfo();if(infoisAvailable())
{
settingssetCacheMode(WebSettingsLOAD_DEFAULT);
}else {
settingssetCacheMode(WebSettingsLOAD_CACHE_ONLY);//不使用网络,只加载缓存}
这样我们就可以使我们的混合应用在没有网络的情况下也能使用一部分的功能,不至于什么都显示不了了,当然如果我们将缓存做的更好一些,在网络好的时候,比如说在WIFI状态下,去后台加载一些网页缓存起来,这样处理的话,即使在无网络情况下第一次打开某些页面的时候,也能将该页面显示出来。
当然缓存资源后随之会带来一个问题,那就是资源无法及时更新,WebSettingsLOAD_DEFAULT中的页面中的缓存版本好像不是很起作用,所以我们这边可能需要自己做一个缓存版本控制。这个缓存版本控制可以放在APP版本更新中。
if (upgradecacheControl > cacheControl)
{
webViewclearCache(true);//删除DOM缓存
VersionUtilsclearCache(mContextgetCacheDir());//删除APP缓存
try
{
mContextdeleteDatabase("webviewdb");//删除数据库缓存
mContextdeleteDatabase("webviewCachedb");
} catch (Exception e)
{
}
}
预加载
有时候一个页面资源比较多,,CSS,js比较多,还引用了JQuery这种庞然巨兽,从加载到页面渲染完成需要比较长的时间,有一个解决方案是将这些资源打包进APK里面,然后当页面加载这些资源的时候让它从本地获取,这样可以提升加载速度也能减少服务器压力。重写WebClient类中的shouldInterceptRequest方法,再将这个类设置给WebView。
webViewsetWebViewClient(new WebViewClient()
{ @Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url)
{ if (urlcontains("[tag]"))
{
String localPath = urlreplaceFirst("^>
以上就是关于uniapp为什么不支持dom全部的内容,包括:uniapp为什么不支持dom、android 中 webview 怎么用 localStorage、手机不支持webview如何设置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)