国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

實(shí)現(xiàn)微信小程序預(yù)覽文件,預(yù)覽頁(yè)面添加倒計(jì)時(shí)

這篇具有很好參考價(jià)值的文章主要介紹了實(shí)現(xiàn)微信小程序預(yù)覽文件,預(yù)覽頁(yè)面添加倒計(jì)時(shí)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

項(xiàng)目場(chǎng)景:

提示:1、實(shí)現(xiàn)小程序預(yù)覽doc、docx、xls、xlsx、ppt、pptx、pdf類型文件

?????????? 2、進(jìn)入頁(yè)面展示文件內(nèi)容、開始按鈕,點(diǎn)擊,按鈕變?yōu)椤荆?*s)】倒計(jì)時(shí)

?????????? 3、倒計(jì)時(shí)結(jié)束后,此按鈕消失,彈出顯示【完成】,彈框保留2s后小時(shí),用戶繼續(xù)閱讀

例如:項(xiàng)目場(chǎng)景:示例:學(xué)習(xí)計(jì)時(shí)


問題描述

提示:小程序自帶的api可以實(shí)現(xiàn)文件預(yù)覽,但不可以在文件預(yù)覽頁(yè)面添加按鈕,不可以操作文件預(yù)覽頁(yè)面:

例如:小程序文檔地址:wx.openDocument(Object object) | 微信開放文檔
小程序代碼:


wx.downloadFile({
  // 示例 url,并非真實(shí)存在
  url: 'http://example.com/somefile.pdf',
  success: function (res) {
    const filePath = res.tempFilePath
    wx.openDocument({
      filePath: filePath,
      success: function (res) {
        console.log('打開文檔成功')
      }
    })
  }
})

分析:

提示:考慮建立新頁(yè)面,用web-view組件放預(yù)覽文件,cover-image組件做按鈕,但存在兼容性問題,部分手機(jī)cover-image組件被web-view遮擋。


解決方案:

提示:前端將預(yù)覽的html文件(包括倒計(jì)時(shí)操作),放在服務(wù)器,后端用kkfileview部署獲取預(yù)覽地址給前端【kkFileView為文件文檔在線預(yù)覽解決方案,該項(xiàng)目使用流行的spring boot搭建,易上手和部署,基本支持主流辦公文檔的在線預(yù)覽,如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,圖片,視頻,音頻等等,官網(wǎng)地址:https://kkfileview.keking.cn/zh-cn/docs/config.html】

小程序端:

fileUrl為服務(wù)器文件地址 :'https://******.com/fileRead.html?id='+this.data.id+'&userId='+res.data.id

<web-view style="width: 100px !important;height: 200px !important;" src="{{fileUrl}}" bindload="successLoad">
</web-view>


服務(wù)器fileRead.html文件:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-539027.html

<!DOCTYPE html>
<html lang="en">

<head>
  <link rel="shortcut icon" href="#" />
  <meta charset="UTF-8" />

  <meta http-equiv="cache-control" content="no-cache,no-store,must-revalidate" />
  <meta http-equiv="Pragma" content="no-cache" />
  <meta http-equiv="expires" content="0" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Document</title>
  <style>
    body {
      margin: 0;
      padding: 0;
    }

    .btn_read {
      position: absolute;

      display: none;
      right: 0;
      left: 50%;
      bottom: 30px;
      transform: translateX(-50%);
      width: 150px;
      height: auto;
      z-index: 9999;
    }

    .text-box {
      position: absolute;
      display: none;
      right: 0;
      left: 50%;
      bottom: 30px;
      transform: translateX(-50%);
      z-index: 9999;
      width: 130px;
      height: 40px;
      line-height: 40px;
      border-radius: 8px;
      border: 1px #B11818 solid;
      color: #B11818;
      font-size: 15px;
      font-weight: bold;
      text-align: center;
    }

    .box {
      position: absolute;
      display: none;

    }

    .finish-box {
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
      width: 143px;
      height: auto;
      z-index: 9999;


    }
  </style>
</head>
<script>
  //可以將查找標(biāo)簽節(jié)點(diǎn)的操作進(jìn)行簡(jiǎn)化 var btn = getElementById('btn')
  function $(id) {
    return document.getElementById(id);
  }
  //設(shè)置iframe自適應(yīng)
  function changeFrameHeight() {
    var ifm1 = $("myiframe");
    ifm1.height = document.documentElement.clientHeight + 'px';
    ifm1.width = document.documentElement.clientWidth + 'px';
  }
  //key(需要檢索的鍵) url(傳入的需要分割的url地址,例:?id=2&age=18)
  function getSearchString(key, Url) {
    var str = Url;
    str = str.substring(1, str.length); // 獲取URL中?之后的字符(去掉第一位的問號(hào))
    // 以&分隔字符串,獲得類似name=xiaoli這樣的元素?cái)?shù)組
    var arr = str.split("&");
    var obj = new Object();
    // 將每一個(gè)數(shù)組元素以=分隔并賦給obj對(duì)象
    for (var i = 0; i < arr.length; i++) {
      var tmp_arr = arr[i].split("=");
      obj[decodeURIComponent(tmp_arr[0])] = decodeURIComponent(tmp_arr[1]);
    }
    return obj[key];
  }
</script>

<body id="id_body" style="height: 100vh;width: 100%; overflow-y: hidden">
  <iframe id="myiframe" name="myiframe"></iframe>
  <img src="開始學(xué)習(xí)圖片" id="btn_start" class="btn_read" />
  <div id="text_count" class=" text-box">學(xué)習(xí)中</div>
  <img id="icon_finish_bg" class="box finish-box" src="完成學(xué)習(xí)圖片"></img>
  <script>
    console.log('time',new Date())
    var timer = null; //timer變量記錄定時(shí)器setInterval的返回值
    var search = window.location.search;//地址參數(shù),傳入的需要分割的url地址,例:?id=2&age=18
    var fileId = getSearchString("id", search); //文件id
    var userId = getSearchString("userId", search);
    var baseUrl = '接口請(qǐng)求地址'
    var loading = false
    var learnDuration = 0 //學(xué)習(xí)時(shí)間,接口返回

    //監(jiān)聽窗口分辨率改變
    window.onresize = function () {
      changeFrameHeight();
    }
    window.onload = function () {
      changeFrameHeight();
      //開始閱讀監(jiān)聽
      $("btn_start").addEventListener("click", function () {
        $("btn_start").setAttribute("style", "display:none");
        $("text_count").setAttribute("style", "display:block");
        countTime(learnDuration)
      });
      $("myiframe").onload = function (e) {
        console.log('myiframe加載成功');
        loading = true
        var ifDoc = $("myiframe").contentDocument || {};
        var ifTitle = ifDoc.title || '';
        console.log('ifTitle', ifTitle);
        if (ifTitle.indexOf("404") >= 0 || ifTitle.indexOf("錯(cuò)誤") >= 0) {
          console.log('加載失敗');

        }
      }
      getDetail()

    };
    //請(qǐng)求接口獲取詳情
    function getDetail() {
      $("btn_start").setAttribute("style", "display:block");
      var url = baseUrl + '/courseware/textbooks/detail/' + fileId
      var xhr = new XMLHttpRequest();
      // 可以設(shè)置請(qǐng)求頭,一般不設(shè)置
      //超時(shí)設(shè)置 2s 設(shè)置
      xhr.timeout = 50000;
      //超時(shí)回調(diào)
      xhr.ontimeout = function () {
        // alert("網(wǎng)絡(luò)異常, 請(qǐng)稍后重試!!");
      }
      //網(wǎng)絡(luò)異?;卣{(diào)
      xhr.onerror = function () {
        // alert("你的網(wǎng)絡(luò)似乎出了一些問題!");
      }
      //設(shè)置響應(yīng)體數(shù)據(jù)的類型
      xhr.responseType = 'json';
      xhr.open("get", url);
      xhr.send(null);
      //注冊(cè)相關(guān)事件回調(diào)處理函數(shù)
      xhr.onload = function (e) {
        if (xhr.status == 200 || xhr.status == 304) {
          if (xhr.status == 200 && xhr.response && xhr.response.code == 200) {
            loadPage(xhr.response.data)
          } else {
            console.log("Request was unsuccessful: " + xhr.status); // 請(qǐng)求失敗,返回 響應(yīng)的 HTTP 狀態(tài) 
          }
        }
      };
      xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {// (整個(gè)數(shù)據(jù)傳輸過程結(jié)束)

        }
      };
    }
    //加載頁(yè)面
    function loadPage(res) {
      if (!res) {
        return false;
      }
      if (!res.textbooks) {
        return false;
      }

      document.title = res.textbooks ? res.textbooks.name : ''//修改html標(biāo)題
      learnDuration = res.learnDuration//獲取倒計(jì)時(shí)時(shí)間
      var base64_url = base64_encode(res.textbooks.url)
      var url = encodeURIComponent(base64_url)
      console.log("base64_url", base64_url);
      console.log("url", url);
      var fileUrl = '預(yù)覽文件服務(wù)端地址/onlinePreview?url=' + url + '&officePreviewType=' + res.suffix; //要預(yù)覽文件的訪問地址,后端使用kkfileview后的地址
      $("myiframe").src = fileUrl
      $("text_count").innerHTML = '學(xué)習(xí)中(' + res.learnDuration + "s)";
      console.log('fileUrl', fileUrl);

    }
   
//結(jié)束學(xué)習(xí)
   function finishComplete(params) {
    var api = baseUrl + '/courseware/learn/complete?id=' + fileId + '&userId=' + userId
      var xhr2 = new XMLHttpRequest();
      // 可以設(shè)置請(qǐng)求頭,一般不設(shè)置
      //超時(shí)設(shè)置 2s 設(shè)置
      xhr2.timeout = 50000;
      //超時(shí)回調(diào)
      xhr2.ontimeout = function () {
        alert("網(wǎng)絡(luò)異常, 請(qǐng)稍后重試!!");
      }
      //網(wǎng)絡(luò)異常回調(diào)
      xhr2.onerror = function () {
        alert("你的網(wǎng)絡(luò)似乎出了一些問題!");
      }
      //設(shè)置響應(yīng)體數(shù)據(jù)的類型
      xhr2.responseType = 'json';
      xhr2.open("get", api);
      xhr2.send(null);
      //注冊(cè)相關(guān)事件回調(diào)處理函數(shù)
      xhr2.onload = function (e) {
        if (xhr2.status == 200 || xhr2.status == 304) {
          if (xhr2.status == 200 && xhr2.response && xhr2.response.code == 200) {
          } else {
            console.log("Request /courseware/learn/complete was unsuccessful: " + xhr2.status); // 請(qǐng)求失敗,返回 響應(yīng)的 HTTP 狀態(tài) 
          }
        }
      };
    
   }
    function countTime(count) {
      //點(diǎn)擊開始建 開始計(jì)數(shù)
      timer = setInterval(function () {
        count--;
        if (count==0) {
          finishComplete()
        }
        if (count < 0) {
          clearInterval(timer);
          $("id_body").removeChild($("text_count"));
          $("icon_finish_bg").setAttribute("style", "display:block");
          setTimeout(function () {
        
            $("icon_finish_bg").setAttribute("style", "display:none");
          }, 2000)

        } else {
          // submitSutdy()
          $("text_count").innerHTML = '學(xué)習(xí)中(' + count + "s)";
        }
        // 需要改變頁(yè)面上時(shí)分秒的值
      }, 1000);
    }



    function base64_encode(str) {
      //下面是64個(gè)基本的編碼
      var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      var out, i, len;
      var c1, c2, c3;
      len = str.length;
      i = 0;
      out = "";
      while (i < len) {
        c1 = str.charCodeAt(i++) & 0xff;
        if (i == len) {
          out += base64EncodeChars.charAt(c1 >> 2);
          out += base64EncodeChars.charAt((c1 & 0x3) << 4);
          out += "==";
          break;
        }
        c2 = str.charCodeAt(i++);
        if (i == len) {
          out += base64EncodeChars.charAt(c1 >> 2);
          out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
          out += base64EncodeChars.charAt((c2 & 0xF) << 2);
          out += "=";
          break;
        }
        c3 = str.charCodeAt(i++);
        out += base64EncodeChars.charAt(c1 >> 2);
        out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
        out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
        out += base64EncodeChars.charAt(c3 & 0x3F);
      }
      return out;
    }
 </script>
</body>

</html>

到了這里,關(guān)于實(shí)現(xiàn)微信小程序預(yù)覽文件,預(yù)覽頁(yè)面添加倒計(jì)時(shí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 微信小程序點(diǎn)擊圖片放大預(yù)覽,新頁(yè)面中全屏預(yù)覽圖片

    微信小程序點(diǎn)擊圖片放大預(yù)覽,新頁(yè)面中全屏預(yù)覽圖片

    第一步:在wxml中定義image組件,并設(shè)置綁定事件。 第二步:在js中設(shè)置需要預(yù)覽圖片的URL數(shù)組, 切記一定要是數(shù)組 ,即使一張圖也要是數(shù)組,不能直接字符串賦值。 2.1 data數(shù)據(jù)設(shè)置 2.2 綁定事件函數(shù)編制 3.wx.previewImage組件官方調(diào)用指南 4、效果預(yù)覽

    2024年02月11日
    瀏覽(91)
  • 微信小程序?qū)崿F(xiàn)給一個(gè)時(shí)間去設(shè)置倒計(jì)時(shí)

    設(shè)置倒計(jì)時(shí) 此方法僅限不超過一個(gè)月的倒計(jì)時(shí)

    2024年02月11日
    瀏覽(31)
  • 微信小程序?qū)崿F(xiàn)倒計(jì)時(shí)功能,一看就懂,直接用

    結(jié)構(gòu)完整,直接用就可以

    2024年02月01日
    瀏覽(32)
  • uniapp實(shí)現(xiàn)h5、app、微信小程序三端pdf文件下載和預(yù)覽

    以下代碼兼容三端,app,h5,微信小程序,經(jīng)過個(gè)人測(cè)試 手機(jī)端有兩種方法,使用renderjs或者uniapp的api 兩者的區(qū)別 使用renderjs的寫法,會(huì)提示用戶是否下載文件,下載完成后用戶需要手動(dòng)點(diǎn)擊下載的文件,才會(huì)打開文件 使用uniapp的api則可以直接下載并直接預(yù)覽,不需要用戶操

    2024年02月11日
    瀏覽(104)
  • uniapp —— 微信小程序預(yù)覽文件

    uniapp —— 微信小程序預(yù)覽文件

    1.問題:但是內(nèi)置方法一般使用的是url預(yù)覽,如果接口返回的是文件流,前端如何處理 uni.downloadFile uni.openDocument 2.解決:后端接口路徑拼接,如果使用的是PC端下載文件的接口,但接口返回的是文件流,可以將地址進(jìn)行拼接,放到uni.downloadFile中的url中 3.tip:網(wǎng)上的其他辦法,

    2024年02月12日
    瀏覽(84)
  • 微信小程序文件預(yù)覽和下載-文件系統(tǒng)

    微信小程序文件預(yù)覽和下載-文件系統(tǒng)

    文件預(yù)覽和下載 在下載之前,我們得先調(diào)用接口獲取文件下載的 url 然后通過 wx.downloadFile 將下載文件資源到本地 tempFilePath 就是臨時(shí)臨時(shí)文件路徑。 通過 wx.openDocument 打開文件。 showMenu 表示預(yù)覽文件右上方的菜單,你可以在該菜單中選擇保存文件,將文件顯示的保存到本地

    2024年02月04日
    瀏覽(28)
  • 微信小程序預(yù)覽二進(jìn)制流文件

    微信小程序預(yù)覽二進(jìn)制流文件

    在線預(yù)覽doc/xls/xlsx/ppt/txt/pdf 的文件和圖片。 將后臺(tái)返回的二進(jìn)制流,寫入微信的文件管理器。 打開文件。 wx.openDoucument不支持預(yù)覽txt文件。 原本都是調(diào)用這個(gè)方法,根據(jù)isTxt判斷是否為文本文件做不同的操作。在安卓真機(jī)調(diào)試發(fā)現(xiàn)打開失敗,說(shuō)找不到路徑。 縮略圖預(yù)覽(增

    2024年02月09日
    瀏覽(26)
  • 微信小程序上傳文件及圖片(可以預(yù)覽)

    最近在寫小程序項(xiàng)目,碰到了一個(gè)需求,需要用戶可以上傳各種類型的文件和圖片,展示在頁(yè)面上,并且點(diǎn)擊還可以進(jìn)行預(yù)覽,就找了找微信小程序官網(wǎng),寫了一個(gè)例子,分享一下 直接看代碼: wxml: wxss: js: 有問題和建議歡迎大家留言

    2024年02月12日
    瀏覽(92)
  • 微信小程序,下載流文件并打開預(yù)覽

    ??gopdf(e){ ????let?that=this; ????let?pdfurl=e.currentTarget.dataset.pdfurl; ????let?file; ????let?tokenresult?=?wx.getStorageSync(\\\"tokenresult\\\"); ???? ????console.log(pdfurl); ????wx.request({ ??????url:app.globalData.api.fileurl?+?`api/file/pdf/httppreview?httpfile=${pdfurl}`, ??????method:?\\\"GET\\\", ????

    2024年02月10日
    瀏覽(16)
  • 【微信小程序-原生開發(fā)】實(shí)用教程02-添加全局頁(yè)面配置、頁(yè)面、底部導(dǎo)航

    【微信小程序-原生開發(fā)】實(shí)用教程02-添加全局頁(yè)面配置、頁(yè)面、底部導(dǎo)航

    開始前,請(qǐng)先完成項(xiàng)目創(chuàng)建,詳見 【微信小程序-原生開發(fā)】實(shí)用教程01-注冊(cè)登錄賬號(hào),獲取 AppID、下載安裝開發(fā)工具、創(chuàng)建項(xiàng)目、上傳體驗(yàn) 因我們的項(xiàng)目是根據(jù)模板創(chuàng)建的,需先清理掉無(wú)效的頁(yè)面代碼,具體操作方式如下: 刪除 pages 文件夾下的所有文件 用下方代碼替換掉

    2023年04月10日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包