Internet Explorer オブジェクト モデルへのアクセス

Paul Cornell
Microsoft Corporation

April 2001

対象 :
   Microsoft® FrontPage® Version 2002

概要 : この記事では、Microsoft FrontPage 5.0 Page Object Reference Library の Page オブジェクト モデルおよび、FrontPage 5.0 Web Object Reference Library の Application オブジェクト モデルと Web オブジェクト モデルがどのように違うかを説明します。開発者は Page オブジェクト モデルを使用することにより、デザイン時に Web ページで HTML を操作できます。

目次

はじめに
FrontPage Object Reference Library 間の違い
Page オブジェクト モデルの理解
   アクティブ Web ページへのアクセス
   アクティブ Web ページの HTML の操作
   すべてを組み合わせる
Visual Basic® Scripting Edition (VBScript) の使用
まとめ

はじめに

ほかの多くの Microsoft Office XP ではデザイン時/実行時の両方の開発環境へのアクセスを提供するのに対し、FrontPage Version 2002 に含まれる Microsoft FrontPage 5.0 Web Object Reference Library と Page Object Reference Library は、デザイン時の開発環境のみへのアクセスを提供します。 つまり、これらのオブジェクトでは、Web ページおよび Web サイトのデザイン段階で使用するための FrontPage ユーティリティ (COM アドインなど) を作成できることを意味します。Web ページと Web サイトの設計と構築が完了した後、Microsoft Visual Basic Scripting Edition (VBScript) などの Web ページ スクリプティング言語を使用して、実行時にユーザーが Web ブラウザで Web ページを表示するときに対話効果をもたらすことができます。この記事では、FrontPage Object Reference Library と VBScript を説明し、FrontPage ソリューションを作成するときにこれらのテクノロジを使用できるようにします。

FrontPage Object Reference Library 間の違い

FrontPage Version 2002 には以下の 2 種類のライブラリが含まれています。

  • FrontPage 5.0 Web Object Reference Library

  • FrontPage 5.0 Page Object Reference Library

オブジェクト ブラウザの [プロジェクト/ライブラリ] ボックスで、[FrontPage] をクリックすることにより、Visual Basic Editor で Web Object Reference Library のさまざまなメンバを表示できます。Page Object Reference Library のメンバを表示するには、オブジェクト ブラウザの [プロジェクト/ライブラリ] ボックスで、[FrontPageEditor] をクリックします。

これらの 2 種類のライブラリは、次の 3 つの FrontPage オブジェクト モデルへのアクセスを提供します。

  • Application オブジェクト モデル

  • Web オブジェクト モデル

  • Page オブジェクト モデル

Application オブジェクト モデルと Web オブジェクト モデルのメンバは Web Object Reference Library に存在し、 Page オブジェクト モデルのメンバは Page Object Reference Library に存在します。

Application オブジェクト モデルは、Web オブジェクト モデルと Page オブジェクト モデルへのプログラム アクセスを提供します。Application オブジェクト モデルを使用して、アクティブ Web、アクティブ ページ、開いているウィンドウ、COM アドイン、コマンド バー、グループ作業オブジェクト、Web ナビゲーション要素、元になるオペレーティング システム、テーマ、Web フォルダ、およびその他の FrontPage ベースの Web にアクセスできます。

Web オブジェクト モデルは、複数の FrontPage ベースの Web サイトおよびそのコンテンツへのプログラム制御を提供します。また、Web オブジェクト モデルは、Microsoft Visual SourceSafe® を使用して、Web サイトのソース コントロールのサポートも提供します。

Page オブジェクト モデルは個別の Web ページへのアクセスを提供し、Microsoft Internet Explorer version 4.0 以降の Document オブジェクト モデルの多くの機能を反映します。

図 1 は、Application、Web、および Page の各オブジェクト モデル内のオブジェクトとコレクション間のリレーションシップのグラフィック表現です。表 1 は、各オブジェクトとコレクションが何を表しているかを説明しています。表 2 は、これらのオブジェクトやコレクションにアクセスするために使用できるコード サンプルのリストを提供しています。

図 1. Application、Web、および Page の各オブジェクト モデル内のオブジェクト/コレクション間のリレーションシップ

表 1. Web オブジェクト モデルと Page オブジェクト モデルで選択したオブジェクト/コレクションの説明

オブジェクト/コレクション 説明
Webs コレクション Web サーバー上の FrontPage ベースの Web のコレクション。
WebEx オブジェクト Web サーバー上の特定の FrontPage ベースの Web。
WebWindows コレクション 開いている FrontPage ウィンドウのコレクション。
WebWindowEx オブジェクト 開いている特定の FrontPage ウィンドウ。
PageWindows コレクション 開いている Web ページのコレクション。
PageWindowEx オブジェクト 開いている特定の Web ページ。
FPHTMLDocument オブジェクト Web ページのコンテンツ。

表 2. Web オブジェクト モデルと Page オブジェクト モデルで選択したオブジェクト/コレクションにアクセスするためのサンプル コード

オブジェクト/コレクション サンプル コード (With Application)
Webs コレクション .Webs
WebEx オブジェクト .Webs(Index).ActiveWeb
WebWindows コレクション .Webs(Index).WebWindows.WebWindows.ActiveWeb.WebWindows
WebWindowEx オブジェクト .Webs(Index).WebWindows(Index).ActiveWebWindow
PageWindows コレクション .Webs(Index).WebWindows(Index).PageWindows.WebWindows(Index).PageWindows.ActiveWebWindow.PageWindows
PageWindowEx オブジェクト .Webs(Index).WebWindows(Index).PageWindows(Index).WebWindows(Index).PageWindows(Index).ActiveWebWindow.PageWindows(Index).ActiveWebWindow.ActivePageWindow.ActivePageWindow
FPHTMLDocument オブジェクト .Webs(Index).WebWindows(Index).PageWindows(Index).Document.WebWindows(Index).PageWindows(Index).Document.ActiveWebWindow.PageWindows(Index).Document.ActiveWebWindow.ActivePageWindow.Document.ActiveDocument

Application、Web、および Page の各オブジェクト モデルの詳細については、Microsoft FrontPage のヘルプ (プログラミングに関する情報)をご覧ください。

Application オブジェクト モデルと Web オブジェクト モデルの使用はわかりやすいものです。これらのオブジェクト モデルのメンバの使い方はほかの Office XP のオブジェクト モデルの使い方と同様なので、この記事では詳しく説明しません。しかし、Page オブジェクト モデルにアクセスするときは、馴染みのある Office ベースのオブジェクト モデルから、わずかに異なるオブジェクト モデルに考え方を切り替える必要があります。このオブジェクト モデルは、Internet Explorer 4.0 以降の Document オブジェクト モデルの考え方をかなり流用しています。この記事の残りの部分では、Page オブジェクト モデルについて説明し、ほかのオブジェクト モデルとどのように異なるかを説明します。

Page オブジェクト モデルの理解

前述したように、FrontPage の Page オブジェクト モデルの考え方は、Internet Explorer 4.0 以降の Document オブジェクト モデルの考え方をかなり流用しています。 実際、Page Object Reference Library に含まれるリファレンス マニュアルの大部分が、単に Office XP に含まれる DHTML、HTML および CSS のリファレンス ヘルプ ファイル (htmlref.chm) を指すように、多くの部分を借用しています。Page オブジェクト リファレンス ヘルプの読み方を理解しようとする場合、この動作を理解することが大切です。たとえば、Document オブジェクト モデルのオブジェクトに対応する FrontPage Page オブジェクト モデルのオブジェクトは、オブジェクト名の前に "FPHTML" または "IHTML" が付いています。したがって、FrontPage Page オブジェクト モデルの FPHTMLDocument オブジェクトは Internet Explorer Document オブジェクト モデルの document オブジェクトに対応しています。同様に、 FrontPage の IHTMLElements コレクションは Internet Explorer の elements コレクションに、FrontPage の FPHTMLSpanElement オブジェクトは Internet Explorer の SPAN オブジェクトに、という具合に対応しています。

アクティブ Web ページへのアクセス

アクティブ Web ページで HTML を操作するには、まずそのページにアクセスする必要があります。ページにアクセスするには、アクティブ Web ページへのアクセスを得るために Application オブジェクト全体を移動し、その後 Page オブジェクト モデルを使用して、そのページのコンテンツを操作します。以下のコード サンプルは、アクティブ Web ページの少数のプロパティにアクセスする方法を示しています。

  Sub DisplayActiveWebPageHTML()
    Dim objDoc As FPHTMLDocument

    Set objDoc = ActiveDocument

    ' アクティブ Web ページの HTML をすべて表示します。
    MsgBox "Entire HTML: " & vbCrLf & vbCrLf & objDoc.DocumentHTML

    ' <BODY> タグを持つ <BODY> テキストと持たない <BODY> テキストを表示します。
    With objDoc.body
        MsgBox "<BODY> outer HTML: " & vbCrLf & vbCrLf & .outerHTML
        MsgBox "<BODY> inner HTML: " & vbCrLf & vbCrLf & .innerHTML
    End With
End Sub

上記の例では、以下のことを行っています。

  • 変数 objDoc を Application オブジェクト モデルの Application オブジェクトの ActiveDocument プロパティに初期化することにより、コードは Page オブジェクト モデルの一部である FPHTMLDocument オブジェクトを返します。

  • FPHTMLDocument オブジェクトの DocumentHTML プロパティは、アクティブ Web ページの HTML コード全体を表す String 値を返します。

  • FPHTMLDocument オブジェクトの body プロパティは、アクティブ Web ページの BODY エレメントを表す IHTMLElement オブジェクトを返します。

  • IHTMLElement オブジェクトの outerHTML プロパティは、<BODY> タグを含めて、 BODY エレメント内の HTML コード全体を表す String 値を返します。

  • IHTMLElement オブジェクトの innerHTML プロパティは、<BODY> タグを除いて、 BODY エレメント内の HTML コード全体を表す String 値を返します。

アクティブ Web ページの HTML の操作

Page オブジェクト モデルの本当の能力は、デザイン時にアクティブ Web ページの HTML コードを動的に操作することにあります。たとえば、以下のようなソリューションを作成できます。

  • 高機能な検索、置換操作の実行。

  • さまざまな A エレメントの href 属性の変更。

  • META エレメントの挿入の自動化。

  • 複数の IMG エレメントのプロパティの標準化。

これで、アクティブ Web ページの HTML コードにアクセスする方法がわかりました。以下の表はアクティブ Web ページの HTML の個別のエレメントのアクセスに使用できる FPHTMLDocument オブジェクトの主要な子オブジェクトを説明しています。

表 3. FPHTMLDocument オブジェクトの選択した子オブジェクト

FPHTMLDocument
オブジェクト プロパティ
返す子オブジェクト アクティブ Web ページで表す項目
activeElement IHTMLElement フォーカスを持つエレメント。
all IHTMLElementCollection すべてのエレメント。HTML タグごとに 1 つのエレメントが存在します。
anchors IHTMLElementCollection name または id 属性を持つすべての A エレメント。このコレクションのエレメントは、 HTML ソース内の順序で並びます。
body IHTMLElement BODY エレメント。
forms IHTMLElementCollection すべての FORM エレメント。このコレクションのエレメントは、HTML ソース内の順序で並びます。
images IHTMLElementCollection すべての IMG エレメント。このコレクションのエレメントは、HTML ソース内の順序で並びます。
links IHTMLElementCollection href 属性を持つすべての A エレメント。
scripts ITHMLElementCollection すべての SCRIPT エレメント。ドキュメント内のスクリプト位置 (HEAD エレメントまたは BODY エレメントのどちらか) とは無関係に、このコレクションのエレメントは、HTML ソース内の順序で並びます。
styleSheets FPHTMLStyleSheetsCollection すべての CSS (Cascading Style Sheet) 参照 URL と STYLE エレメント。

また、FPHTMLDocument オブジェクトの createElement メソッドを使用して、新しい HTML 要素を作成できます。

上記の表からわかるように、FPHTMLDocument オブジェクトから返る多くの子オブジェクトは、IHTMLElement オブジェクトまたは ITHMLElementCollection コレクションに対応しています。以下の表は、ITHMLElement オブジェクトと IHTMLElementCollection コレクションのより重要なメンバをいくつか一覧します。

表 4. IHTMLElement オブジェクトのメンバ(抜粋)

メンバ 説明
all プロパティ 指定したエレメント内のすべての子エレメントをすべて返します。HTML タグごとに 1 つエレメントが存在します。
children プロパティ all プロパティと同様に、指定したエレメント内のすべての子エレメントをすべて返しますが、オーバーラップしている HTML タグを持つ子エレメントは除きます。
id プロパティ 指定したエレメントの id 属性をあらわす String 値を返します。
innerHTML プロパティ 指定したエレメントの開始タグと終了タグ間の HTML コードを表す String 値を設定または返します (開始タグと終了タグ自体は含みません)。
innerText プロパティ innerHTML プロパティと同様に、指定したエレメントの開始タグと終了タグ間の HTML コードを表す String 値を設定または返します (開始タグと終了タグ自体は含みません)。
outerHTML プロパティ 開始タグと終了タグ自体を含めて、指定したエレメントの開始タグと終了タグ間の HTML コードを表す String 値を設定または返します。
parentElement プロパティ 指定したエレメントの親エレメントを表す IHTMLElement オブジェクトを返します。
tagName プロパティ 指定したエレメントの名前を表す String 値を返します。
getAttribute メソッド 指定したエレメントから指定した属性を返します。
insertAdjacentHTML メソッド 指定したエレメントの指定した位置に HTML コードを挿入します。
insertAdjacentText メソッド insertAdjacentHTML メソッドと同様に、指定したエレメントの指定した位置にテキストを挿入します。
removeAttribute メソッド 指定したエレメントから指定した属性を削除します。指定した属性が正常に削除されたかどうかを示す Boolean 値を返します。
setAttribute メソッド 指定したエレメントの指定した属性値を設定します。

表 5. IHTMLElementCollection オブジェクトのメンバ

メンバ 説明
length プロパティ 指定したコレクションのエレメント数を表す Long 値を返します。
item メソッド 名前またはインデックス番号により指定したエレメントを返します。
tags メソッド 指定した HTML エレメント名を持つエレメントをすべて返します。

すべてを組み合わせる

これで、FPHTMLDocument オブジェクト、IHTMLElement オブジェクトおよび IHTMLElementCollection コレクションのさまざまなエレメントが理解できたと思います。次に、指定した Web ページの HTML コードを操作するために、対応するメンバを使用する方法を示します。

以下の例は、アクティブ Web ページのすべてのエレメントを繰り返し、各エレメントのインデックス番号、名前、およびそのコンテンツをレポートします。このサブルーチンを使って、Web ページで使用されている HTML エレメントをすばやくドキュメント化できます。

  Sub ReportElementProperties()
    Dim objDoc As FPHTMLDocument
    Dim lngElement As Long
 
    Set objDoc = ActiveDocument

    With objDoc.all
        For lngElement = 1 To .Length – 1
            Debug.Print "Index: " & lngElement
            Debug.Print "Name: " & .Item(lngElement).tagName
            Debug.Print "Contents: " & .Item(lngElement).outerHTML
            Debug.Print
        Next lngElement
    End With
End Sub

例はわかりやすいものです。アクティブ Web ページの各エレメントにアクセスするために、IHTMLElementCollection コレクション (objDoc.all の呼び出しが返します) の item プロパティを使用することにより、 tagName プロパティと outerHTML プロパティが各エレメントの名前と HTML コードを返すので、それらを [イミディエイト] ウィンドウに表示します。

以下の例は、上記の例を元にして、アクティブ Web ページ上の A エレメントのすべての href 属性の先頭から文字列 http:// を削除します。このサブルーチンでは、デザイン時に独自の Web ページに対して高速な検索、置換ソリューションを作成するために、定数値を簡単に変更できます。

  Sub ReplaceElementAttributes()
    Dim objDoc As FPHTMLDocument
    Dim objElement As IHTMLElement
    Dim strTempText As String

    Const CHARACTER_LENGTH As Integer = 7
    Const STRING_FOUND As Integer = 1
    Const TAG_NAME As String = "a"
    Const ATTRIBUTE_NAME As String = "href"
    Const TARGET_STRING As String = "http://"

    Set objDoc = ActiveDocument

    ' ドキュメント内のすべての A エレメントの href 属性
    ' から "http://" 削除します。
    For Each objElement In objDoc.all.tags(tagName:=TAG_NAME)
        strTempText = objElement.getAttribute _
            (strAttributeName:=ATTRIBUTE_NAME)
        ' href 属性値の先頭に出現した場合のみ "http://" 
        ' 削除します。
        If InStr(strTempText, TARGET_STRING) = STRING_FOUND Then
            strTempText = Right(strTempText, _
                Len(strTempText) - CHARACTER_LENGTH)
            objElement.setAttribute strAttributeName:=ATTRIBUTE_NAME, _
                AttributeValue:=strTempText
        End If
    Next objElement
End Sub

以下にこの例が機能する方法を示します。

  • tags メソッドが、アクティブ Web ページの A エレメントのみを含む IHTMLElementCollection コレクションを返します。

  • A エレメントごとに、getAttribute メソッドが A エレメントの href 属性値を表す String 値を返します。

  • InStr 関数は、String 値が文字列 http:// で始まるかどうかを調べます。この文字列で始まる場合は、Right 関数と Len 関数を使用して、文字列から http:// 部分を切り離します。

  • 最後に、setAttribute メソッドが変更した文字列を A エレメントの href 属性値に書き戻します。

Visual Basic Scripting Edition (VBScript) の使用

Web ページのデザイン完了後に、Web ページのホスティング中にユーザーとの動的対話を提供する場合があります。これを行うために、VBScript などの Web ページ スクリプティング言語を使用できます。

VBScript は Visual Basic から継承されたものなので、Office の開発者として VBScript には馴染みがあることがわかります。また、VBScript は非常に寛容な言語であることにも気づくでしょう (コードは大文字、小文字を区別せず、すべてのオブジェクトが型 Variant として宣言されるなど)。

以下の例は、実行時にスクリプトがアタッチされている Web ページの各 A エレメントのコンテンツをレポートしています。

  <script id=clientEventHandlersVBS language=vbscript>
<!--
Sub window_onload
    Dim objElement
    Dim lngCurrentElement
    Dim strTempText

    Const TAG_NAME = "a"

    lngCurrentElement = 0

    For Each objElement In document.all.tags(TAG_NAME)

        ' エレメント番号により、ユーザーへのメッセージの
        ' 形式を設定します。
        If lngCurrentElement = 0 Then
            strTempText = "first"
        ElseIf lngCurrentElement = _
                document.all.tags(TAG_NAME).length - 1 Then
            strTempText = "last"
        Else
            strTempText = "next"
     End If

        ' 現在の <a> エレメントの HTML コンテンツをレポートし、
        ' エレメント カウンタを増加します。
        MsgBox "Content of the " & strTempText & " <" & _
            TAG_NAME & "> element = " & objElement.outerHTML

        lngCurrentElement = lngCurrentElement + 1

    Next
End Sub
-->
</script>

VBScript の詳細については、Microsoft Script Technologies Web site を参照してください。

まとめ

FrontPage Version 2002 に含まれている FrontPage 5.0 Web Object Reference Libraray および Page Object Reference Library は、 FrontPage ベースの Web を管理し、Web ページの HTML コードを操作するためのデザイン時のソリューションを作成する便利な方法を提供します。Web Object Reference Library の Application オブジェクト モデルと Web オブジェクト モデルは Office 開発者に馴染みがありますが、Page Object Reference Library の Page オブジェクト モデルはその大部分を Internet Explorer 4.0 以降の Document オブジェクトから流用しているので、Office の開発者には馴染みが薄いかもしれません。しかし、Page オブジェクト モデルはオートメーションをサポートするので、Office 開発者は Page オブジェクト モデルをすばやく駆使できるようになるでしょう。ソリューションの設計段階が完了した後は、VBScript などの Web ページ スクリプティング言語を使用して実行時の動的 Web ページを作成できます。