美文网首页
简书 Markdown 预览同步滚动脚本

简书 Markdown 预览同步滚动脚本

作者: 宇宙小神特别萌 | 来源:发表于2019-08-01 13:22 被阅读0次

    1.首先参考安装 Tampermonkey:https://www.jianshu.com/p/caa21e6796bd

    2.简书 Markdown 预览同步滚动脚本

    这个脚本没必要安装: 简书上已经有这个功能了

    // ==UserScript==
    // @name            简书 Markdown 预览同步滚动
    // @name:en         Jianshu MD AUTO Scroll
    // @namespace       https://github.com/BlindingDark/JianshuMDAutoScroll
    // @include         *://www.jianshu.com/writer*
    // @version         1.3
    // @description:en  jianshu Markdown preview AUTO scroll
    // @description     给简书的在线 Markdown 编辑器增加输入预览同步滚动的功能
    // @author          BlindingDark
    // @grant           none
    // @require      https://cdn.bootcss.com/jquery/3.2.1/jquery.js
    // ==/UserScript==
    
    (function() {
      'use strict';
      var spSwitchMain; // 切换的那个按钮所在的窗体
      var txtMain;      // 输入框
      var spPreview;    // 预览框
    
      const SWITCH_FEATURE   = 'a.fa.fa-columns';
      const EXPAND_FEATURE   = 'a.fa.fa-expand';
      const COMPRESS_FEATURE = 'a.fa.fa-compress';
    
      function getInput() {
        return $('#arthur-editor');
      }
    
      function getPreview() {
        return getInput().closest("div").parent().next();
      }
    
      function scrollEvent(){
        txtMain = getInput()[0];
        spPreview = getPreview()[0];
    
        if(txtMain == undefined) {
          return;
        }
        if(spPreview == undefined) {
          return;
        }
    
        let mainFlag = false; // 抵消两个滚动事件之间互相触发
        let preFlag = false; // 如果两个 flag 都为 true,证明是反弹过来的事件引起的
    
        function scrolling(who){
          if(who == 'pre'){
            preFlag = true;
            if (mainFlag === true){ // 抵消两个滚动事件之间互相触发
              mainFlag = false;
              preFlag = false;
              return;
            }
            txtMain.scrollTop = Math.round((spPreview.scrollTop + spPreview.clientHeight) * txtMain.scrollHeight  / spPreview.scrollHeight - txtMain.clientHeight);
            return;
          }
          if(who == 'main'){
            mainFlag = true;
            if (preFlag === true){ // 抵消两个滚动事件之间互相触发
              mainFlag = false;
              preFlag = false;
              return;
            }
            spPreview.scrollTop = Math.round((txtMain.scrollTop + txtMain.clientHeight) * spPreview.scrollHeight / txtMain.scrollHeight - spPreview.clientHeight);
            return;
          }
        }
    
        function mainOnscroll(){
          scrolling('main');
        }
    
        function preOnscroll(){
          scrolling('pre');
        }
    
        getInput().on('scroll', () => mainOnscroll());
        getPreview().on('scroll', () => preOnscroll());
      }
    
      function cycle() {
        scrollEvent();
        $(EXPAND_FEATURE).on('click', scrollEvent);
        $(COMPRESS_FEATURE).on('click', scrollEvent);
        $(SWITCH_FEATURE).on("click", scrollEvent);
    
        window.setTimeout(cycle, 1000);
      }
    
      cycle();
    })();
    
    

    相关文章

      网友评论

          本文标题:简书 Markdown 预览同步滚动脚本

          本文链接:https://www.haomeiwen.com/subject/cnyqdctx.html