瀏覽代碼

Automatically scroll to hash fragment or last known position

simov 2 年之前
父節點
當前提交
110033b382
共有 4 個文件被更改,包括 45 次插入26 次删除
  1. 3 1
      background/storage.js
  2. 3 3
      content/index.js
  3. 39 21
      content/scroll.js
  4. 0 1
      popup/index.js

+ 3 - 1
background/storage.js

@@ -51,7 +51,6 @@ md.storage.defaults = (compilers) => {
       emoji: false,
       mathjax: false,
       mermaid: false,
-      scroll: true,
       syntax: true,
       toc: false,
     },
@@ -149,4 +148,7 @@ md.storage.migrations = (state) => {
     })
     state.header = null
   }
+  if (state.content.scroll !== undefined) {
+    delete state.content.scroll
+  }
 }

+ 3 - 3
content/index.js

@@ -86,7 +86,7 @@ var onupdate = {
   html: () => {
     if (state.reload.md) {
       state.reload.md = false
-      update()
+      update(true)
     }
   },
   theme: () => {
@@ -96,8 +96,8 @@ var onupdate = {
   }
 }
 
-var update = () => {
-  scroll()
+var update = (update) => {
+  scroll(update)
 
   if (state.content.syntax) {
     setTimeout(() => Prism.highlightAll(), 20)

+ 39 - 21
content/scroll.js

@@ -61,7 +61,7 @@ var scroll = (() => {
     ])
     .then(done)
   }
-  function debounce (container, done) {
+  function listen (container, done) {
     var listener = /html|body/i.test(container.nodeName) ? window : container
     var timeout = null
     listener.addEventListener('scroll', () => {
@@ -69,40 +69,58 @@ var scroll = (() => {
       timeout = setTimeout(done, 100)
     })
   }
-  function listen (container, prefix) {
+  function get (container, prefix, offset) {
     var key = prefix + location.origin + location.pathname
+    if (offset) {
+      container.scrollTop = offset
+      return
+    }
     try {
       container.scrollTop = parseInt(localStorage.getItem(key))
-      debounce(container, () => {
-        localStorage.setItem(key, container.scrollTop)
-      })
     }
     catch (err) {
       chrome.storage.local.get(key, (res) => {
         container.scrollTop = parseInt(res[key])
       })
-      debounce(container, () => {
+    }
+  }
+  function set (container, prefix) {
+    var key = prefix + location.origin + location.pathname
+    try {
+      listen(container, () => {
+        localStorage.setItem(key, container.scrollTop)
+      })
+    }
+    catch (err) {
+      listen(container, () => {
         chrome.storage.local.set({[key]: container.scrollTop})
       })
     }
   }
-  return () => {
-    var loaded
+  var listening = false
+  return (update) => {
     race(() => {
-      if (!loaded) {
-        loaded = true
-        var container = ((html = $('html')) => (
-          html.scrollTop = 1,
-          html.scrollTop ? (html.scrollTop = 0, html) : $('body')
-        ))()
-        if (state.content.scroll) {
-          listen(container, 'md-')
-        }
-        else if (location.hash && $(location.hash)) {
-          container.scrollTop = $(location.hash).offsetTop
-        }
+      var container = ((html = $('html')) => (
+        html.scrollTop = 1,
+        html.scrollTop ? (html.scrollTop = 0, html) : $('body')
+      ))()
+
+      if (!update && location.hash && $(location.hash)) {
+        get(container, 'md-', $(location.hash).offsetTop)
+      }
+      else {
+        get(container, 'md-')
+      }
+
+      if (state.content.toc) {
+        setTimeout(() => get($('#_toc'), 'md-toc-'), 10)
+      }
+
+      if (!listening) {
+        listening = true
+        set(container, 'md-')
         if (state.content.toc) {
-          setTimeout(() => listen($('#_toc'), 'md-toc-'), 10)
+          setTimeout(() => set($('#_toc'), 'md-toc-'), 10)
         }
       }
     })

+ 0 - 1
popup/index.js

@@ -58,7 +58,6 @@ var state = {
     content: {
       autoreload: 'Auto reload on file change',
       emoji: 'Convert emoji :shortnames: into EmojiOne images',
-      scroll: 'Remember scroll position',
       toc: 'Generate Table of Contents',
       mathjax: 'Render MathJax formulas',
       mermaid: 'Mermaid diagrams',