投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/6/15 13:02:14
> IsPictureとは何ですか?
コメント文にも書きましたが、「リンク先が画像かどうかを判定するメソッド」を想定しています。

> 画像判別の通常のリンクと画像のリンクの分岐でしょうか?
画像以外がクリックされた時には、通常のリンク動作を行うために即座に Exit Sub し、
画像がクリックされた場合には、今回の目的である
>>> ・リンクをクリックしてそれがjpg,gif,png画像ファイルだったら別なウィンドウを発生させる
の動作のため、「別ウィンドウ」を開くための target="_blank" を追加するための判定です。

これは、先の投稿における
>> (3) 返却された結果が画像かどうかを調べる。
>>  → Content-Type ヘッダで判断するか、実際に受け取ったバイナリの内容から調査。
に相当する判定処理です。


しかし、画像の判別は意外と面倒です。

たとえば URL の末尾が .jpg だったからといって、相手が JPEG 画像とは限りませんよね。
それが画像を返すかどうかは、実際にダウンロードしてみるまで分からないわけです。

簡易的な方法としては、先に書いた「Content-Type ヘッダで判断」が楽ですが、
Content-Type ヘッダの値が必ずしも信頼できるわけではありません。サーバーから
実際に返されたデータを見て、それが jpg/gif/png のバイナリであるかどうかを
判断した方が確実だと思います。


いずれにせよ、クリックする前には、リンク先が画像であるかどうかを
確実に調べることはできません。実際にダウンロードしてみる必要がありますので、
>> (2) ServerXMLHttpRequest オブジェクトで、その URL をバックグラウンドでリクエスト。
といった対処が必要になってくるでしょう。


参考までに、Content-Type を得る方法を記述しておきます。
参照設定に [Microsoft XML, vX.X]を加えておいてください。

Public Function IsPicture(ByVal URL As StringAs Boolean
    'Content-Type法 
    Dim req As MSXML2.IServerXMLHTTPRequest
    Set req = New MSXML2.ServerXMLHTTP
    req.open "HEAD", URL, False
    req.send

    Dim contentType As String
    contentType = req.getResponseHeader("Content-Type")
    If contentType Like "image/*" Then
        IsPicture = True
    Else
        IsPicture = False
    End If
End Function



> Aタグの_blank固定は何故?
固定ではありません。画像のときのみ、別ウィンドウ表示のために _blank となりますが、
それ以外ではtarget は変化させません。

> 普通にクリックされたら音がなりリンク先にナビゲートして欲しいです。
「普通」と「普通ではない」場合とのクリックの違いが、どのような物であるのか曖昧ですが、
先のコードでも、画像なら、リンク先の画像に別ウィンドウでナビゲートしますし、
画像以外なら、同じウィンドウ(もしくは、元のHTML で指定されたウィンドウ)に、
ナビゲートされますよ。

なお、音を鳴らす処理はご自身で組み込んでみてください。


> ここはセレクト文にしたいです。
どうぞ。


> タイマーイベントを設定するのは何故?リンク先に行くのをすぐに
> 行かず、周期的にリンクのクリックを判定するため?
処理をワンテンポ遅らせるための遅延処理です。

メッセージ処理の関係上、イベント処理中にページ遷移されると都合が悪いため、
実際のページ遷移が、イベント処理が終わった後(Exit Sub/End Sub後)に行われるよう、
一呼吸おいてから Click させています。

先のサンプルにおいては、55ミリ秒後にタイマーを稼働させ、その Timer イベント内で、
Click を呼び出しています。また、タイマーによる遅延呼び出しは一回だけで良いので、
タイマー周期的に呼ばれてしまうことが無いよう、Timer が発生するとすぐに、
Enabled = False でタイマーを停止させています。