g***@qq.com
g***@qq.com
  • 发布:2019-10-31 11:53
  • 更新:2022-10-27 16:24
  • 阅读:6842

Uparse修复版的说明

分类:uni-app

举例有这样一段代码

    <div>  
        <span>1243&nbsp;5346</span>  
    </div>

uparse文件执行顺序简单说明

parse.vue插件入口文件 →  调用lib/html2json.js   → 返回nodes对象  (这里得到一个html节点解析后的json对象)  
                                        ↓↑  
                调用wxDiscode(例:把&amp;nbsp;转成字符),htmlparser  

parse.vue把nodes输入到wxParseTemplate0.vue

首先会处理最外层的 div,就变成了

<view>  
    nodes  
<view/>  

nodes = '<span>1243 5346</span>'

再把新的nodes再次输入到wxParseTemplate0.vue(小程序是wxParseTemplate1.vue)
这样就得到一个递归调用的模板,直到输出所有节点

wxParseTemplate里面遇到table,img,video,audio,标签时会分别调用自定义组件(更多的可以直接看源码)

    import wxParseImg from './wxParseImg';  
    import wxParseVideo from './wxParseVideo';  
    import wxParseAudio from './wxParseAudio';  
    import wxParseTable from './wxParseTable';

下面说说优化了哪些地方.优化的同时也存在些问题.希望大家提出好的解决方案.

0.去掉了标签在递归过程中多出来的标签,解决导致内联元素没有内联的问题

1.table标签很简单目前是用的rich-text

https://uniapp.dcloud.io/component/rich-text
没有找到更好的处理方法,问题是,标签内部的非文字节点,,可能会有问题

2.wxDiscode相对于原版做了一些处理

// 例:  
str = str.replace(/&nbsp;/g, " ");  
改为  
str = str.replace(/&nbsp;|&#32;|&#x20;/g, "<span class='spaceshow'> </span>");

3.parse.vue文件的getWidth方法原版获取的是屏幕的宽度,实际上应该获取组件的宽度,该方法获取的宽度主要是用于计算image的图片宽度.(组件可能有边距,边距不应该用于计算图片的宽度).

有兴趣的可以去看看image的处理,,目前是有些问题的,,因为官方的图片插件必须要设置一个宽高覆盖掉默认的宽高,做百分比计算感觉比较复杂.目前我也没什么好的处理方式.

另外还要吐槽一下uni.createSelectorQuery(),之前在处理时,各个小程序的兼容情况好像并不是很好,所以用的条件编译.有报错可以自行处理一下

4.parse.vue文件的setHtml方法

     this.nodes = results.nodes;  
    // 改为  
     this.nodes = [];  
     results.nodes.forEach((item) => {  
          setTimeout(() => {  
               this.nodes.push(item)  
          }, 0);  
     })

这段代码可以异步的加载根节点,,


像这样:  
<p>这里是<span>段落</span></p>  
<p>这里是<span>段落</span></p>  
<p>这里是<span>段落</span></p>  
<p>这里是<span>段落</span></p>  
<p>这里是<span>段落</span></p>  
<p>这里是<span>段落</span></p>  

但是如果用div标签包裹起来就不是异步加载了,  

像这样  

<div>  
    <p>这里是<span>段落</span></p>  
    <p>这里是<span>段落</span></p>  
    <p>这里是<span>段落</span></p>  
    <p>这里是<span>段落</span></p>  
    <p>这里是<span>段落</span></p>  
    <p>这里是<span>段落</span></p>  
</div>  

目前还没想好如何异步加载所有节点,,有想到如何处理的可以留言或私信我谢谢.之前有尝试,但是性能反降.遂放弃

实际上是分段渲染的结果,让人感觉好像渲染速度加快,,实际上并没快多少

5.parse.vue文件的 navigate方法

原方法是只能获取href的内容,,有人提出需求需要获取onclick的内容,所以增加了attr,

6.对br标签的处理{wxDiscode应该处理"<",">"字符,避免转码后输出br标签,br再转换行的问题,暂时还没改}

        <!--br类型-->  
        <!-- #ifndef H5 -->  
            <text v-else-if="node.tag == 'br'">\n</text>  
        <!-- #endif -->  
        <!-- #ifdef H5 -->  
            <br v-else-if="node.tag == 'br'">  
        <!-- #endif -->

7.wxParse.css文件我就不说了但是需要在APP.vue文件中引入,

目前就想到这么多了.

1 关注 分享
追梦随想

要回复文章请先登录注册

1***@qq.com

1***@qq.com

img 的宽高属性没有渲染,通过浏览器工具查看,img的宽高属性渲染后直接被去掉了
2022-10-27 16:24
y***@126.com

y***@126.com

大神, & l t ; 和 & g t ; 会被解析为标签,这个问题有解了吗?
2019-12-23 10:57