闫增涛
2024-05-17 46c17ea395352fc3d2bd3d5e5163f601f4d466c1
src/books/childHealth/view/content/index.vue
@@ -1,6 +1,7 @@
<template>
  <div class="page-main" @scroll="throttledScrollHandler">
    <div class="page-content">
    <div class="page-content" :style="{fontSize: fontSize ? fontSize + 'px' : '16px',
  transform: `scale(${pageZoom ? pageZoom : 1})`}">
      <pageHeader v-if="showCatalogList.indexOf(0) > -1"></pageHeader>
      <chapterOne v-if="showCatalogList.indexOf(1) > -1"></chapterOne>
      <chapterTwo v-if="showCatalogList.indexOf(2) > -1"></chapterTwo>
@@ -36,6 +37,7 @@
import chapterEleven from "./components/chapter011.vue";
import chapterTwelve from "./components/chapter012.vue";
import chapterThirteen from "./components/chapter013.vue";
import NoteIcon from "@/assets/images/biji.png";
import _ from "lodash";
export default {
  data() {
@@ -48,10 +50,21 @@
      throttledScrollHandler: null
    };
  },
  computed:{
    fontSize() {
      return this.$store.state.qiankun.fontSize
    },
    pageZoom() {
      return this.$store.state.qiankun.scale / 100
    }
  },
  watch: {
    showCatalogList: {
      handler(newVal) {
        if (this.$store.state.qiankun && this.$store.state.qiankun.catalogChange) {
      handler(newVal, oldVal) {
        if (
          this.$store.state.qiankun &&
          this.$store.state.qiankun.catalogChange
        ) {
          // 调用父层方法
          this.$store.state.qiankun.catalogChange({
            showCatalogList: newVal
@@ -69,13 +82,20 @@
      this.throttleThreshold,
      { leading: true, trailing: false }
    );
    // 提供页面跳转功能
    // 定义子层方法
    if (this.setGlobalState) {
      // 定义子层方法
      // 提供页面跳转功能
      this.setGlobalState({
        gotoPage: (catalog, page) => {
          console.log(catalog, page, "gotoPage:catalog, page");
          this.gotoPage(catalog, page);
        },
        // 渲染笔记、高亮、划线
        renderSign: (type, data) => {
          this.renderSign(type, data);
        },
        // 删除笔记、高亮、划线
        delSign: (data) => {
          this.delSign(data);
        }
      });
    }
@@ -83,12 +103,27 @@
    // 测试页面跳转
    // setTimeout(() => {
    //   this.gotoPage(5, 100);
    //   setTimeout(() => {
    //     this.renderSign("Note", {
    //       id: "2ACA9359",
    //       txt: "营养素和热量,才能",
    //       page: "100",
    //       type: "Highlight",
    //       color: "#F5E12A"
    //     });
    //     setTimeout(() => {
    //       this.delSign({
    //         ids: ["2ACA9359"]
    //       });
    //     }, 2000);
    //   }, 1000);
    // }, 3000);
  },
  methods: {
    scrollFun(e) {
    scrollFun(event) {
      // 判断向上滚动还是向下滚动
      if (event.target.scrollTop > this.previousScrollTop) {
        // 向下
        const currentScrollTop =
          event.target.scrollTop + event.target.offsetHeight;
        if (
@@ -111,6 +146,7 @@
          }
        }
      } else if (event.target.scrollTop < this.previousScrollTop) {
        // 向上
        const currentScrollTop = event.target.scrollTop;
        if (currentScrollTop <= this.loadThreshold) {
          // 到达阈值
@@ -129,13 +165,13 @@
      this.previousScrollTop = event.target.scrollTop;
      // 返回页码和章节信息
      if (this.$store.state.qiankun && this.$store.state.qiankun.pageChange)
        this.$store.state.qiankun.pageChange({
          page: 100,
          catalog: 5,
          catalogId: "",
          catalogName: ""
        });
      // if (this.$store.state.qiankun && this.$store.state.qiankun.pageChange)
      //   this.$store.state.qiankun.pageChange({
      //     page: 100,
      //     catalog: 5,
      //     catalogId: "",
      //     catalogName: ""
      //   });
    },
    gotoPage(catalog, page) {
      if (catalog >= 0 && catalog <= this.catalogLength) {
@@ -152,19 +188,80 @@
          this.showCatalogList = [catalog - 1, catalog, catalog + 1];
        }
        setTimeout(() => {
          console.log(document);
          console.log(document.querySelector(`[page="${page}"]`));
          // 跳转页码
          const pageDom = document.querySelector(`[page="${page}"]`);
          const pageDom = (
            this.container ? this.container : document
          ).querySelector(`[page="${page}"]`);
          if (pageDom) {
            pageDom.scrollIntoView();
          } else {
            console.log("页码错误!");
          }
        }, 100);
        }, 500);
      } else {
        console.log("章节错误!");
      }
    },
    renderSign(type, data) {
      const existence = (
        this.container ? this.container : document
      ).querySelector(`[dataid="${data.id}"]`);
      // 去重
      if (!existence) {
        const pageDom = (
          this.container ? this.container : document
        ).querySelector(`[page="${data.page}"]`);
        let reg = new RegExp(`${data.txt}`, "ig");
        switch (type) {
          case "Highlight":
            // 高亮
            pageDom.innerHTML = pageDom.innerHTML.replace(
              reg,
              `<span datatype="Highlight" dataid="${data.id}" style="background: ${data.color};" class="highLight" onclick="signClick('Highlight','${data.id}','${data.chapterNum}')">${data.txt}</span>`
            );
            break;
          case "Dashing":
            // 划线
            pageDom.innerHTML = pageDom.innerHTML.replace(
              reg,
              `<span datatype="Dashing" dataid="${data.id}" style="text-decoration-color:${data.color};" class="underline" onclick="signClick('Dashing','${data.id}','${data.chapterNum}')">${data.txt}</span>`
            );
            break;
          case "Note":
            // 笔记
            pageDom.innerHTML = pageDom.innerHTML.replace(
              reg,
              `<span datatype="Note" dataid="${data.id}" style="border-bottom-color:${data.color}" class="notesline" onclick="signClick('Note','${data.id}','${data.chapterNum}')">${data.txt}<img src="${NoteIcon}" style="cursor: pointer" /></span>`
            );
            break;
        }
      }
    },
    delSign({ ids, type }) {
      if (ids && ids.length) {
        for (let i = 0; i < ids.length; i++) {
          const id = ids[i];
          const dom = (
            this.container ? this.container : document
          ).querySelector(`[dataid="${id}"]`);
          dom.parentNode.innerHTML = dom.parentNode.innerHTML.replace(
            dom.outerHTML,
            dom.outerText
          );
        }
      }
      if (type) {
        const doms = (
          this.container ? this.container : document
        ).querySelectorAll(`[datatype="${type}"]`);
        for (let i = 0; i < doms.length; i++) {
          const dom = doms[i];
          dom.parentNode.innerHTML = dom.parentNode.innerHTML.replace(
            dom.outerHTML,
            dom.outerText
          );
        }
      }
    }
  },
  components: {