今やフレームをページ全体に使用したサイトは殆ど見かけなくなりましたが、
使用しているRSSリーダー「フレッシュリーダー」はフレームで構成されています。
で、メニューフレームが若干狭いために未読件数が増えてくるとこんな感じにボタンがずれてしまうのですが。




「フレッシュリーダー」は殆どが暗号化されていてカスタマイズできないので調整は不可能です。

じゃあどうするか。
Greasemonkeyでやればいいんじゃね?

ということでやってみました。

フレッシュリーダーのメニューフレームの幅を調整するGreasemonkey

出来たコードはこんな感じ。

// ==UserScript==
// @name           Freshreader Wide
// @version        0.0.1
// @namespace      http://nplll.com
// @description    Freshreaderの幅を調整する
// @include        http://*/feedlist.php*
// @updated        2010-04-17 12:00:00
// ==/UserScript==
// 0.0.1 - 2010/04/17 リリース

(function(){
//未読数が4桁の時メニューフレームを調整する
  if (document.getElementById('top_category').innerHTML.length > 19) {
    parent.document.getElementsByName('frameset')[0].cols = '260,*';
  }
})();


見出しの長さが一定以上になったらほんの少しメニューフレームを広げる。それだけ。
それだけなんだけど自分的にはちょっと便利になりました。





嵌ったところ。

JavaScriptでフレームをいじるとかあんまりやらないのでちょっと勝手がわからず実は苦戦しました。


親フレームからframesetが操作できない

まず嵌ったのはこれ。

次のようなファイルがあるとして、

parent.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ParentFrame</title>
</head>
<frameset name="frameset" cols="250,*">
<frame src="menu.html" name="_menu" scrolling="yes">
<frame src="content.html" name="_contents" scrolling="yes">
</frameset>
</html>


このframsetを操作しようと、parent.htmlに以下のように書いても動かない。

document.getElementsByName('frameset')[0].cols = '50%,50%';

こうしても同じ。

top.document.getElementsByName('frameset')[0].cols = '50%,50%';

これは、子フレームから操作してやるようにすると解決する。

menu.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>MenuFrame</title>
<script>
(function(){
parent.document.getElementsByName('frameset')[0].cols = '50%,50%';
})();
</script>
</head>
<body>
</body>
</html>

そうなのかー。



nameでフレームのオブジェクトを取得する

最近は何をするにしてもid、悪くてもTagNameで、name要素を使う機会はほとんど無い(フォーム部品を除く)のだけど、この場合はないので仕方がない。
というわけで、適当に

document.getElementByName('frameset');

とかやってみたけど出来るはず無くて、こうでした。

document.getElementsByName('frameset')[0];

まぁオブジェクトさえ取得できてしまえばあとは何でも出来ますね。



こんな感じで。