特定リンクを別窓で表示

【特定リンクを別窓で表示】


質問

リンク先を別窓で表示では、全部のページのwiki本文にある全部のアンカーがTarget="_blank"となります。特定の範囲にあるリンクだけ別窓表示にする。

実装


wikiに書き込んだコメントがコメントタグでwikiのHTMLに反映されないようなので,
コメントタグを使って範囲を指定できません。1瞬はっきり範囲指定するフラグが見えますがご愛嬌でお願いします。
スクリプトの実行タイミングを早められないか模索中です。

フリーエリアの記述

<script type="text/javascript" defer><!--
Event.observe(window, "load", init, false);
function init(){
 document.getElementsByClassName("deco",$("wikibody")).each(function(e){
   if(e.innerHTML && e.innerHTML.match(/\/\/\*\*/)){
     var d = e.parentNode;
     while(!(d.hasChildNodes() && d.firstChild && d.firstChild.innerHTML && d.firstChild.innerHTML.match(/\*\*\/\//))){
       if(d.nodeType=="1" && d.tagName=='A'){d.target='_blank';}
       d=d.nextSibling;
     }
     e.parentNode.parentNode.removeChild(e.parentNode);
     d.parentNode.removeChild(d);
   }
 });
}
//--></script>

wikiの本文に記述
開始フラグ:-//**
終了フラグ:-**//

-を先頭に付けて書きこんで下さい。
//*はwiki書式で使われている予約語なので-を付けないと)//**と表示されません。

実装

ドキュメントロード後画像ロード前に実行はできました。
大量の画像を添付してる場合などは画像ロード中でも別窓指定が反映出来ます。
onloadイベントは画像ロードを待ちますので、グローバル領域で直に関数を呼びます(なので、呼ばれるメソッドの名前空間の問題には気をつけてください。)

  • firefoxの場合:非公式メソッドDOMContentLoadedを利用して
Event.observe(window, "load", init, false);
のかわりに
document.addEventListener("DOMContentLoaded", init, null);

  • その他のブラウザはscriptタグにdefer属性を設定
<script defer type="text/javascript"><!--

onload処理に関して

  • IEはdefer属性に加えてonloadイベントでなく、グローバル領域で直接関数を呼ぶ。

Event.observe(window, "load", init, false);
の代わりに
init();

  • IE以外のブラウザはonloadが2回呼ばれる可能性があるのでフラグトグルをつけておく。
function hasdone() {
// 呼び出し済みなら終了
if (arguments.callee.done) return;
// 呼び出し済みフラグを上げる
arguments.callee.done = true;
// 初期化処理
};
※クロスブラウザのコードではないので暇な人がいたら作ってホスイ。尚、外部ファイルにするならドキュメントロード完了に合わせてスクリプト実行でいいと思う。

参照

質問:http://knowledge.livedoor.com/10207
http://knowledge.livedoor.com/24350

targetプロパティ
http://tomizawa-web.hp.infoseek.co.jp/property/tar...

ドキュメントロード完了に合わせてスクリプト実行
http://d.hatena.ne.jp/brazil/20060105/1136404226

2chJavaScript質問スレ過去スレ
http://user.ftth100.com/mirrorhenkan/javascript/re...

scriptタグ defer属性
http://www.seo-equation.com/html/html/script#defer




2007年05月08日(火) 23:10:27 Modified by wiki_exgrammar




スマートフォン版で見る