by

line

玉兎 (4)

pgp公開鍵

  • user-ID : gyokuto_playlog
  • key-ID : 0x032C5845
  • fingerprint : A23B FB83 869A 02D0 9DA4 EE80 0D43 E627 032C 5845
2011年 02月
12345
6789101112
13141516171819
20212223242526
2728

最新記事

UserJS: xappy.jp の 外部リンクを ダイレクトリンク に修正する

♪FINAL FANTASY XIII O.S.T.

♪Heartbeat, Heartbreak

♪Signs Of Love

♪Heaven

♪Your Affection

♪Baby face

♪Reach Out To The Truth

♪Pursuing My True Self

♪Deep Breath Deep Breath

♪Here

♪Want To Be Close

♪When The Moon's Reaching Out Stars

♪Burn My Dread

♪Komm, susser Tod / 甘き死よ,来たれ

when the girl of "tsun" turns into a "de...

♪24 ~ twenty-four

♪Life is Good

♪gravity

♪ベクトル

カテゴリー

最近のコメント

♥している最近の10人 (81)

マッキー♪
84132
か~みっと
12017322
メルク
575506
rhythm♭
3321234
ME
3610721
solta
176
nawo
358658

15939
Soundwish
4425262
takeratta(tm)*
13361
続き
line
line

UserJS : Content-Typeの判定誤り... [Opera UserJS]  

前回,Operaにおいて,
Content-Typeの判定誤りによって
text/plain扱いされてしまったページを
htmlとして認識させるUserJSを記述した
(『UserJS : Content-Typeの判定誤りを修正する』を参照).

しかし,この方法で認識されたhtmlでは,
scriptノード中のスクリプトが認識されないことが発覚した.
今回は,前回作ったスクリプトを改良し,
この問題を解消する.

問題の解決方法

innerHTMLに投げて認識されたscriptノードは,
ノードとして存在するものの,
その中のスクリプトが実行されないようである.
(Operaのバグだろうか?)

そのため,cloneNode()メソッドを用い,
新しくscriptのDOMノードを作り直す.
これにより,対象のノードに含まれるスクリプトを起動する.

また,この方法でスクリプトを起動しても,
document.write()メソッドを用いて
その場にテキストを書くことはできない.

そのため,document.write()メソッドが現れたら,
対象scriptノードの前に新しくspanノードを作る.
ここに,document.write()メソッドの引数を置く.
最後に,このノード内のテキストを,
eval()で評価した値に置き換えることで,
document.write()を行った時と同等の効果を図る.

使用方法

以下のテキストを,拡張子jsとして
OperaのUserJSディレクトリに設置する.

前回のヴァージョンを使用している場合は,
以下のスクリプトと置き換えること.

document.addEventListener('load',
	function (e){
		var html = document.getElementsByTagName('html')[0];
		var body = document.getElementsByTagName('body')[0];

		//テキスト扱いされたHTMLでないなら,無視
		if(html.childNodes.length!=1 || /\.html?(#.*|\?.*)?$/.test(location.href) || !/<html\b.*>/.test(body.innerText) || !/<\/html>/.test(body.innerText)){
			return;
		}

		html.innerHTML = body.innerText;

		//scriptタグを新しく作り直す
		//innerHTMLに投げたscriptは,そのままでは起動しないため,
		//新しく作り直して起動する
		function touchNode(obj){
			switch(obj.nodeName.toLowerCase()){
			case 'script':
				var newObj = obj.cloneNode(true);
				obj.parentNode.replaceChild(newObj, obj);
				obj = newObj;
				while(/document\.write\((.*)\);?/.test(obj.textContent)){
					//document.writeは,touchNodeしても起動しないため,
					//名称置換用の目印を作っておく
					var span = document.createElement('span');
					span.setAttribute('class', '_viewAsHtml_script_write');
					span.appendChild(document.createTextNode(RegExp.$1));
					obj.parentNode.insertBefore(span, obj);
					obj.textContent = obj.textContent.replace(/document\.write\((.*)\);?/, '');
				}
				break;
			}

			for(var i=0; i<obj.childNodes.length; i++){
				touchNode(obj.childNodes[i]);
			}
		}
		touchNode(html);

		//名称置換用の目印をevalした結果に置き換える
		var spans = document.getElementsByTagName('span');
		for(var i=0; i<spans.length; i++){
			if(spans[i].getAttribute('class') != '_viewAsHtml_script_write'){
				continue;
			}

			spans[i].textContent = eval(spans[i].textContent);
		}
	},
	false
);
2007/12/24 03:08  全て表示   2   コメント 4

(2)

takeratta(tm)*
(13)
zx@金属連合会 特攻隊長!!
(32)

コメント (4)

zx@金属連合会 特攻隊長!!
(32)
▲
tab

スゴイ!!&x-smile;
もう何が何だか解らない!!!&x-smile;&x-smile;
難しいとかすら感じるコトさえ出来ない&x-smile;&x-smile;&x-smile;
ただただ スゴイ 解らないんだけどスゴイ!!!!!
興味はあるんだけど。。。
むりぽ&x-sad;

(2007-12-27 01:08)
tab

玉兎
(4)
▲
tab

>zx@金属連合会 特攻隊長!! さん
こんにちは.
zxさんは,ブラウザで何を使ってますか?

Operaだとデフォルトで,
FirefoxだとGracemonkeyって機能拡張で,
UserJavaScript(=UserJS)が使えるんですよ.

UserJSっていうのは,
ページの読込時にJavaScriptで書いた
プログラムを起動する機能です.

で,表示がおかしいページを,
そのUserJavaScriptで書き換えてやろう,
というのが,本稿の意図.

私はプログラミング言語の母語がJavaScriptなわけで,
偶に,そういうUserJSをしこしこ書いているのです.

というわけで,Operaお勧めですよ~
(とこっそり布教してみる

(2007-12-28 21:23)
tab

zx@金属連合会 特攻隊長!!
(32)
▲
tab

IEとLuna使ってまふ
イロイロと勉強したいんデスが中々むずくって~&x-smile;

Operaためそうかな?

(2008-02-08 01:46)
tab

玉兎
(4)
▲
tab

>zx@金属連合会 特攻隊長!! さん @ #3
opera,細かい使い勝手がieより気が利いてますよー.

例えば,文字の小さなページを閲覧するとき,
ieでは文字サイズ(5段階)を切り替えて,
ページ中の文字だけを大きくします.
対して,operaだと,画像も含め,
倍率指定(20% ~ 1000%)してページ全体を拡大できます.

マウスジェスチャ
(マウスの右ボタンを押しつつ,
Lの字などの単純な図形を描くことでブラウザを操作する)
の機能が標準で実装されてることも強みです.

後は,タブの保存機能
(起動時,前回終了時に開いていたページを自動で開く)
なんかもieにはない機能ですね.

話によると,セキュリティ脆弱性についても,
未修正のものがないとか,数が少ないとか,
安全性も十分なんだそうです.

firefoxが機能拡張で使い勝手を良くするのに対して,
operaはデフォルトでも便利に使えて拡張も可能,
といった印象です.

(2008-02-08 04:23)
tab


line