GMスクリプトを作った上での個人的メモ

  • XPath便利。超便利。
    • 複雑な条件も1行で書けちゃう。
      • クラスに"hoge"が指定されたa要素を子要素として持たないh3要素の先頭の子要素a
        • こんなのが//h3[not(a[@class="hoge"])]/a[not(preceding-sibling::*)]と書ける。
        • DOMだと何行になるだろうか。
    • XPathの戻り値の型には要注意。
      • ORDERED_NODE_ITERATOR_TYPE は、DOMツリーに変更があると無効になる。
        • result.iteratoNext()で取得。nullになったら終わり。
      • ORDERED_NODE_SNAPSHOT_TYPE は、変更があっても反映されないが、そのまま使える。
        • result.snapshotItem(i)で取得。
      • 取得した要素へのアクセス方法を間違えるとエラーが出る。
    • 最初は'//h3/a'なんて書いてた。
      • 1ページ目はうまくいくけど、2ページ目以降、既にブックマーク数をつけたリンクと、ブックマーク数のリンクそれぞれに更にブックマーク数をつけようとしたので、ページ数が増えるにつれ、指数関数的に処理量が増大して\(^o^)/
  • 動作の速さを求めてみた。
    • ランキングはリンクの数が100個を越えるから、遅いとイライラ。
    • array.forEach(function(elem) {...})は、遅い
      • 毎回関数を生成してるんだから遅いのは当たり前か。
      • 毎回関数を生成してるわけじゃないな。生成した関数を呼び出している。
        • あれ?それだと遅くなる原因にはならないような…。
    • cloneNode(true)を使ってみた。
      • いちいちcreateElementして属性とか設定するよりは速い気がする。
    • Autopagerize.addFilterではなく、addDocumentFilterを使った。
      • ページ描画前に要素をDOMツリーをいじれるから。
        • DOMツリーの変更→再描画を100回繰り返すより速いかも。
    • いろいろやってみたけど、ちゃんとしたベンチマークをしてないから効果の程はよくわからん。
      • というか、ページ上部の広告Flashが一番重いかも。
  • base要素があるページだと、2ページ目以降のリンクがおかしくなる。
    • base要素が無いものとして解釈されたhref属性を与えられる。
    • とりあえず今回は場当たり的に対処してみた。
    • 根本的な対処はAutopagerizeの対応待ち?