存档

文章标签 ‘verycd’

修正VeryCD在启用AdBlock Plus的情况下的版面混乱问题的脚本

2008年3月2日 2 条评论

VeryCD是个不错的网站,除了在每个页面上面出现的flash广告(见下图)。当然我也知道VeryCD维持生存基本上要靠广告,但是经常搞死我浏览器的flash广告,我是不得已把它过滤掉的。

Firefox对于广告的解决方案当然是AdBlock Plus。这个插件可以按照通配符或者正则表达式来封锁广告。如果你不懂通配符或者正则表达式,直接用鼠标点点基本上也是可以解决问题的。通过在其中添加一条规则封锁 http://222.37.134.*/*.htm*,顺利达到了封锁VeryCD上面的flash广告的目的。

但是随之而来的问题是,因为过滤掉了一个iframe,整个页面布局就有了一些问题,资源详细信息因为布局的缘故无法显示(见下图)。

为了能够让它显示出来,只好另外再打一层补丁。这次用Greasemonkey,让它在加载VeryCD页面的时候在原本显示广告的地方显示另外一个东西来占个位置,自然就能够让详细信息部分显示了。

在这里显示什么呢?看了几个VeryCD页面之后,发现大多数的页面上面在简介部分都有至少一幅图片。按理说把第一副图片按比例缩小放在其中应该可以吧。最后结果见下图:

最后贴Greasemonkey脚本的代码。请将其拷贝到记事本保存为“所有文件”,文件名选择.user.js结束。保存后拖动到Firefox(事先需要安装了Greasemonkey),确定即可安装。

== 代码开始,请不要拷贝这一行 ==
// ==UserScript==
// @name           Re-format VeryCD item detail
// @namespace      http://ftofficer.spaces.live.com
// @description    Re-format VeryCD item detail
// @include        http://www.verycd.com/topics/*
// ==/UserScript==

function findFirstImg() {
  var paras = document.getElementsByTagName(‘p’);
  for (var i=0; i<paras.length; ++i) {
    var p = paras[i];
    if ( p.getAttribute(‘class’) == ‘inner_content’) {
      var imgs = p.getElementsByTagName(‘img’);
      if ( imgs && imgs.length > 0 )
        return imgs[0];
    }
  }
 
  return null;
}

function getScale(imgWidth, imgHeight, divWidth, divHeight) {
  var wScale = divWidth * 1. / imgWidth;
  var hScale = divHeight * 1. / imgHeight;
 
  if ( wScale > 1. && hScale > 1. ) {
    return 1.;
  }
 
  return wScale < hScale ? wScale : hScale;
}

function fixupVeryCDDetailPage() {
  var moreInfo = document.getElementById(‘moreInfo’);
  if ( moreInfo ) {
    var frame = document.createElement(‘div’);
    frame.setAttribute(‘class’, ‘Banner1’);
    frame.width = 300;
    frame.height = 250;

    firstImg = findFirstImg();
    if ( firstImg ) {
      var img = document.createElement(‘img’);
      img.src = firstImg.src;
      var imgScale = getScale(img.width, img.height, frame.width, frame.height);
      img.width = Math.floor(img.width * imgScale);
      img.height = Math.floor(img.height * imgScale);
      frame.appendChild(img);
    }
   
    if ( moreInfo.parentNode ) {
      moreInfo.parentNode.insertBefore(frame, moreInfo);
    }
  }
}

fixupVeryCDDetailPage();

== 代码结束,请不要拷贝这一行 ==