散財.com用Greasemonkeyスクリプト(修正版)

散財.comのホームで、広告の数が多くありやがったために削除しきれていなかった不具合を修正した。

// ==UserScript==
// @name 3zai
// @namespace null
// @description null
// @include http*://www.3zai.com/*
// @exclude null
// ==/UserScript==

(function() {
//delete ads & velisign
  var ads = document.getElementsByClassName('banner');
  while (ads.length) {
    removeNode(ads[0]);
  }

  removeNode(document.getElementById('secured'));

//scrolling
  if (!location.hash) {
    window.scrollTo(0, document.getElementById('global-navi').offsetTop - 3);
  }

//functions
  function getElementsByClassName(name) {
    var elements = [];
    var allElements = document.getElementsByTagName('*');
    for (var i = 0, l = allElements.length; i < l; i++) {
      if (allElements[i].className == name) {
        elements.push(allElements[i]);
      }
    }
    return elements;
  }

  function removeNode(targetNode) {
    return targetNode.parentNode.removeChild(targetNode);
  }
})();

ただし、ループの部分でforを使うとうまくいかない。いくつか削除できずに残ってしまう。

for (var i = 0, l = ads1.length; i < l; i++) {
  removeNode(ads1[i]);
}

で、forで駄目ならwhileだーってやったらなぜだか知らないけどうまくいった。うーん、removeChildあたりが怪しいぞと思ってググってみたら、同じ境遇の人を発見した。

参考
removeChildではまる | dTblog | design and programming

なるほどねー。てゆーか、そもそもノードリストは配列とは違うのか…。

追記|2008.07.11

id:javascripterさんの助言をもとに修正。