IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 微信小程序WxPrase中包含文件无法点击解决 -> 正文阅读

[移动开发]微信小程序WxPrase中包含文件无法点击解决

这个菜鸟昨天碰见了这个问题,一开始四处搜索都没有找到解决方案,本来想换一种方式:让后端直接把文件的名字和地址传给我,我根据字段有无来显示到界面上,但是后端说要改的话比较麻烦,所以还是菜鸟来解决了!
在这里插入图片描述
本来找到了一个webview,感觉能解决的可能性很大,但是发现不支持个人用户,直接懵逼,后来看到这篇文章给了我思路,富文本内容中的pdf文件,如何通过wxparse点击事件打开预览?

但是这个并没有解决问题,只是给了菜鸟一个思路,既然在WxPrase里面不行,那为什么不取出来之后以附件的形式显示到页面上,虽然会有重复的感觉,但是最起码问题解决了!

1、如何把HTML通过正则取出文件?

这里菜鸟不是很熟正则,只能四处搜索,也没找到个靠谱的,然后只能在这个网站上自己摸索 在线正则表达式测试 ,上面有一个匹配URL,但是并没有什么用,最后还是菜鸟看正则,自己写出来了一个!

const reg = new RegExp('href="https://[^\\s]*?"');

这个确实可以,但发现匹配出来的地址不知道对应的文件是哪一个,后来菜鸟发现后端用富文本编译器传过来的HTML有一定规律,href后面跟着的就是title,所以代码变成这样

const reg = new RegExp('href="https://[^\\s]* title="[\\s\\S]*?"');

这个解决是解决了,但是每次只能匹配一个,然后菜鸟就想到了全局匹配,代码如下

const reg = new RegExp('href="https://[^\\s]* title="[\\s\\S]*?"',"g");
let a = reg.exec(input);

但是令人失望的是,这个全局搜索并不能正常工作。 (这里菜鸟不是很清楚为什么,希望懂的读者指点江山,激扬文字!)

当菜鸟陷入僵局的时候,后端说:既然不行,那就循环取呗,每次取了就把取出来的替换掉不就好了!所以代码变成了这样

let arr = [];
let input =test.content;
while(1){
  const reg = new RegExp('href="https://[^\\s]* title="[\\s\\S]*?"');
  let a = reg.exec(input);
  if(a == null){
    break;
  }
  arr.push(a);
  input = input.replace(a," ");
}
console.log(arr);

然后成功取出来了,非常完美!

2、数据处理

取出来了可还不够,你还得显示到页面,那么就得对数据进行处理

let AppdList = [];
for(let i = 0;i < arr.length;i++){
  let ApList = [];
  // 这个是把href和title分开
  let href_title = arr[i][0].split(" ");
  
  // 有的命名不规范,就靠这个拼接回去
  if(href_title.length > 2){
    let title = "";
    for(let j = 1;j < href_title.length;j++){
      title = title + href_title[j];
    }
    ApList[0] = href_title[0].split("=")[1].split('"')[1];
    ApList[1] = title.split("=")[1].split('"')[1];
  }else{
    ApList[0] = href_title[0].split("=")[1].split('"')[1];
    ApList[1] = href_title[1].split("=")[1].split('"')[1];
  }

  AppdList.push(ApList);
  // console.log(ApList);
  // console.log(AppdList);
}

this.setData({
  AppendicesList:AppdList,
});

注意

这里要注意一个问题,那就是字符串打印出来应该是不带引号的,带引号就表示字符串本身是带引号的,就要用 split(’"’)[1] 处理一下!

3、界面显示和事件

wxml

<!-- 添加附件 -->
<view wx:if="{{show && AppendicesList.length > 0}}" class="AppendicesList box">
  <view>
    <text style="color: #555;" bindtap="showAppendices">收起附件:</text>
  </view>
  <block wx:for="{{AppendicesList}}">
    <text class="Appendices" bindtap="downLoad" data-href="{{item[0]}}">{{item[1]}}\n</text>
  </block>
</view>
<view wx:if="{{!show}}" class="AppendicesList">
  <text class="show" bindtap="showAppendices">查看附件</text>
</view>

wxss

/* 添加附件 */
.AppendicesList{
  /* text-align: center; */
  margin-bottom: 20rpx;
}
.box{
  background-color: gainsboro;
  border: solid #333 5rpx;
}
.show{
  text-decoration: underline;
  color:#555;
}
.Appendices{
  position: relative;
  color: rgb(14, 122, 247);
  font-size: 35rpx;
  text-decoration: underline;
  line-height: 60rpx;
  padding-left: 30rpx;

  overflow : hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 1;
  -webkit-box-orient: vertical;
  word-break: break-all;  /*追加这一行代码*/
}
.Appendices::before{
  content: "";
  position: absolute;
  left: 6rpx;
  top: 45%;
  width: 10rpx;
  height: 10rpx;
  border-radius: 50%;
  background-color: #333;
}

js

showAppendices:function(){
  this.setData({
    show:!this.data.show,
  })
},

downLoad:function(e){
  // console.log(e);
  wx.showToast({
    title: '已加入下载队列',
    icon:"success",
    duration:2000,
    mask:true
  });

  // 这里也是后端的坑,当时菜鸟硬是不知道为什么访问不了,直到问了后端才知道,这个 cn// 是后端传的,但是却只能通过 cn/ 访问
  let href = e.currentTarget.dataset.href.replace("cn//","cn/");
  wx.downloadFile({
    url: href,
    success (res) {
      // 只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调,业务需要自行判断是否下载到了想要的内容
      console.log(res);
      const filePath = res.tempFilePath
      wx.openDocument({
        filePath: filePath,
        success: function (res) {
          console.log('打开文档成功');
        }
      })
    },
    fail(err){
      console.log(err);
    }
  })
},

展示效果
在这里插入图片描述
在这里插入图片描述
菜鸟感觉要想无重复,就要后端一起改,前端改,这个已经是极限了!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:49:24  更:2021-11-11 12:50:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:05:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码