简书 Markdown 预览同步滚动脚本
2019-08-01 本文已影响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();
})();