Windows Vista 以降における DHTML Editing Control の代用

ビューの切り替え:
スクリプトなし
Windows Vista 以降における DHTML Editing Control の代用

Van Kichline

Microsoft Corporation

2006 年 8 月

日本語版最終更新日 2006 年 11 月 20 日

概要: Windows Vista には、DHTML Editing Control が搭載されなくなります。このコントロールを使用する Web ページや Windows アプリケーションで引き続き WYSIWYG HTML エディタを使用するには、ページやアプリケーションの修正が必要となります。

適用対象:

Windows Vista で実行される Internet Explorer 7

DHTML Editing Control をホストする、Internet Explorer 向けの Web ページ

DHTML 編集 ActiveX コントロールまたは TriEdit ActiveX ドキュメントを使用する Windows アプリケーション

目次

紹介
Windows アプリケーションに対する影響
Web アプリケーションに対する影響
まとめ

紹介

DHTML Editing Control は、Web ページや Windows アプリケーションで WYSIWYG HTML 編集を行うために開発された ActiveX コントロールです。このコントロールは、1998 年の初めに Microsoft Visual InterDev 開発チームによって、ActiveX コントロール ギャラリーの一部としてリリースされました。その後すぐに、Internet Explorer とコントロールとの間に存在する緊密な結び付きから、コントロールは Internet Explorer のバージョンアップ時に更新の一部として出荷する方が便利であるとわかり、1999 年初めの Internet Explorer 5 リリースより、Internet Explorer に付属する形で出荷されてきました。

しかし、関係する複数の要因により、このコントロールに対するサポートを継続することはしだいに難しくなっています。Internet Explorer は進化を続け、Internet Explorer 5.5 や Internet Explorer 6 には WYSIWYG 編集機能が組み込まれています。これと並行して、セキュリティが Internet Explorer の主要な課題として浮上してきました。セキュリティを強化するため、ブラウザは危険性のあるコンテンツへのアクセスを制限します。しかし、エディタは変更 されたコンテンツへの接続を継続的に確保しようとします。いくつかのセキュリティ情報の公開により、ブラウザ環境におけるロックダウンがさらに強化された ため、DHTML Editing Control の有用性は少なくなり、所有コストは増大しています。

このような背景を踏まえて、コントロールは Windows Vista から削除されることが決定されました。このコントロールは、Windows Vista のベータ 1 バージョンには含まれていましたが、それ以降のベータ版および最終的な Windows Vista リリースには含まれません。

この文書では、このコントロールを使用する既存アプリケーションにこの決定が与える影響、このコントロールを使用しているアプリケーションや Web ページを特定する方法、およびそれらのアプリケーションや Web ページが受ける影響を最小限に抑える方法について説明します。

コントロールの構造

DHTML Editing Control は、"WYSIWYG HTML 編集" をサポートします。WYSIWYG とは、書式化された HTML が Web ページにどのように表示されるかを目で確認しながら、コントロールにテキストを入力できることを意味します。ユーザーは、さまざまなコマンドを使用して フォント、色、書式を調整し、その効果を即座に確認できます。これは、クライアント フォームのリッチ テキスト ボックス コントロールに似ていますが、データは RTF ではなく HTML 形式で保存されます。

DHTML Editing Control の構造は、他の大半のコントロールより複雑です。Dhtmled.ocx と TriEdit.dll という 2 つのコンポーネントから成っており、これらのコンポーネントは次のファイルに含まれています (Windows Vista には、これらのファイルは存在しません)。

  • [ドライブ名:]\Program Files\Common Files\Microsoft Shared\Triedit\dhtmled.ocx

  • [ドライブ名:]\Program Files\Common Files\Microsoft Shared\Triedit\TRIEDIT.DLL

これら 2 つのコンポーネントは、5 つの異なるオブジェクトを実装します。

Dhtmled.ocx

  • スクリプトを実行しても安全な DHTML Editing Control (DHTMLSafe)

  • DHTML Editing Control for Applications (DHTMLEdit)

  • DEGetBlockFmtNamesParam ヘルパー オブジェクト

  • DEInsertTableParam ヘルパー オブジェクト

TriEdit.dll

  • TriEdit ドキュメント オブジェクト

スクリプトを実行しても安全な DHTML Editing Control の DEGetBlockFmtNamesParam オブジェクトおよび DEInsertTableParam オブジェクトのみが、スクリプトを実行しても安全だとマークされており、Web ページ上で作成可能です。DEGetBlockFmtNamesParamDEInsertTableParam は、DHTML Editing Control によって実装されるコマンドとのデータの受け渡しにのみ使用される単純なオブジェクトです。

DHTML Editing Control for Applications は、スクリプトを実行しても安全とされるコントロールを集めた高度なコントロールであり、Visual Basic や Delphi で作成された、ActiveX をホストするアプリケーションで使用するために設計されています。このコントロールも Windows Vista から削除されます。ただし、マイクロソフトは、類似したサードパーティ製のコントロールのインストールを許諾し、このコントロールに依存するアプリケー ションが Windows Vista においても引き続き動作できるようにします。詳細については、このドキュメントで後述する「Windows アプリケーションへの影響を最小限に抑える方法」を参照してください。

TriEdit ドキュメント オブジェクトは、DHTML Editing Control の両方のバージョンで CoCreate によってインスタンス化される ActiveX ドキュメントであり、ActiveX ドキュメントのホスティング アプリケーションで個別にインスタンス化することもできます。ActiveX ドキュメントをホストする際は、コントロールをホストするときよりも手順が複雑になりますが、編集対象の外観と統合をより直接的に制御できるという利点が あります。DHTML Editing Control for Applications と同様に、TriEdit ドキュメント オブジェクトもサードパーティ製の類似オブジェクトを使用することによって Windows Vista でサポートされます。

WYSIWYG HTML 編集機能、および標準的編集タスク用のプロパティ、メソッド、イベントのセットに加えて、DHTML Editing Control および TriEdit ドキュメント オブジェクトでは次の機能がサポートされます。

  • 複数回分の操作を元に戻すまたはやり直す操作

  • 基本的な表編集

  • ドラッグによる移動、サイズ変更、UI アクティブ化などの選択機能

  • 絶対位置指定と Z オーダー

  • ソース コードの保存

  • HTML タグのグリフ レンダリング

  • デザイン タイム コントロール (DTC) のサポート (元々は Microsoft Visual InterDev の機能)

  • キーボード ショートカット

これらの機能の一部は、DHTML designMode プロパティを使用して実装されるので、MSHTML 編集 と呼ばれる機能によって Internet Explorer に組み込まれます。ただし、すべての DHTML Editing Control 機能が MSHTML 編集でサポートされるわけではありません。たとえば、DHTML Editing Control のソース コード保存 (HTML のソース コードの書式を保持する) 機能は MSHTML 編集では使用できません。また、絶対位置指定と Z オーダーは、Internet Explorer によって処理されるようになります。表の編集や DTC はサポートされません。

DHTML Editing Control を使用する Web ページの場合は、特にソース コードの保存機能がサポートされなくなることによって大きな影響を受けます。この機能に代わる有効な方法は存在しないので、コントロールの機能を再現する にはこの問題が技術上の大きな課題となります。

Windows アプリケーションに対する影響

DHTML Editing Control for Applications が組み込まれた Windows アプリケーションは、Windows Vista では意図したとおりに機能しなくなります。たとえば、Visual Basic アプリケーションを起動したり、コントロールを含むフォームをインスタンス化したりすると、次のようなメッセージが表示される可能性があります。

コンポーネント 'dhtmled.ocx' またはその依存関係の 1 つが適切に登録されていません: ファイルが存在しないか、あるいは不正です。

Delphi アプリケーションは、処理されない例外をスローする可能性があります。

影響を受ける Windows アプリケーションの特定

Visual Basic アプリケーションに DHTML Editing Control が含まれているかどうか確認するには、Windows の findstr コマンドで次の構文を使用します。

findstr /m DHTMLEDLibCtl.DHTMLEdit YourApplication.exe

Delphi アプリケーションには、"DHTMLEDLib_TLB" と "IDHTMLEdit" という文字列が含まれています。したがって、次のコマンドにより、コントロールを使用する Visual Basic および Delphi アプリケーションを見つけることができます。

findstr /im dhtmledlib YourApplication.exe

C および C++ アプリケーションは、DHTML Editing Control を使用せずに直接 TriEdit を使用する場合があります。通常、低レベル言語では、タイプ ライブラリをロードする代わりに、CoCreateInstance メソッドを使用して OLE オブジェクトをインスタンス化します。この場合、オブジェクトの作成に使用される GUID はアプリケーションにコンパイルされます。コントロールと TriEdit ドキュメントの GUID は次のとおりです。

  • TriEdit ドキュメント: {438DA5E0-F171-11D0-984E-0000F80270F8}

  • DHTMLEdit: {2D360200-FFF5-11d1-8D03-00A0C959BC0A}

  • ITriEditDocument: {438DA5DF-F171-11D0-984E-0000F80270F8}

  • IDHTMLEdit: {CE04B591-2B1F-11D2-8D1E-00A0C959BC0A}

コンパイルされたコードを検索する場合は、GUID を表す特定のパターンを探すことができます。たとえば、次の GUID

{ABCDEFGH-IJKL-MNOP-QRST-UVWXYZ012345}

は、バイナリ ファイルで次の 16 進列になります。

GH EF CD AB KL IJ OP MN QR ST UV WX YZ 01 23 45

次の例は、実行可能なバイナリ ファイルでこれらの GUID を検索する単純な C# プログラムです。

// Compile and execute:  "FindGUIDs YourApplication.exe"
using System;
using System.Text;
using System.IO;
 
namespace FindGUIDs {
class Program {
  static void Main(string[] args) {
    FileStream    fs = File.OpenRead(args[0]);
    StringBuilder sb = new StringBuilder();
    do {
      Int32 b = fs.ReadByte();
      if (-1 == b) {
        break;
      }
      sb.AppendFormat("{0:X2}", b);
    } while (true);
    fs.Close();
    String s = sb.ToString();
    if (s.Contains("E0A58D4371F1D011984E0000F80270F8"))
      Console.Out.WriteLine("GUID for TriEditDocument Class detected.");
    if (s.Contains("DFA58D4371F1D011984E0000F80270F8")) {
      Console.Out.WriteLine(
        "GUID for ITriEditDocument Interface detected.");
      }
      if (s.Contains("0002362DF5FFd1118D0300A0C959BC0A")) {
        Console.Out.WriteLine("GUID for DHTMLEdit Class detected.");
      }
      if (s.Contains("91B504CE1F2Bd2118D1E00A0C959BC0A")) {
        Console.Out.WriteLine("GUID for IDHTMLEdit Interface detected.");
      }
    }
  }
}

C、C++ および他の低レベル言語が COM オブジェクトをインスタンス化する方法は複数あるため、上記のサンプルで示した方法でコントロールやドキュメント オブジェクトのインスタンスをすべて検索できるかどうかは保証されません。このテストで検索できなかった場合は、Windows の findstr コマンドを使用して、438DA5E0 または2D360200な ど、テキスト表記された GUID の一部を検索します。ソース コードが入手できる場合は、注意深く確認してください。GUID の一部か "dhtmledit" や "triedit" などのテキストを検索します。GUID をテキストとして表す方法は複数あるため、GUID の一部を検索することは重要です。最初の 8 桁は連続しており、通常は一意であるので、検索パターンとして使用するには便利です。

Windows アプリケーションへの影響を最小限に抑える方法

DHTML Editing Control と TriEdit は Windows Vista から削除されますが、ISV は署名された Microsoft Windows インストーラ (.msi ファイル) にパッケージされたコンポーネントとして、これらのバイナリ コンポーネントを使用することができます。スクリプトを実行しても安全な DHTML Editing Control は、このパッケージには含まれません。ライセンスに関する情報は、インストーラで表示される使用許諾契約書に記載されています。パッケージをインストール または再配布する前に、必ずこの契約書を注意深く読んでください。

Windows インストーラを取得するには、Microsoft ダウンロード センター Web サイト (英語) にアクセスしてください。このインストーラは署名済みであり、コントロールと TriEdit の署名済みバイナリ コンポーネントを含んでいます。これらのコンポーネントは両方とも、Windows Vista で使用できるよう修正されています。このパッケージは、Windows Vista のみにインストールされます。Windows XP など Windows の以前のバージョンでは実行できません。このインストーラを Windows の以前のバージョンで実行しようとすると、ダイアログ ボックスに次のエラーが表示されます。

このインストーラは Windows Vista 用に設計されています。インストールは中止されます。

ファイルをインストールするには、ダブルクリックするか、右クリックしてから [インストール] を選択します。あるいは、次のコマンドを実行することもできます。

msiexec /i dhtmled.msi

これにより Dhtmled.ocx と Triedit.dll が次のディレクトリにインストールされ登録されます。

%windir%\Program Files\Common Files\Microsoft Shared\dhtmled\

コントロールをインストールすると、Windows コントロール パネルの [プログラムの追加と削除] に [DHTML 編集コンポーネント] というエントリが追加されます。

Windows Vista 用のバイナリ コンポーネントをインストールすれば、DHTML Editing Control for Applications と TriEdit を、以前の Windows バージョンの場合と同じように使用することができます。すべての機能が維持されており、GUID、ProgID、タイプ ライブラリ名などもすべて同一です。(スクリプトを実行しても安全な DHTML Editing Control は Windows Vista から削除されるため、その点でのみユーザー エクスペリエンスは変化します。詳細については、このドキュメントで後述する「Web アプリケーションに対する影響」を参照してください。)

レガシー アプリケーション

Dhtmled.msi インストーラを使用すると、レガシー アプリケーションは Windows Vista 上でも従来と同じように動作します。新しいバイナリ コンポーネントをインストールせずに Windows Vista で DHTML Editing Control for Applications を含むレガシー アプリケーションを実行すると、さまざまなエラー モードが発生します。アプリケーション ベンダは、更新プログラムを提供するか、Windows Vista インストーラを入手するよう直接エンド ユーザーに通知を送付することができます。エンド ユーザーは Windows Vista バージョンを各自インストールして、アプリケーションを引き続き使用することができます。Windows Vista のインストール後にエラーが発生するようになると、通常ユーザーはカスタマ サービスに問い合わせる前に、インターネットでエラー メッセージのテキストと製品名を検索します。したがって、ベンダはインストーラの入手場所に関する情報を掲載しておく必要があります。通常は、 Windows Vista バージョンのバイナリ コンポーネントをダウンロードおよびインストールする方法が、ユーザーにとって最もわかりやすい方法です。

新しいアプリケーション

新しいアプリケーションの場合は、製品に Windows Vista インストーラを同梱し (適切なライセンスも必要)、製品のインストーラと Windows Vista インストーラとを連携させることができます。Windows Vista インストーラは、Windows のインストールされているプログラム リストにエントリを追加せず、自動的に実行することができます(詳細については、MsiExec.exe のドキュメントを参照してください)。

ただし、マイクロソフトは、インストーラにおいて、インストールされているプログラムのリストに DHTML Editing Control を追加できるようにすることをお勧めします。また、コントロールのアンインストールは、アプリケーションのアンインストール時に自動的に行うのではなく、 ユーザーが任意に実行できるようにしてください。

この方法では、ロゴ準拠のインストールを提供することはできません。これは、変更の影響を最小限に抑えるため、次のような理由で適切といえます。

  • 限られた数のアプリケーションだけがこれらのコンポーネントを含んでいます。

  • 1 台のコンピュータにこれらのアプリケーションが複数ホストされる可能性は低いと考えられます。

  • 他のアプリケーションによって DHTML Editing Control がアンインストールされ、アプリケーションが破損しても、[プログラムの追加と削除] の修復オプションを使用して簡単に修復することができます。

アプリケーションでロゴ準拠を取得する必要がある場合は、各自 Windows Vista 用の DHTML Editing Control をインストールするようユーザーに通知する必要があります。

Web アプリケーションに対する影響

DHTML Editing Control は、Internet Explorer 5 のリリース以来、HTML、ASP、ASP.NET ページ、および HTTP でアクセスできる他のドキュメントで使用されてきました。 しかし、Windows Vista では、スクリプトを実行しても安全な DHTML Editing Control を使用する Web ページでコントロールをロードできなくなります。この場合、コントロールの代わりに、イメージのプレースホルダが表示されます。

htmleditinfuture_fig1.gif

加えて、コントロールを参照するスクリプトも例外をスローします。スクリプトの例外はスクリプトの評価を終了させるため、通常、そのスクリプトに よって制御される他の機能も動作しなくなります。したがって、Windows Vista クライアントがページを使用するためには、スクリプトを実行しても安全な DHTML Editing Control が含まれている場合、それらのページを修正するか、対象を変更する必要があります。

   当初、DHTML Editing Control for Applications (スクリプトの実行が安全ではないコントロール) は、警告メッセージが表示されるものの Web ページでも使用することができました。しかし、Internet Explorer 6 のリリースでコントロール内のセキュリティが強化されたため、アプリケーション用のこのコントロールは事実上 Web ページで使用できなくなりました。通常、機能的な Web ページによって DHTML Editing Control for Applications がインスタンス化されることはありません。

影響を受ける Web ページの特定

スクリプトを実行しても安全な DHTML Editing Control を含む Web ページは、このコントロールを次のような <object> タグとして実装します。

<!-- The DHTML Editing Control; original GUID -->
<OBJECT id="editor" height=400 width=640
  classid="clsid:2D360201-FFF5-11d1-8D03-00A0C959BC0A">
</OBJECT>

コントロールを使用する多くの Web ページは Microsoft Visual InterDev で作成されたか、Visual InterDev で生成されたサンプル コードを使用しています。その場合、マークアップは次のようになります。

<OBJECT classid="clsid:2D360201-FFF5-11D1-8D03-00A0C959BC0A"
    class="anyClass" ID="editor" VIEWASTEXT>
  <PARAM name="ActivateApplets" value="0">
  <PARAM name="ActivateActiveXControls" value="-1">
  <PARAM name="ActivateDTCs" value="-1">
  <PARAM name="ShowDetails" value="0">
  <PARAM name="ShowBorders" value="0">
  <PARAM name="Appearance" value="0">
  <PARAM name="Scrollbars" value="-1">
  <PARAM name="ScrollbarAppearance" value="1">
  <PARAM name="SourceCodePreservation" value="-1">
  <PARAM name="AbsoluteDropMode" value="0">
  <PARAM name="SnapToGrid" value="0">
  <PARAM name="SnapToGridX" value="50">
  <PARAM name="SnapToGridY" value="50">
  <PARAM name="UseDivOnCarriageReturn" value="1">
</OBJECT>

追加のタグは、コントロールによってサポートされているパラメータの初期化の値を表します。コントロールのプロパティ バッグを保持する Web ページ デザイン アプリケーションでは、ページを保存するときに HTML コンテンツと共にこれらの PARAM タグも保存されます。

最も効果的かつ短時間で行えるチェックは、保存されている Web ページで共通の GUID (2D360201-FFF5-11D1-8D03-00A0C959BC0A) またはその一部 (2D360201) を検索する方法です。このテキストが含まれるページには、ほぼ例外なくスクリプトを実行しても安全な DHTML Editing Control が含まれます。

Web アプリケーションへの影響を最小限に抑える方法

DHTML Editing Control と TriEdit が Windows Vista から削除されることを受けて、マイクロソフトは DHTML Editing Control for Applications と TriEdit を、署名された Windows インストーラ (.msi ファイル) にパッケージされたシステム コンポーネントとして使用できるようにしました。ただし、スクリプトを実行しても安全な DHTML Editing Control は、このパッケージに含まれません。

DHTML Editing Control の実装で提供されていた機能のほとんどは、MSHTML 編集により (designMode プロパティを使用して) Internet Explorer で直接使用できるようになっています。したがって、通常コントロールの機能は MSHTML 編集によって代用することができます。たとえば、このドキュメントで後述するように、デザイン モードで配置される <iframe> 要素を使用することができます。

代用コントロールの使用

影響を最小限に抑える 1 つの方法は、ActiveX コントロールや ASP.NET カスタム コントロールを使用して代用する方法です。インターネットで "HTML WYSIWYG エディタ コントロール" を検索すると、いくつかの候補となるコントロールが見つかります。マイクロソフトはこのような製品の調査を行っていないため、いずれかの製品を推奨するこ とはできません。したがって、各自が必要に応じて最適なものを選択する必要があります。通常、コントロールの代用によって DHTML Editing Control とは異なるオブジェクト モデルが存在することになるため、コントロールを使用するページではサポートするスクリプトの修正が必要となります。この修正の難易度は、どれほど高度な 実装を行うかにより異なります。

選択的なリダイレクトの実装

スクリプトを実行しても安全な DHTML Editing Control をインスタンス化できるのは、Windows で実行される Internet Explorer ブラウザのみです。したがって、さまざまなブラウザに対応する "リーチ範囲の広い" アプリケーションでは、既にブラウザの検出機能やリダイレクト機能を組み込んでいる場合があります。たとえば、Internet Explorer の要求はコントロールを含むページにリダイレクトし、他のブラウザの要求は他の形式を使用するページにリダイレクトするアプリケーションがあります。

要求が Windows Vista から送信されたものであるかどうかは、要求と共に送信されるユーザー エージェント文字列を調べれば確認できます。Windows Vista で実行される Internet Explorer 7 のユーザー エージェント文字列は、次のようになります。

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; MSDigitalLocker Vista 
1.3; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; WinFX RunTime 
3.0.50727; InfoPath.1)

C# で記述された次の例は、Windows Vista と Internet Explorer 7 の要求を検出し、リダイレクトするコードを示しています。

protected void Page_Load(object sender, EventArgs e) {
    string ua = Request.UserAgent.ToLower();
    bool isVista = ua.Contains("windows nt 6.");
    bool isIE7 = ua.Contains("msie 7.");
    Response.Redirect((isVista && isIE7) ?
        "Surrogate.htm" : "DHTMLEd.htm");
}

ASP 用の Visual Basic Scripting Edition (VBScript) では、次のコードで同じタスクを実行できます。

<% @Language = "VBScript" %>
<%
Dim ua, isVista, isIE7
ua = LCase(Request.ServerVariables("HTTP_USER_AGENT"))
isVista = (0 < InStr(ua, "windows nt 6."))
isIE7   =  (0 < InStr(ua, "msie 7."))
If isVista AND isIE7 Then
    Response.Redirect "Surrogate.htm"
Else
    Response.Redirect "DHTMLEd.htm"
End If
%>

編集機能の再実装

DHTML Editing Control の機能が不可欠であり、他のコントロールによる代用が難しい場合は、コントロールの機能を MSHTML 編集およびスクリプトを使用して再実装する方法を選択できます。MSHTML 編集は Internet Explorer 5.5 以降のバージョンで使用でき、DHTML Editing Control は Internet Explorer 5.0 以降のバージョンで使用できます。したがって、機能を再実装するときには、Internet Explorer 5.0 を使用しているユーザーのために、DHTML Editing Control を含むページへのリダイレクトが引き続き必要となる場合もあります。

ここでは、スクリプトを実行しても安全な DHTML Editing Control の機能を <iframe> 要素を使用して再実装する 1 つの方法を紹介します。次のようなページを使用して、基本的な編集機能を実装できます。

<html>
<head>
<title>DHTML Editing Control Surrogate Example</title>
<script type="text/javascript">
function FillEditor() {
    var doc = editor.document;
    doc.designMode = "on";
    doc.write("<body><p><i>Visualize</i> <u>peace</u></p></body>");
    doc.close();
}
</script>
</head>
<body onload="FillEditor()">
  <iframe id="editor" scrolling="yes" height="100" width="300">
  </iframe>
  <p>
  <input type=button 
     value="Submit" 
     onclick=
       "alert(editor.document.getElementsByTagName('HTML')[0].outerHTML)">
</body>
</html>

このページは、書式化された HTML を含む編集可能な領域を表示します。この領域に入力し、斜体のオン/オフを切り替える CTRL+I や下線のオン/オフを切り替える CTRL+U などのホット キーを使用できます。[送信] ボタンを押すと、メッセージ ボックスに <iframe> 要素の HTML コンテンツが表示されます。DHTML Editing Control のプロパティ、メソッド、およびイベントに相当する機能を実装するには、スクリプトを使用する必要があります。

セキュリティ上の理由で、<iframe> の境界を越えてアクセスできるのは、同じドメインのコンテンツのみです。したがって、フレーム コンテンツへのアクセスを可能にするには、次の例に示すように、src 属性を使用して同じドメインの URL からコンテンツを初期化します。

<iframe id="editor" 
  scrolling="yes" 
  height="100" 
  width="300" 
  src="templates/blank.htm">
</iframe>

Internet Explorer における designMode プロパティを使用する編集の詳細については、マイクロソフト Web サイトの「Introduction to MSHTML Editing (英語)」を参照してください。

メソッド

次の表に、スクリプトを実行しても安全な DHTML Editing Control のメソッドの一覧と、Internet Explorer でそれらのメソッドをスクリプトによって再実装できるかどうかを示します。

スクリプトを実行しても安全な DHTML Editing Control のメソッド

コマンド

サポート可 / 不可

ExecCommand

部分的に可能

QueryStatus

部分的に可能

SetContextMenu

可能

NewDocument

可能

LoadURL

可能

FilterSourceCode

不可

Refresh

必要なし

ExecCommandQueryStatus メソッドの機能は、editor.document.execCommand とクエリー コマンドを editor.document オブジェクトに対して呼び出すことにより、代用できます。DHTML Editing Control によって実装されるコマンドのサブセットは、このドキュメントの「CommandID の値」で説明するように、スクリプトによって実行できます。

MSHTML 編集で QueryStatus メソッドの機能を使用するには、次のようなコードを含める必要があります。

var NOTSUPPORTED =  0;
var DISABLED     =  1;
var ENABLED      =  3;
var LATCHED      =  7;
var NINCHED      = 11;
var result = NOTSUPPORTED;
if(editor.document.queryCommandSupported(cmdName)) {
    result = editor.document.queryCommandEnabled(cmdName) ?
        ENABLED : DISABLED;
    if(ENABLED == result) {
        if(editor.document.queryCommandIndeterm(cmdName)){
            result = NINCHED;
        }
        else if(editor.document.queryCommandState(cmdName)) {
            result = LATCHED;
        }
    }
}
メソッドに関する追加情報

SetContextMenu メソッドは、文字列の配列と状態の配列 (MENU_UNCHECKED=0、 MENU_CHECKED=1、および MENU_GRAY=2) を取得し、エディタで oncontextmenu イベントが発生するまで格納します。このメソッドの代用としては、使用可能な HTML コンテキスト メニュー実装のいずれかを選択します (通常、createPopup メソッド)。

UseDivOnCarriageReturn プロパティをサポートしている場合、共にリロードされるコンテンツは、このプロパティの値の影響を受けます。Dirty プロパティをサポートしている場合は、新しいドキュメントの作成時にこのプロパティをクリアします。

NewDocument メソッドは、エディタのコンテンツを空白のドキュメントと置換します。このコマンドの代用としては、次のようなスクリプトを使用できます。

var htmlP = "<html><head><title>New Document</title></head>" + 
    "<body><p>&nbsp;</p></body></html>";
var htmlD = "<html><head><title>New Document</title></head>" + 
    "<body><div>&nbsp;</div></body></html>";
var useDivOnCR = false;
function NewDocument() {
    editor.document.write(useDivOnCR ? htmlD : htmlP);
    editor.document.close();
}

LoadURL メソッドの代用として、editor.src=url などのコードを使用します。Dirty プロパティをサポートしている場合は、新しいドキュメントをロードする際にクリアします。

FilterSourceCode メソッドは、ソース コードを保存する機能を提供します。スクリプトで、このメソッドを再実装することはできません。互換性を持たせるためにこのメソッドを定義する必要がある場合は、次の例で示すように、パラメータを返します。

function FilterSourceCode(str) { return str; }

Refresh メソッドは、コントロール ウィンドウの矩形領域を無効にします。このメソッドは、次の再実装の例で示すように、何の操作も行わないメソッドで代用できます。

function Refresh() {}
プロパティ

次の表に、スクリプトを実行しても安全な DHTML Editing Control のプロパティの一覧と、Internet Explorer でそれらのプロパティをスクリプトによって再実装できるかどうかを示します。

スクリプトを実行しても安全な DHTML Editing Control のプロパティ

プロパティ

データ型

方向

サポート可 / 不可

CurrentDocumentPath

文字列型

アウト

可能

DOM

オブジェクト型

アウト

可能

DocumentHTML

文字列型

イン/アウト

可能

IsDirty

ブール演算型

アウト

部分的に可能

SourceCodePreservation

ブール演算型

イン/アウト

不可

ActivateApplets

ブール演算型

イン/アウト

不可

ActivateDTCs

ブール演算型

イン/アウト

不可

ActivateActiveXControls

ブール演算型

イン/アウト

不可

ShowDetails

ブール演算型

イン/アウト

不可

ShowBorders

ブール演算型

イン/アウト

不可

AbsoluteDropMode

ブール演算型

イン/アウト

不可

Scrollbars

ブール演算型

イン/アウト

可能

Appearance

特殊

イン/アウト

可能

ScrollbarAppearance

特殊

イン/アウト

可能

SnapToGridX

長整数型

イン/アウト

不可

SnapToGridY

長整数型

イン/アウト

不可

SnapToGrid

ブール演算型

イン/アウト

不可

BaseURL

文字列型

イン/アウト

可能

DocumentTitle

文字列型

アウト

可能

UseDivOnCarriageReturn

ブール演算型

イン/アウト

可能

Busy

ブール演算型

アウト

可能

プロパティに関する追加情報

CurrentDocumentPath プロパティは、editor.location.href を返すことによって、実装できます。

DOM プロパティは、editor.document に相当します。

DocumentHTML プロパティは、editor.getElementsByTagName('HTML')[0].outerHTML として実装できます。

IsDirty プロパティの機能を完全に再現することはできません。ドキュメントに変更を加えるすべてのメソッド、プロパティ、およびコマンドに対して、エディタの <iframe> 要素と関連付けられたグローバル変数を設定することにより、類似した機能を持たせることができます。oncutonpasteondrop、および onmove など、ドキュメントをダーティな状態にするイベントは数多く存在します。詳細については、このドキュメントで後述される「イベント 」の DisplayChanged イベントに関する情報を参照してください。NewDocumentLoadURL などのメソッドは、グローバルなダーティ フラグをクリアする必要があります。

SourceCodePreservationActivateAppletsActivateDTCsActivateActiveXControlsShowDetailsShowBordersAbsoluteDropModeSnapToGridSnapToGridX および SnapToGridY プロパティは、スクリプトで実装できません。

Appearance プロパティは、DHTML Editing Control の境界線の外観を設定します。再実装では、editor.frameBorder を設定できます。

Scrollbars プロパティは、editor.body.scroll を "Yes" または "No" に設定することによって実装できます。また、次の比較を使用して取得することができます (editor.body.scroll=="no")。

ScrollbarAppearance プロパティを再実装するには、CSS 属性を使用します(詳細については、インターネットで "CSS フラット スクロールバー" を検索してください)。

DocumentTitle プロパティは、editor.document.title で代用できます。

UseDivOnCarriageReturn プロパティは、Enter キーの動作を間接的に指定するために設計されました。既定では、編集可能な HTML 領域で Enter キーを押すと、<p> 要素が挿入されます。DHTML Editing Control では、Enter キーを押すと、ユーザーが入力中のブロック要素が分割され、類似する 2 つのブロックが作成されます。カーソルが <p> 要素内にあれば、同様の属性を含む <p> 要素がもう 1 つ作成されます。カーソルが <div> 要素内にあれば、<div> 要素がもう 1 つ作成されます。

UseDivOnCarriageReturn プロパティは、NewDocument メソッドを呼び出して作成される空白ドキュメントの既定のブロック要素を指定します。このプロパティが true に設定されている場合、既定のブロックは <div> 要素になり、次のような初期テキストが表示されます。

<HTML>
<HEAD><TITLE></TITLE></HEAD>
<BODY><DIV>&nbsp;</DIV></BODY>
</HTML>

true に設定されていない場合、初期テキストは次のようになります。

<HTML>
<HEAD><TITLE></TITLE></HEAD>
<BODY><P>&nbsp;</P></BODY>
</HTML> 

Busy プロパティは、コントロールが現在ロードされているかどうかを示します。このプロパティは、editor.document.readyState != "complete" で代用できます。

BaseURL プロパティの再実装

BaseURL プロパティは、相対 URL の解決に使用される URL のルート部分を設定します。相対 URL の解決法は、DHTML Editing Control と MSHTML 編集とで大きく異なっています。DHTML Editing Control が Internet Explorer 4 に導入された当初は、ドキュメント オブジェクト モデル (DOM) に <head> 要素へのアクセスが含まれておらず、<base> 要素をドキュメントに追加するようプログラムできませんでした。そのため、コントロールは、相対 URL と BaseURL プロパティに格納されている基準 URL とを内部的に結合していました。Internet Explorer の現在のバージョンでは、<base> 要素をエディタ ドキュメントに簡単に追加することができます。ただし、この方法を使用すると、要素は editor.document プロパティ コンテンツの一部となるため、コントロールの BaseURL プロパティとは異なる動作をします。したがって、コントロールの BaseURL プロパティの動作を再現するには、ドキュメントのコンテンツから HTML コンテンツが取得された後に、ドキュメントから <base> 要素を削除しなければなりません。BaseURL プロパティの再実装には複雑な手順が求められるため、アプリケーションが意図どおりに動作するかを注意深くテストする必要があります。

MSHTML 編集と異なるもう 1 つの点は、DHTML Editing Control で IDM_NOFIXUPURLSONPASTE コマンドが実行されることです。このコマンドは、スクリプトからは使用できません。このコマンドは、コンテンツが編集可能な領域に貼り付けられるときに相対 URL が絶対 URL に変換されることを防ぎます。<base> 要素を設定して URL の変換設定を上書きするか、または変換された URL を正規表現を使用して修正できます。

ドキュメントの <base> 要素タグの値を取得するには、次のスクリプトを使用します。

var baseHref = "";
var h = editor.document.getElementsByTagName("head");
if((undefined != h) && (0 < h.length)) {
    var b = h[0].getElementsByTagName("base");
    if((undefined != b) && (0 < b.length)) {
        baseHref = b[0].href;
    }
}

ドキュメントの <base> 要素を設定するには、次のスクリプトを使用します。

var h = editor.document.getElementsByTagName("head");
if((undefined != h) && (0 < h.length)) {
    var b = h[0].getElementsByTagName("base");
    if((undefined == b) || (0 == b.length)) {
        var nb = editor.document.createElement("BASE");
        nb.href = newBaseHrefValue;
        h[0].insertAdjacentElement("afterBegin", nb);
    }
    else
        b[0].href = newBaseHrefValue;
}

<base> タグを、editor.document プロパティのコンテンツから返されるテキストから削除するには、次のスクリプトを使用します。

var html = DocumentHTML();
var rex = new RegExp("<BASE[\\s]+[^>]*>", "i");
html = html.replace(rex, "");
イベント

次の表に、スクリプトを実行しても安全な DHTML Editing Control のイベントの一覧と、Internet Explorer でそれらのイベントをスクリプトによって再実装できるかどうかを示します。

スクリプトを実行しても安全な DHTML Editing Control のイベント

イベント

サポート可 / 不可

DocumentComplete

可能

DisplayChanged

部分的に可能

ShowContextMenu(xPos , yPos)

修正により可能

ContextMenuAction(itemIndex)

修正により可能

Onmousedown

可能

Onmousemove

可能

Onmouseup

可能

Onmouseout

可能

Onmouseover

可能

Onclick

可能

Ondblclick

可能

Onkeydown

可能

Onkeypress

可能

Onkeyup

可能

Onblur

可能

Onreadystatechange

可能

ほとんどのイベントは、スクリプトでアタッチするようプログラムできます。onmousedown、onmousemove、onmouseup、onmouseout、onmouseover、onclick、ondblclick、onkeydown、onkeypress、および onkeyup イベントはすべて、次のような構文によってバインドできます。

editor.document.attachEvent("EventName", EventHandlerFunction)

onreadystatechangeonfocus、および onblur のバインディングは、<iframe> 要素のコンテンツが再ロードされるとリセットされる場合があります。そのため、これらのイベントを必要とする場合は、<iframe> 要素の属性を使用して、イベントのバインディングを宣言します。宣言により、バインディングは再ロードの後も保持されます。次の例は、これらのイベントのバインディングを宣言する方法を示します。

<iframe ID="editor" SCROLLING="yes" onreadystatechange="editor_ReadyStateChange()"
  onfocus="editor_OnFocus" onblur="editor_Blur()"></iframe>

DocumentComplete イベントの機能は、onreadystatechange イベントを処理し、editor.document.readyState=="complete" テストを含めることにより、再実装できます。他のイベント (前述のイベントは除く) は、ドキュメントの再ロード後に再アタッチできます。

DisplayChanged イベントの再実装は、複雑な手順を要します。このイベントは、DHTML Editing Control で頻繁に発生 (たとえば、マウスが移動するたびに発生する) しますが、ツールバーなどの UI 要素の状態を適切に維持するためには不可欠なイベントです。DHTML Editing Control は、コントロールの IOleCommandTarget オブジェクトに対する OLECMDID_UPDATECOMMANDS コマンドに応じて、DisplayChanged イベントを発生させます。しかし、スクリプトによって IOleCommandTarget オブジェクトにアクセスすることはできません。DisplayChanged イベントの機能を維持するには、onmousedownonkeypressonfocusonreadystatechangeoncutonpasteondroponmove、および onselectionchange イベントに応じて無条件でこのイベントを発生させます。加えて、カーソル移動キーの場合は onkeydown に対して、書式に変更を加えるホットキーの場合は onkeyup に対しても DisplayChanged イベントを発生させます。DisplayChanged イベントは、値を設定するコマンドの実行時にも発生させる必要があります。また、要素上でマウス ポインタを動かすと UI が変化するアプリケーションでは、onmousemove に対しても発生させる必要があります。

ホットキーが押されたことを検出するには、次のコードを使用します。

function IsHotKey(ev) {
    if(ev.ctrlKey && !ev.altKey) {
        var key = ev.keyCode;
        if((66 == key) || (73 == key) || (85 == key)) {
            return true;
        }
    }
    return false;
}

カーソル移動キーが押されたことを検出するには、次のスクリプトを使用します。

function IsCursorMovementKey(key) {
    if(key >= 37 && key <= 40 || key == 9) {
        return true;
    }
    return false;
}

ShowContextMenu イベントの機能は、DHTML の oncontextmenu イベントの機能とほぼ同じですが、ShowContextMenu イベントには X と Y パラメータが含まれています。HTML イベント モデルでは、これらのパラメータをイベントに含めることができません。そのため、ShowContextMenu イベントのハンドラをすべて変更する必要が生じます。X および Y パラメータへの参照は、editor.document.event.x および editor.document.event.y と置き換えることができます。

ContextMenuAction イベントは、イベントにパラメータを含められないためコードの修正が必要になるという点で ShowContextMenu イベントに似ています。この機能は、ユーザーの選択に応じて createEventObject(editor.document.event) を発生させ、イベント オブジェクトを作成することによって代用できます。イベント オブジェクトの returnValue プロパティの値を、コンテキスト メニュー実装で選択されたメニュー項目の ID に設定します。ホスティング コードでは、ContextMenuAction イベントによって返される itemIndex パラメータではなく returnValue を評価します。

CommandID の値

次の表は、DHTML Editing Control の ExecCommand および QueryStatus メソッドで使用されるコマンド ID と、DHTML execCommand メソッドで使用される対応するコマンド (該当するものがある場合) の一覧です。

ExecCommand および QueryStatus で使用される CommandID

DHTMLEdit コマンド

Cmd ID

execCommand

備考

DECMD_BOLD

5000

"Bold"

オン/オフ切り替え

DECMD_COPY

5002

"Copy"

 

DECMD_CUT

5003

"Cut"

 

DECMD_DELETE

5004

"Delete"

 

DECMD_DELETECELLS

5005

 

表の編集機能なし

DECMD_DELETECOLS

5006

 

表の編集機能なし

DECMD_DELETEROWS

5007

 

表の編集機能なし

DECMD_FINDTEXT

5008

 

ダイアログ ボックスなし

DECMD_FONT

5009

 

ダイアログ ボックスなし

DECMD_GETBACKCOLOR

5010

"BackColor"

特殊な値

DECMD_GETBLOCKFMT

5011

 

再実装

DECMD_GETBLOCKFMTNAMES

5012

 

再実装

DECMD_GETFONTNAME

5013

"FontName"

DECMD_GETFONTSIZE

5014

"FontSize"

DECMD_GETFORECOLOR

5015

"ForeColor"

特殊な値

DECMD_HYPERLINK

5016

"CreateLink"

 

DECMD_IMAGE

5017

"InsertImage"

 

DECMD_INDENT

5018

"Indent"

 

DECMD_INSERTCELL

5019

 

表の編集機能なし

DECMD_INSERTCOL

5020

 

表の編集機能なし

DECMD_INSERTROW

5021

 

表の編集機能なし

DECMD_INSERTTABLE

5022

 

表の編集機能なし

DECMD_ITALIC

5023

"Italic"

オン/オフ切り替え

DECMD_JUSTIFYCENTER

5024

"JustifyCenter"

 

DECMD_JUSTIFYLEFT

5025

"JustifyLeft"

 

DECMD_JUSTIFYRIGHT

5026

"JustifyRight"

 

DECMD_LOCK_ELEMENT

5027

 

Z オーダー

DECMD_MAKE_ABSOLUTE

5028

"2D-Position"

DECMD_MERGECELLS

5029

 

表の編集機能なし

DECMD_ORDERLIST

5030

"InsertOrderedList"

 

DECMD_OUTDENT

5031

"Outdent"

 

DECMD_PASTE

5032

"Paste"

 

DECMD_REDO

5033

 

元に戻す機能なし

DECMD_REMOVEFORMAT

5034

"RemoveFormat"

 

DECMD_SELECTALL

5035

"SelectAll"

 

DECMD_SEND_BACKWARD

5036

 

Z オーダー

DECMD_BRING_FORWARD

5037

 

Z オーダー

DECMD_SEND_BELOW_TEXT

5038

 

Z オーダー

DECMD_BRING_ABOVE_TEXT

5039

 

Z オーダー

DECMD_SEND_TO_BACK

5040

 

Z オーダー

DECMD_BRING_TO_FRONT

5041

 

Z オーダー

DECMD_SETBACKCOLOR

5042

"BackColor"

DECMD_SETBLOCKFMT

5043

"FormatBlock"

DECMD_SETFONTNAME

5044

"FontName"

DECMD_SETFONTSIZE

5045

"FontSize"

DECMD_SETFORECOLOR

5046

"ForeColor"

DECMD_SPLITCELL

5047

 

表の編集機能なし

DECMD_UNDERLINE

5048

"Underline"

オン/オフ切り替え

DECMD_UNDO

5049

 

元に戻す機能なし

DECMD_UNLINK

5050

"Unlink"

 

DECMD_UNORDERLIST

5051

"InsertUnorderedList"

 

名前が付けられているコマンド (上記の表の execCommand 列に名前が記載されているコマンド) は、 editor.document.execCommand(commandName) または editor.document.execCommand(commandName, 0, parameter) のいずれかの呼び出しを使用して実行できます。名前の記載されていないコマンドが提供する機能は、MSHTML 編集では使用できません。ただし、備考に "再実装" とあるものは使用できます。

DHTML Editing Control の ExecCommand および QueryStatus メソッドで使用できる名前の付けられていないコマンドは、Internet Explorer で MSHTML 編集によって次のような制限が課されているため、再実装できません。

  • 元に戻す : 元に戻すコマンドとやり直しコマンドはサポートされていません。

  • Z オーダー : Send BackwardBring Forward などの Z オーダー コマンドは実装できません。designMode 編集については、絶対位置指定された要素の位置変更やサイズ変更がサポートされておらず、実用的な 3D 編集機能がほとんど存在しないため、このドキュメントではこれらのコマンドについて取り上げません。

  • 表の編集 : DHTML Editing Control には、表を編集するコマンドがいくつか含まれていました。これらのコマンドは、MSHTML 編集によってサポートされていませんが、必要に応じて、これらのコマンドの再実装に役立つテーブル オブジェクト モデルを使用できます。

ブロック書式に関する情報の読み取り

DECMD_GETBLOCKFMT コマンドに相当する機能は、MSHTML 編集ではサポートされていません。コントロールでは、このコマンドは、DECMD_SETBLOCKFMTDECMD_GETBLOCKFMTNAMES コマンドによって使用される名前を使用して、現在の選択を含むブロックの名前を返します。DECMD_GETBLOCKFMT などのコマンドは、ブロックを書式化するためコマンド バー UI を更新するのに必要となります。次のスクリプトを使用して、類似した機能を実行できます。

var _blockFormats = {
    "BODY"    : "Normal",
    "P"       : "Normal",
    "PRE"     : "Formatted",
    "ADDRESS" : "Address",
    "H1"      : "Heading 1",
    "H2"      : "Heading 2",
    "H3"      : "Heading 3",
    "H4"      : "Heading 4",
    "H5"      : "Heading 5",
    "H6"      : "Heading 6",
    "OL"      : "Numbered List",
    "UL"      : "Bulleted List",
    "DIR"     : "Directory List",
    "MENU"    : "Menu List",
    "DT"      : "Definition Term",
    "DD"      : "Definition"
};
 
function GetBlockFmt() {
    try {
        var sel = editor.document.selection;
        if(undefined != sel) {
            var selEl = sel.createRange().parentElement();
            do {
                if(undefined == selEl) {
                    return "Normal";
                }
                var item = _blockFormats[selEl.tagName];
                if(undefined != item) {
                    return item;
                }
                selEl = selEl.parentElement;
            } while(true);
        }
    }
    catch(e) {
    }
    return "Normal";
}

GetBlockFmtNames コマンドは、名前を列挙するカスタム ヘルパー オブジェクトを返すため、DHTML Editing Control ではほとんど使用されません。この機能は、Visual Basic と JScript の間で互換性を保つために必要でしたが、再実装では必要ありません。Dialog Helper Object ({3050f819-98b5-11cf-bb82-00aa00bdce0b}) を使用して、ブロックの書式名が列挙された一覧とフォントの一覧を入手できます。詳細については、インターネットで "Dialog Helper Object" を検索してください。オリジナルのヘルパー オブジェクトにアクセスする代わりに、このコレクションを列挙する場合は、ホスティング コードの修正が必要となります。

再実装に関する追加検討事項

ここでは、DHTML Editing Control の機能を再実装する際に検討すべき追加事項について説明します。

ダイアログ ボックス

Internet Explorer で実装される Find および Font ダイアログ ボックスは、コントロールではコマンド ID を使用して呼び出されていましたが、スクリプトには公開されません。フォント選択用の UI がある場合は、Dialog Helper Object で入手できるフォント名の一覧と置換する必要があります。

次のスクリプトを使用して、Find コマンドを実装できます。

function Find() {
    var rng = editor.document.body.createTextRange();
    var txt = prompt("Enter text to search for", "");
    var found = rng.findText(txt);
    if(found) {
        rng.select();
    }
}
色の値

DHTML の BackColorForeColor プロパティは 10 進数の値を返すのに対し、DHTML Editing Control は 16 進数の文字列を返します。コードが 16 進数の色の値に依存している場合は、次のようなスクリプトを使用して、10 進数の値を 16 進数に変換します。

function DecToHexColor(dVal) {
    var hVal = dVal.toString(16);
    if (hVal.length < 6) {
        var temp = "000000".substring(0,6-hVal.length);
        hVal = temp.concat(hVal);
    }
    return hVal;
}
名前の付けられたコマンド

前述の表の残りのコマンドには、editor.document.execCommand メソッドに渡すことのできる名前があります。各コマンドの詳細については、マイクロソフト Web サイトの「メソッド (英語)」で入手可能なコマンド ID に関するドキュメントを参照してください。

前述の表で "オン/オフ切り替え" とマークされているコマンドは、パラメータを使用しません。このコマンドを実行すると、現在の選択の状態が切り替わります。"値" とマークされたコマンドは、set コマンドの呼び出し時には値を必要とし、get コマンドの呼び出し時には値を返します。備考の記載されていないコマンドは、パラメータなしで実行されます。

HTML コンポーネントの使用

アプリケーションで再実装を行う実例として、スクリプトを実行しても安全な DHTML Editing Control を使用しなくても動作するよう Microsoft Outlook Web Access (OWA) を更新しました。この Web アプリケーションでは複数のバージョンにわたってこのコントロールが埋め込まれており、コードはコントロールのオブジェクト モデルに大きく依存しています。

達成すべき重要な目標は、ホスティング アプリケーションに加える変更を最小限に抑えながら、コントロールの挙動を再実装することです。そのため、Internet Explorer HTML Component (HTC、ビヘイビア) を使用することにしました。このコンポーネントは、DHTML とスクリプトで記述されており、カスタム マークアップ タグを使用して Web ページ上でインスタンス化することができます。この試みでは、DHTML Editing Control の機能を再実装するだけでなく、事実上、コントロールの機能を HTC で再現することができました。結果として、サポーティング コードに加える必要のあった変更はわずかであり、OWA で行った作業は他のアプリケーションでも利用可能であることがわかりました。

HTC スクリプトで定義された要素とページ上の要素間の衝突を回避するため、ビヘイビアは "ViewLink" HTC として実装しました。これにより、ビヘイビアの要素はカプセル化され、ホスティング アプリケーションには見えなくなります。

OWA は、ブラウザのタイプに応じて異なるページへのリダイレクトを行うよう既にコードされていたため、新しいテンプレートを作成して特定のブラウザに適切な ページを提供することができました。コントロールの機能を再現することにより、コードをサポートするテンプレートへの修正は最小限に抑えることができまし た。

Surrogate.htc というファイルにおける HTC の宣言は、次のようになります。

<PUBLIC:COMPONENT tagName="SurrogateDhtmlEditor" supportsEditMode="true">
<PUBLIC:DEFAULTS tabStop="true" viewMasterTab="false"
  viewLinkContent="true"/>
  ...
  <PUBLIC:METHOD NAME="MethodName"/>
  ...
  <PUBLIC:PROPERTY NAME="PropName" PUT="put_Prop" GET="get_Prop"/>
  ...
</PUBLIC:COMPONENT>
 
<IFRAME ID="editor"
  SCROLLING="yes"
  onreadystatechange="EditorReadyStateChange()"
  onfocus="EditorFocus()"
  onblur="EditorBlur()">
</IFRAME>
 
<OBJECT ID="dlgHelper" WIDTH="0px" HEIGHT="0px"
  CLASSID="clsid:3050f819-98b5-11cf-bb82-00aa00bdce0b">
</OBJECT>
<SCRIPT language="javascript" src="SurrogateDhtmlEditor.js">

Web ページでこの HTC をインスタンス化するには、次を実行できます。

<HTML xmlns:editing>
<HEAD>
<?IMPORT namespace="editing" implementation="controls/surrogate.htc" >
...
</HEAD>
<BODY>
...
<editing:SurrogateDhtmlEditor class="EditorClass" id="editor" height="200" width="100%" />
...
</BODY>
</HTML>

次の表に、前述の例で説明された、ユーザーが値を指定する要素の備考を示します。

要素

備考

xmlns:editing

XML ネームスペースとして指定する任意の名前を選択します。

namespace="editing"

この値は、指定した XML ネームスペースと一致する必要があります。

implementation="controls/surrogate.htc"

この値は、使用する HTC ファイルへの相対パスです。

<editing:SurrogateDhtmlEditor>

タグのプレフィックス (editing) は、指定した XML ネームスペースと一致する必要があります。タグの名前 (SurrogateDhtmlEditor) は、HTC ファイルの最初の行にある tagName 属性の値と一致する必要があります。

id="editor"

この値は、アプリケーションの編集コンポーネントを参照する際に使用する ID です。

HTC を使用することにより、Windows Vista との互換性を確保しながら、DHTML Editing Control によって実装されていた機能をすべて維持することができました。HTC によって DHTML Editing Control のすべての機能が実装できたわけではありませんが、OWA で必要とされる機能はすべて実装できました。

まとめ

スクリプトを実行しても安全な DHTML Editing Control は、Windows Vista では使用できません。現在このコントロールに依存している Web アプリケーションがある場合は、次の方法をとることができます。

  • サードパーティ製の代用コントロールを探します。

  • 必要な機能を <iframe> 要素とスクリプトを使用して再実装します。

  • コ ントロールを、スクリプトで記述された Internet Explorer HTML コンポーネント (HTC、ビヘイビア) で代用し、必要とする機能をカプセル化します。スクリプトを実行しても安全な DHTML Editing Control に依存する典型的アプリケーションの 1 つ、Outlook Web Access において、この方法を実際に使用し、良い結果を得ています。

DHTML Editing Control for Applications および TriEdit ActiveX ドキュメント オブジェクトも Windows Vista には含まれませんが、別個にダウンロードすることができ、配布用のライセンスも取得できます。ダウンロードしたものを Windows Vista にインストールすると、コントロールやドキュメント オブジェクトは、Windows の以前のバージョンと同じように使用できます。