DHTML Diver Help

Information

リンクチェック(非同期版)

ブラウズ中の画面上の、リンク一覧を作成し別ウィンドウに表示します。

さらに、作成された各リンクへXMLHTTPリクエストを、非同期で行い結果を表示します。

//links check [async]
var objTgt=document.links;
var html="";
html+="<TABLE border='1'>";
for (var numIx=0;objTgt.length>numIx;numIx++){
    html+="<TR>";
    html+="<TD>"+numIx+"</TD>";
    html+="<TD>"+objTgt[numIx].innerHTML+"</TD>";
    html+="<TD></TD>";
    html+="<TD><a href='"+objTgt[numIx]+"'target='_blank'>"+objTgt[numIx]+"</a></TD>";
    html+="</TR>";
}
html+="</TABLE>";
var win = window.open();
win.document.open();
win.document.write(html);
win.document.close();

var aryXhs = new Array();
var objTgt = win.document.body.getElementsByTagName("TABLE")[0].rows;
for (var numIx=0;objTgt.length>numIx;numIx++){
    try{
        var strHref = objTgt[numIx].getElementsByTagName("A")[0].href;
        var numPnt  = strHref.lastIndexOf("#");
        if (numPnt >= 0){
            strHref = strHref.substring(0,numPnt);
        }
        aryXhs[numIx] = new ActiveXObject("Msxml2.XMLHTTP.3.0");
        aryXhs[numIx].onreadystatechange = Function("readystatechange("+numIx+")");
        aryXhs[numIx].open("GET",strHref,true);
        aryXhs[numIx].setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");
        aryXhs[numIx].send();
    }catch(e){
        objTgt[numIx].cells[2].innerText=e.message;
    };
};
function readystatechange(numSetXhs){
    if (aryXhs[numSetXhs].readyState!=4)return;
    objTgt[numSetXhs].cells[2].innerText=aryXhs[numSetXhs].status+" "+aryXhs[numSetXhs].statustext;
};

リクエスト結果の意味

よく見かけるHTTPステータスは、以下の2種類だと思います。

HTTP Status
ステータス 説明
200 OK リクエスト成功
404 Not Found リクエスト失敗
(サーバー側に指定されたファイルが見つからなかった等)

※詳細は、MSDN status Property (IXMLHTTPRequest)や、Webサーバー側の設定を調べて見てください。

セキュリティの設定

IEのセキュリティ設定により、他ドメインへのアクセスに失敗する事があります。

一概に何が原因とは、言えないのですが、「書き込みできません。」と表示される場合は、以下の設定を行うとアクセスできるようになる事を確認しています。(IE5.5,IE6)

IEメニューバーの[ツール]-[インターネットオプション]-[セキュリティ]の、該当ゾーンの[レベルのカスタマイズ]により、[ドメイン間でのデータソースのアクセス]を有効にする

同期版との違い

同期版は、XMLHTTP要求のレスポンスが帰って来るまで、次のステップへ進めないのに対し
非同期版は、XMLHTTP要求を出した時点で、次のステップへ進めるので、複数のXMLHTTP要求を平行に行う事が可能です。

つまり、サーバー側のレスポンスの遅さに煩わされる事が少なくなるという事です。

openメソッドの第3引数と、onreadystatechangeイベントの扱いがミソ。


最近、流行のAjaxは、この辺のXMLHTTPの非同期処理を上手く使っている様ですね。

Sponsor