generated at
@tetsuya-k
へえ〜takker
>作った。なんか3時間くらいかかったけど...(変数のスコープ範囲について理解できていないのが原因。グローパル変数にできるならしたいものだったが、なんかできなかった)。
これどういう状況かよくわからなかったですtakker
addAutoScrollItemsToPageMenu() で囲まずとも、ユーザーページに直接貼り付けるか import で読み込むかすれば使えるはずです
何らかの設定をグローバル変数にしたかったということでしょうか?
動きはしたのですけれど、 scrollInterval が使いたいときにundefinedになってて困ったのです
varをつけないとグローバル変数として扱われるって記事があったのですが、宣言されてません!と怒られてしまったので、 function addAutoScrollItemsToPageMenu の上のほうに変数 interval_num をつくっておいて、そこに格納することにした、というお話です
参考にした、chordwikiはそんなことしなくても動いている風だったんですけどねぇ...
JavaScript難しいなぁと思いましたね...(きっと自分がプログラム下手/勉強してない なだけなのですが)
言っちゃあれだけどchordwikiのスクロール実装はすごく回りくどいことしてる感ありますが……
あー、自動スクロールはsetIntervalするしかないのかー。だと仕方ないか
うーん、色々と妙ですね
ほんの少しだけ書き換えてみました。takkerの環境ではこれで動くっぽいです
tetsuya-kさんが書いたコードと比べてみると、バグの原因がわかるかもしれません
確認しました。やっぱりvarよりletなんですねぇ(varとletの違いを書いてあるサイトは確認しつつ、今回困らないからいいでしょとvarに統一してましたが)
詳しく知っているわけではありませんが、 var は常識的な変数宣言の挙動をしないので自分で使うのは避けるべきですねtakker
自分は原則 const 、どうしても後から書き換える必要がある変数のみ let を使うようにしています
テンプレート機能をコピってつくったので、正直良くわからん書き方がいっぱいあったのですが、ココに書かれたやつのほうが分かりやすいですね!!
へー、こういうコードを生成するテンプレートがあるんですねtakker
道理で妙な変数名を使っていると思った
コードを生成するテンプレートではなくて、Scrapboxのサイドメニューに出す方法がイマイチ理解できていなかったので、すでに使えているUserScriptをコピってそれっぽい機能を作ろうとしたものです
変な変数名は自分の趣味かも...です
もしかしてpythonのprivate変数の命名規則にあやかっていたのでは?takker
確か先頭にアンダースコアをたくさんつけましたよね
ちなみにできるだけ元のコードの形を変えない程度に書き換え具合をとどめてあります。
まあ確かに元のコードよりはわかりやすくはなっていますが、まだ冗長な部分が残ったままです
そのあたりを書き換えてみると、いろいろ理解が深まるかもしれません
ありがとうございます!!
js
import("/api/code/villagepump/@tetsuya-k/script.js");
script.js
let interval_num = 0; const __autoScrolls = [ { title: "speed1", speed: 500 }, { title: "speed2", speed: 400 }, { title: "speed3", speed: 300 }, { title: "speed4", speed: 100 }, { title: "speed5", speed: 50 }, { title: "stop", speed: 0 }, ]; const __autoScrollMenuTitle = "AutoScroll"; scrapbox.PageMenu.addMenu({ title: __autoScrollMenuTitle, image: "/assets/img/logo_cut.svg" }); __autoScrolls.forEach((i)=>{ scrapbox.PageMenu(__autoScrollMenuTitle).addItem({ title: i.title, onClick: ()=>__loadAutoScroll(i.speed) }); }); const __loadAutoScroll = (speed)=>{ if (interval_num != 0) { clearInterval(interval_num); if (speed == 0) { clearInterval(interval_num); return; } } const scrollInterval = setInterval(__ScrollFW, speed); console.log(typeof scrollInterval); console.log(scrollInterval); interval_num = scrollInterval; }; const __ScrollFW = ()=>{ if (__isAtBottom() == false) { window.scrollBy({ top: 5, left: 0, behavior: "smooth" }); } else { if (interval_num != 0) { clearInterval(interval_num); } } }; const __isAtBottom = ()=>{ const a = document.documentElement.scrollHeight; const b = document.documentElement.scrollTop; const c = document.documentElement.clientHeight; const d = document.getElementsByClassName("related-page-list")[0].clientHeight; return a - b - d <= c; };
(blog記事なんだからここじゃなくてコメント欄に書いたほうがよかったかな)
ダイジョブです! 反応あるのうれしいです!
よかったtakker