From 8931112f050759dfd31649ce04a48ca1aa99263c Mon Sep 17 00:00:00 2001
From: unknown <qq1940665526@163.com>
Date: 星期五, 07 六月 2024 15:05:21 +0800
Subject: [PATCH] 优化

---
 src/books/lifeCare/index.vue |  205 +++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 188 insertions(+), 17 deletions(-)

diff --git a/src/books/lifeCare/index.vue b/src/books/lifeCare/index.vue
index 3e54086..257a80b 100644
--- a/src/books/lifeCare/index.vue
+++ b/src/books/lifeCare/index.vue
@@ -1,7 +1,10 @@
 <template>
   <div class="page-main" @scroll="throttledScrollHandler">
+    <div id="searchDomBox" style="display: none">
+      <div id="searchContent"></div>
+    </div>
     <div
-      class="public-lifeCare"
+      class="public-bookInnerContent"
       @mouseup="handleMouseUp"
       :style="{
         fontSize: fontSize ? fontSize + 'px' : '16px',
@@ -151,8 +154,9 @@
       observer: null,
       loadPageObserver: null,
       loadPageList: [],
-      questionData: {},
+      questionDataMap: {},
       renderSignMap: {},
+      highlightData: null,
       isSearch: false,
     };
   },
@@ -198,8 +202,8 @@
     },
   },
   mounted() {
-    // 榛樿鍔犺浇绔犺妭
-    this.showCatalogList = [1];
+  // 榛樿鍔犺浇绔犺妭
+  this.showCatalogList = [1];
     // 婊氬姩鐩戝惉鑺傛祦
     this.throttledScrollHandler = _.throttle(
       this.scrollFun,
@@ -215,11 +219,21 @@
         },
         // 娓叉煋绗旇銆侀珮浜�佸垝绾�
         renderSign: (type, data) => {
-          this.renderSign(type, data);
+          // 鍥犱负璋冩暣涓洪〉闈㈡噿鍔犺浇锛屾墍浠ユ覆鏌撴爣璁颁篃闇�瑕佹寜鐓ч〉闈㈣繘琛屽鐞嗭紝鍏堝偍瀛樻暟鎹紝椤甸潰鍔犺浇瀹屾垚鍐嶆覆鏌撳搴旂殑鏍囪锛�
+          this.handelSignData(type, data);
+          // this.renderSign(type, data);
         },
         // 鍒犻櫎绗旇銆侀珮浜�佸垝绾�
         delSign: (data) => {
           this.delSign(data);
+        },
+        // 鍏ㄦ枃妫�绱�
+        searchBookByKeyword: (keyword) => {
+          return this.searchTextByPage(keyword);
+        },
+        // 璺宠浆妫�绱㈢粨鏋滀綅缃�
+        jumpSearchItem: (data) => {
+          this.searchItemLocation(data);
         },
       });
     }
@@ -435,6 +449,7 @@
         }
       }
     },
+
     initObservation() {
       const sections = (
         this.container ? this.container : document
@@ -463,6 +478,7 @@
         }
       });
     },
+
     initThemeColor() {
       // 鑾峰彇鍚勭闇�瑕佷富棰樿壊鐨勮妭鐐�
       const colorDom = (
@@ -542,6 +558,7 @@
         }
       });
     },
+
     getParentWithClass(element, className) {
       while (element.parentElement) {
         element = element.parentElement;
@@ -550,6 +567,7 @@
         }
       }
     },
+
     pageChangeCallback(entries, observer) {
       //entries锛氫唬琛ㄨ瀵熷埌鐨勭洰鏍囧厓绱犵殑闆嗗悎銆� observer锛氫唬琛ㄨ瀵熻�呭璞°��
       entries.forEach((entry) => {
@@ -581,6 +599,7 @@
         }
       });
     },
+
     loadPageCallback(entries, observer) {
       entries.forEach(async (entry) => {
         if (entry.isIntersecting) {
@@ -592,11 +611,11 @@
               "chapter"
             );
             const catalog = catalogDom.getAttribute("num");
-            if (!this.questionData[page]) {
+            if (!this.questionDataMap[page]) {
               if (testData && testData[catalog]) {
                 if (testData[catalog][page]) {
                   if (Array.isArray(testData[catalog][page])) {
-                    this.questionData[page] = await getQuestionList(
+                    this.questionDataMap[page] = await getQuestionList(
                       page,
                       testData[catalog][page],
                       this.config.activeBook
@@ -610,8 +629,9 @@
                         this.config.activeBook
                       );
                     }
-                    this.questionData[page] = obj;
+                    this.questionDataMap[page] = obj;
                   }
+                  // console.log("棰樼洰", this.questionDataMap);
                 }
               }
             }
@@ -625,6 +645,36 @@
                 });
               }
             }
+            // 澶勭悊楂樹寒
+            if (this.highlightData) {
+              // 楂樹寒琛�
+              setTimeout(() => {
+                // 鑾峰彇椤甸潰鎵�鏈塼ext鑺傜偣
+                const pageTextList = document.createTreeWalker(target, NodeFilter.SHOW_TEXT);
+                // 鍖归厤鍏抽敭瀛�
+                const allPageTextNodes = [];
+                let currentNode = pageTextList.nextNode();
+                while (currentNode) {
+                  allPageTextNodes.push(currentNode);
+                  currentNode = pageTextList.nextNode();
+                }
+                for (let i = 0; i < allPageTextNodes.length; i++) {
+                  const textDom = allPageTextNodes[i];
+                  let txtIndex = textDom.textContent.indexOf(
+                    this.highlightData.txt
+                  );
+                  if (txtIndex > -1) {
+                    textDom.parentNode.style.transition =
+                      "background-color 0.8s";
+                    textDom.parentNode.scrollIntoView();
+                    textDom.parentNode.style.backgroundColor = "#79bbf0";
+                    setTimeout(() => {
+                      textDom.parentNode.style.backgroundColor = "";
+                    }, 1000);
+                  }
+                }
+              }, 100);
+            }
             if (this.loadPageList.length > 5) {
               // 瓒呰繃5椤�
               this.loadPageList.shift();
@@ -633,6 +683,7 @@
         }
       });
     },
+
     initSwiper() {
       const doms = (
         this.container ? this.container : document
@@ -712,6 +763,7 @@
         });
       }
     },
+
     initViewer() {
       const doms = (
         this.container ? this.container : document
@@ -728,15 +780,7 @@
         });
       }
     },
-    // eslint-disable-next-line
-    getParentWithClass(element, className) {
-      while (element.parentElement) {
-        element = element.parentElement;
-        if (element.classList.contains(className)) {
-          return element;
-        }
-      }
-    },
+
     handleMouseUp(e) {
       const selection = (
         this.container ? this.container : window
@@ -779,6 +823,7 @@
         }
       }
     },
+
     swdtChange(data) {
       if (this.$store.state.qiankun && this.$store.state.qiankun.chooseWords) {
         this.$store.state.qiankun.chooseWords({
@@ -786,6 +831,132 @@
         });
       }
     },
+
+    // 鏍规嵁鍏抽敭瀛楀叏鏂囨绱�
+    searchTextByPage(keyword) {
+      const searchResult = [];
+      let catalogIndex = 0;
+      // 鎵�鏈夌珷鑺傜粍浠讹紙姣忔湰涔﹀埗浣滄椂鍗曠嫭閰嶇疆锛�
+      const pageData = {
+        front001,
+        ChapterOne,
+        ChapterTwo,
+        ChapterThree,
+        ChapterFour,
+        ChapterFive,
+        chapterSix,
+        chapterSeven,
+        chapterEight,
+        chapterNine,
+        chapter010,
+        chapter011,
+        chapter012,
+        chapter013,
+        chapter014,
+        chapter015,
+        chapter016,
+        chapter017,
+        chapter018,
+      };
+      // 閬嶅巻鎵�鏈夌珷鑺傛枃浠�
+      for (const key in pageData) {
+        catalogIndex++;
+        let pageComponent, pageExample;
+        // 鍏堟覆鏌撲竴娆″綋鍓嶇珷鑺傛枃浠讹紙杩欐椂椤甸潰鐨勫唴瀹逛负绌猴級锛岃幏鍙栭〉鐮佷俊鎭�
+        pageComponent = Vue.extend(pageData[key]);
+        pageExample = new pageComponent({
+          propsData: {
+            showPageList: [],
+            questionData: {},
+          },
+        });
+        pageExample.$mount(
+          (this.container ? this.container : document).querySelector(
+            "#searchContent"
+          )
+        );
+        // 鑾峰彇椤电爜
+        const pageDom = (this.container ? this.container : document)
+          .querySelector("#searchDomBox")
+          .querySelectorAll(".page-box");
+        const pages = [];
+        for (let i = 0; i < pageDom.length; i++) {
+          const pageDomItem = pageDom[i];
+          pages.push(Number(pageDomItem.getAttribute("page")));
+        }
+        // 鑾峰彇椤甸潰缁撴潫锛屽嵏杞介攢姣�
+        pageExample.$destroy();
+        (this.container ? this.container : document).querySelector(
+          "#searchDomBox"
+        ).innerHTML = '<div id="searchContent"></div>';
+        // 閬嶅巻椤电爜
+        if (pages.length) {
+          for (let i = 0; i < pages.length; i++) {
+            const pageNum = pages[i];
+            // 鍔ㄦ�佹覆鏌撳搴旂珷鑺傜殑椤电爜
+            pageComponent = Vue.extend(pageData[key]);
+            pageExample = new pageComponent({
+              propsData: {
+                showPageList: [pageNum],
+                questionData: {},
+              },
+            });
+            pageExample.$mount(
+              (this.container ? this.container : document).querySelector(
+                "#searchContent"
+              )
+            );
+            // 鑾峰彇瀵瑰簲椤甸潰dom
+            const thisPageDom = (this.container ? this.container : document)
+              .querySelector("#searchDomBox")
+              .querySelector(`[page="${pageNum}"]`);
+            if (thisPageDom) {
+              // 鑾峰彇椤甸潰鎵�鏈塼ext鑺傜偣
+              const pageTextList = document.createTreeWalker(
+                thisPageDom,
+                NodeFilter.SHOW_TEXT
+              );
+              // 鍖归厤鍏抽敭瀛�
+              const allPageTextNodes = [];
+              let currentNode = pageTextList.nextNode();
+              while (currentNode) {
+                allPageTextNodes.push(currentNode);
+                currentNode = pageTextList.nextNode();
+              }
+              for (let i = 0; i < allPageTextNodes.length; i++) {
+                const textDom = allPageTextNodes[i];
+                let txtIndex = textDom.textContent.indexOf(keyword);
+                if (txtIndex > -1) {
+                  // 璁板綍鍏抽敭瀛楁墍鍦ㄩ〉鐮併�佺珷鑺備互鍙婂尮閰嶅埌鐨勬钀�
+                  searchResult.push({
+                    page: pageNum,
+                    catalog: catalogIndex,
+                    txt: textDom.textContent,
+                    txtIndex: txtIndex,
+                  });
+                }
+              }
+              // 缁撴潫锛屽嵏杞介攢姣�
+              pageExample.$destroy();
+              (this.container ? this.container : document).querySelector(
+                "#searchDomBox"
+              ).innerHTML = '<div id="searchContent"></div>';
+            }
+          }
+        }
+      }
+      // 杈撳嚭鎼滅储缁撴灉
+      console.log(searchResult);
+      return searchResult;
+    },
+    
+    // 鏍规嵁妫�绱㈢粨鏋滆烦杞搴斾綅缃苟楂樹寒
+    searchItemLocation(data) {
+      // 璁板綍楂樹寒淇℃伅
+      this.highlightData = data;
+      // 璺宠浆
+      this.gotoPage(data.catalog, data.page, () => {});
+    },
   },
   components: {
     front001,

--
Gitblit v1.9.1