Decade0nce

MacOSX10.3用のメモとか。気がつけば10.13。いつになったら11に

指定タグ間をキー入力で移動

2010-06-25 | メモ
次の画像/前の画像、ブックマークレットをベースにちょこちょこ弄った。

●主な変更点
・画像以外の見出しタグ(h2,h3等)にも対応(させたつもり)
・途中でy軸座標が折り返してるhtml構造(マルチカラムなブログ等)に対応(させry
・前処理として次の移動ポイントを示すテーブルを作成
 → メリット: 実行速度向上(前処理を除く)
 → デメリット: スクリプト実行後のウィンドウ/ページサイズ変更に非対応

●概要
・Firefox2.0用のブックマークレット
・指定タグ間をj/kキーで上下に移動できるようにするモノ
(デフォでは総ピクセル数 ImgMin 以上の画像が指定されてる)

●使い方
・ブックマークにキーワード(jkなど)を指定して
 ロケーションバーに jk h2 といった感じで入力

javascript:
var TgNm='%s',OfSt=8,ImgMin=320*240;
if(TgNm=='%25s')TgNm='img';

with(document){

function at(e,t){
	if(!e)return t;
	return at(e.offsetParent,t+e.offsetTop)
}

var v=compatMode.match('1')?documentElement:body, is=v.getElementsByTagName(TgNm),
	sT='scrollTop', op, p=[[]];

for(i=0,j=0,n=0;i<is.length;i++){
	ci=is[i];
	if(ci.width*ci.height >= ImgMin ||TgNm!='img'){
		ct=at(ci,0);
		q=p[j];

		if(ct==q[n-1]){
		}else if(ct<q[n-1]){
			p[++j]=[ct];
			n=1;
		}else{
			q[n++]=ct;
		}

	}
}

for(j=p.length-1; j>0; j--){
	pf=p[0], x=0, lf=p[0].length, 
	pj=p[j], y=0, lj=p[j].length;
	tmp=[], z=0;
	
	while(x<lf&&y<lj) tmp[z++]=pf[x]<pj[y]?pf[x++]:pj[y++];
	while(x<lf) tmp[z++]=pf[x++];
	while(y<lj) tmp[z++]=pj[y++];

	p[0] = tmp;
}
tp=p[0], l=tp.length;

var pMin=tp[0], pMax=tp[l-1],
	IdxRng=Math.floor((pMax-pMin)/l)+1;

var DB=[[0]], Np=[[],[]];
i=0, j=0, pre=pMin, nxt=pMax;

while(j<l){
	ct = tp[i];
	idx = Math.floor((ct-pMin)/IdxRng);
	Dj = DB[j];

	if(idx==j){
		if(Dj[0]>0){
			Dj[++Dj[0]] = ct;
		}else{
			Np[0][j]=pre;
			Dj = [1,ct];
		}
		pre = ct;
		DB[j] = Dj;
		i++;
	}else{
		Np[0][++j] = pre;
		DB[j] = [0];
	}
}

for(j=l-1; j>=0; j--){
	Np[1][j] = nxt;

	Dj=DB[j];
	if(Dj[0]>0)nxt=Dj[1];
}


var f=function(e){
	e=(e||event);
	k=e.keyCode;

	if(k==74)op=1;
	else if(k==75)op=-1;
	else return;


	vi=Math.floor((v[sT]-pMin+OfSt)/IdxRng);

	while(0<=vi&&vi<l){
		n=DB[vi][0];
		for(i=1;i<=n;i++){
			ct=DB[vi][op>0?i:n-i+1]-OfSt;
			if((ct-v[sT])*op>0){
				v[sT]=ct;
				return;
			}
		}
		v[sT] = Np[op>0?1:0][vi]-OfSt;
		return;
	}

	if(op*vi<0)v[sT]=op>0?pMin-OfSt:pMax-OfSt;

};

onkeydown=f;
f({keyCode:74});

}



最近JavaScript触り始めたんだけど
Firebugって死ぬほど便利だな


最新の画像もっと見る

コメントを投稿