要約: この記事では、ASP.NET で CodeBehind を使用してさまざまなポップアップ ウィンドウを実装し、ポップアップ ウィンドウと対話する方法について説明します。また、ポップアップ ウィンドウを使用するための普遍的でより優れたソリューションを提供するために、一般的に使用される非標準の IE ブラウザのポップアップ ウィンドウに対するさまざまなフィルタリング動作と、ポップアップ ウィンドウを使用する際の対応する対策についても説明します。
キーワード: ASP.NET、CodeBehind、フィルタリング、COM インターフェイス、JavaScript、バインディング
ASP.NET は、動的 Web サイトを構築するための Microsoft の最新ツールとして、ASP や JSP と比較して、元の Web プログラミング方法を大幅に変更しました。コードとページの分離テクノロジ (CodeBehind) と完全な Web サーバー コントロールにより、プログラマーは従来のプログラミングに沿った Web サーバー側の開発方法を利用できます。ただし、Web プログラミングには従来のプログラミングとは異なる特性があり、これらの特性により、プログラム要件を完了するには、いくつかの特別なテクニックを使用する必要があります。ポップアップ ウィンドウは、このタイプのプログラミング方法の代表的なものです。かなりの数のプログラミング書籍がポップアップ ウィンドウについて言及していないか、一言で言及しているだけで、ポップアップ ウィンドウの使用に関する広大な世界を理解できていないようです。この記事では、ポップアップ ウィンドウを使用する際の問題のほとんどを解決します。
Web サイトへのアクセスの同時実行性とスループットを向上させるために、ASP.NET は他のサーバー スクリプトと同様に、クライアント側のスクリプトを使用してサーバーへの負荷を軽減します。 ASP.NET は現在 (バージョン 1.1) までポップアップ ウィンドウを直接サポートしておらず、クライアント側のポップアップ ウィンドウは JavaScript (または VBScript) を通じて使用する必要があります。
1. 警告ウィンドウと CodeBehind でクライアント側スクリプトを使用する方法
ブラウザーで最も単純な警告ウィンドウをポップアップするには、JavaScript ステートメント
window.alert([sMessage])
を使用します。sMessageはプロンプト メッセージです。残念ながら、このようなポップアップ ウィンドウには「OK」ボタンしかなく、プロンプトとしてのみ機能します。レコードを削除するときにクエリ ポップアップ ウィンドウをポップアップ表示したい場合は、以下を使用する必要があります:
bconfirmed = window.confirm([sMessage])
ここで: bconfirmed は戻り値、sMessage はプロンプト メッセージです。このポップアップ ウィンドウには、「OK」または「あきらめる」の 2 つの選択肢があり、その選択の戻り値が bconfirmed に配置され、コードが判断します。
コードの再利用性と読みやすさを向上させるには、JavaScript と Codehind を相互に統合する必要があります。通常、この効果を実現するには 2 つの方法があります。
(1) Response.Write メソッドの使用:
Response.Write メソッドの使用は、ASP 時代からサポートされてきました。クライアントにコードを書き込むことができ、非常に便利で直感的な方法です。次のコードは、Response.Write メソッドを使用して警告メッセージを表示する方法を示しています。
Private Sub btAlert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) btAlert.Click を処理します
' Response.Write メソッドとアラート ウィンドウを示します。
Response.Write(" ")
End Sub
(2) RegisterXXX メソッドを使用する
Response.Write によって生成された HTML コードを観察すると、Response.Write メソッドによって生成されたコードが HTML コードの先頭、つまり HTML コードの前に書き込まれていることがわかります。タグ。この時点では、まだすべての HTML オブジェクトが生成されていません。HTML 内のオブジェクトを使用して操作しようとすると、「オブジェクトが見つかりません」というエラーが発生します。したがって、作成者は、CodeBehind メソッドに準拠した RegisterXXX メソッドを使用するメソッドを推奨します。 RegisterXXX には、RegisterClientScriptBlock、RegisterStartupScript、および判定用の IsStartupScriptRegistered 関数が含まれます。
RegisterStartupScript のプロトタイプは次のとおりです。
Overridable Public Sub RegisterStartupScript( _
ByVal キーを文字列として、_
ByVal スクリプト As String _
)
ここで、 key はこのスクリプトの一意の識別子を表し、 script はスクリプトを表す文字列です。
RegisterClientScriptBlock のプロトタイプは RegisterStartupScript と同じです。2 つの関数の違いは、それらに含まれるスクリプト コードが HTML ファイル内の異なる場所に書き込まれることです。 RegisterClientScriptBlock は、Page オブジェクトの要素の開始タグの直後にクライアント スクリプトを発行し、RegisterStartupScript は、Page オブジェクトの要素の終了タグの前にスクリプトを発行します。スクリプトにページ オブジェクト (ドキュメント オブジェクト) と対話するステートメントがある場合 (これについては後の例で説明します)、一方、クライアント スクリプトをできるだけ早く実行したい場合は、RegisterStartupScript を使用することをお勧めします。可能であれば、RegisterClientScriptBlock または Response.Write を使用できます。
ページへのスクリプトの重複追加を防ぐため、ReisterStartupScript/RegisterClientScriptBlock では登録キーとして key を使用してスクリプトを登録し、IsClientScriptBlockRegistered を使用してプログラム内で判定することができます。
次の例では、RegisterClientScriptBlock を使用して、confirm の使用法を示します。
Private Sub btconfirm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) btconfirm.Click を処理します
'RegisterClientScriptBlock メソッドをデモンストレーションし、windowIf
(Not IsClientScriptBlockRegistered("clientScript")) を確認します。
'スクリプトが追加されているかどうかを確認し、追加されていない場合は追加します。
文字列としての Dim strScript
strScript = " "
'スクリプトを登録RegisterClientScriptBlock("clientScript", strScript)
'「いいえ」を選択した場合は実行を続行します。
End If
End Sub
2. 指定されたページをポップアップする
プロンプト ウィンドウがあるだけでは、要件を満たさないことがよくあります。このとき、JavaScript の window.open メソッドを使用できます。前の RegisterClientSciptBlock メソッドを使用すると、指定したページをポップアップできます。
次のコードは、指定されたページをポップアップする方法を示しています。
Private Sub btWinOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btWinOpen.Click
'簡単なデモには window.open と registerStartupScript を使用します。
If (Not IsClientScriptBlockRegistered("OpenScript")) then
'スクリプトが追加されているかどうかを確認し、追加されていない場合は追加します。
Dim strScript As String = " "
RegisterStartupScript("OpenScript", strScript)
終了の場合
End Sub
プログラムは、Window.open メソッドを使用して新しいページをポップアップします。このページには、新しいポップアップ ウィンドウの URL アドレスという 1 つのパラメータしかありません。 window.open メソッドには複数のパラメータがあることがわかりますが、これは javascipt の単純な問題なので、ここでは詳しく説明しません。関連する質問がある場合は、MSDN を確認してください。
このプログラムは IE で直接使用すると正常に動作します。ただし、GoSurf、MyIE2、NetCapter などのブラウザを使用している場合は、残念ながら問題があります。 ポップアップは表示されません。これがポップアップ フィルタリングについて説明する内容です。
3. 非標準の IE ブラウザのポップアップ ウィンドウのフィルタリング動作について議論する
広告ウィンドウの急増により、多くのネチズンが広告による嫌がらせに耐えられなくなり、標準の IE ブラウザを諦め、GoSurf、MyIE2、などのブラウザを使用しています。 IE カーネルを使用して複数のページをサポートする NetCapter と、広告を自動的にブロックするソフトウェア。 Microsoftは次期IE6 sp2では、広告ウィンドウをブロックする機能も追加すると言われている。もちろん、これはほとんどのインターネット ユーザーにとっては良いことですが、プログラマーにとって、ポップアップ ウィンドウの使用方法は通常の広告と基本的に変わりません。その結果、そのようなウィンドウもポップアップ ウィンドウ マネージャーによって無差別にブロックされます。もちろん私たちはそれを見たくありません。ウィンドウを通常どおりポップアップさせる標準的な方法はありますか?これには、ブラウザが広告をブロックする原理を理解する必要があります。一般的な広告ブロッカーは、次の 3 つの方法を使用して広告をフィルタリングします。
(1) ウィンドウ タイトルベースのブロック方法
このブロック方法の原理は、すべての IE ウィンドウ タイトルを定期的にチェックし、既存のリスト (管理者が管理する) に基づいてそれらをフィルタリングすることです
。プログラム) の配列リスト) を比較し、同じものが存在する場合は、このウィンドウを閉じます。明らかに、このメソッドには多くの欠陥があり、すべてのポップアップ ウィンドウがブロックされるため、プログラムで使用されることはほとんどありません。ただし、それをベースにした変形方法は非常に一般的です。つまり、ウィンドウ タイトル名に基づくインテリジェント フィルタリング テクノロジは、タイトルに広告に関連するキーワードが含まれているかどうかに基づいてポップアップ ウィンドウをブロックします。これは、フィルタリング効果を向上させるための優れた調査です。
(2) ウィンドウのクラスと位置に基づくブロック方法
分析の結果、通常の閲覧ウィンドウのクラス名は IEFRAME および CabinetWClass であるのに対し、広告ウィンドウのクラス名は CabinetWClass であることが判明しました。さらに分析した結果、広告ウィンドウの WorkerA クラスと Shell DocObject View クラスの rect.top の値は同じであるが、通常の IE ウィンドウの WorkerA クラスの rect.top の値とShell DocObject View クラスは異なります。上記の 2 点に基づいて、広告キラー プログラムを作成できます。 実際のところ、私はこのプログラムの一般化可能性については懐疑的です。なぜなら、著者が Spy++ を使用して分析したところ、Windows2000 (著者が使用しているオペレーティング システム) では、IE ウィンドウのクラスはすべて IEFrame であることがわかりました。同時に、Win2000 は Unicode コードに基づいたオペレーティング システムであるため、WorkerA クラスは存在せず、WorkerW クラスに置き換えられます。同時に、rect.top が異なる状況はありません。筆者は WindowsXP オペレーティング システムを持っていないため、WindowsXP でこれ以上の実験を行うことはできません。
(3) IE COM コンポーネントによるブロック方法
上記 2 つの方法は、IE ウィンドウを通常の Windows ウィンドウとして扱い、判定を行います。実際、IE は COM コンポーネントに基づく典型的なブラウザです。IE コアに基づくすべてのブラウザは、shdocvw.dll ファイルをパッケージ化し、対応する BHO コードを記述します。方法 1 や 2 のように表面をなぞるだけではなく、この方法でのみ IE ブラウザを真に制御できます。
IE カーネルに基づいてポップアップ ウィンドウをブロックする方法もあります。ポップアップが開く前にブロックします。原理は次のとおりです。IE が新しいウィンドウを開くたびに、NewWindow イベントがトリガーされ、OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel) メソッドが実行されます。このメソッドをオーバーロードして、閲覧ページがダウンロードされた後に新しいウィンドウを開くイベントが発生するかどうかを判断します。そうであれば、それは通常のポップアップ ウィンドウであることを意味し、そうでない場合はインターセプトされます。
Gosurf などのブラウザは Shocvm.dll コンポーネントをオーバーロードするため、3 番目の方法を使用するのが自然です。ただし、使用中に広告フィルタリングが完璧ではないことに気づくことがありますが、原理は基本的に同じです。