Jintrick.netagenda2002年09月アーカイブ → 2002年09月17日

MSXML4.0を利用したデッドリンク対策

所謂「リンクチェッカ」はデッドリンクを教えてくれるものの、書き換えまではやってくれない。折角MSXML4.0をインストールしたのだから、それくらいは何とかなるだろうという試み。DOMでノードを操作できるので、下手な正規表現でとんでもない変換をしてしまうというリスクは防げる。

1. 全てのソースファイルの、href属性値とsrc属性値を取得

これでhref属性とsrc属性を全て収めたノードリストを取得できる。

これででURIを取得できる。

2. リソースの存在を確認

IXMLHTTPRequest (英語)という素晴らしい?オブジェクトがある。new ActiveXObject('Msxml2.XMLHTTP.4.0'); で作成。

これを使えば、リソースの存在確認は簡単に行える。


var xmlhttp = new ActiveXObject('Msxml2.XMLHTTP.4.0');
function isResource(sURL){
  xmlhttp.open('HEAD', sURL, false);
  xmlhttp.send();
  if(xmlhttp.status < 400) return true;
  else return false;
}

2002-09-19T01:44:13+09:00改善。

var oHTTP;
function isResource(_sURL){
var isRes = false;
 oHTTP = new ActiveXObject('Msxml2.XMLHTTP.4.0');
 window.status = 'requesting :' + _sURL;
 oHTTP.open('HEAD', _sURL, false);
 oHTTP.onreadystatechange = function(){
  if(oHTTP.readyState == 4){
   isRes = (oHTTP.status < 400) ? true : false;
   oHTTP.abort();
  }
 };
 oHTTP.send();
 return isRes;
}

これらをURIとして指定するとエラーが出るようだ。サーバが消滅していたりすると異常に時間がかかるし。

但しローカルのリソースについては、存在する場合はstatusは0になるので問題ないが、存在しない場合、sendメソッドがスクリプトエラーになってしまう。しかし絶対パスでローカルを参照していること自体が問題なので、これは正規表現で判別して事前に警告するようにし、相対パスはWWWに置いてあるリソースの絶対URIに変換すればいい。この辺りはどうということのない普通のJavaScriptなので省略。

3. デッドリンクな要素を適切なものに変換

リンク先がデッドリンクだったa要素等を、何か別の要素に置き換える。これはW3CのDOMで適当に行う。

ここで、一時的にサーバの調子が悪かった(一時的なデッドリンク)ということも考えられるので、いつでも元に戻せるようにしておく必要がある。つまり次回のデッドリンクチェックの際、そのURIも確認する必要がある。

例えば:

前者を後者のように置き換えて、次回のチェックの際にリソースhttp://foo.com/bar.htmlの存在を確認し、復活していたら前者に戻す。このspan要素全てをノードリストに収めるには:

一行で終り(未確認だけど)。

尚、名前空間がnullでない場合は、要素名の前に名前空間接頭辞をつけてやる必要が。

参照:MS独自拡張selectNodesメソッドについて (agenda)

余談

IXMLHTTPRequest (英語)オブジェクトを利用すれば、fub_redカスタムパネルにWWWCのような更新チェッカを入れられるような気がする。気のせいかも。

余談2

私はかつて、自宅サーバの野望を抱いていたのですが、知識が追いつくその前にISPによって見事に砕かれてしまいました。というわけでサーバーサイドスクリプトにはコンプレックスがあります。ご注意ください(謎)。


webmaster@jintrick.net
公開: 2002年09月17日
カテゴリ: DOM ,Javascript ,(ハイパー)リンク