このサンプルではブラウザでJavaScriptが有効になっているかを判定する方法を説明します。
ブラウザでのJavaScript有効設定は以下の手順(IE7の場合)で設定(確認)ができます。
"ツール"⇒"インターネットオプション"⇒"セキュリティ"タブを開きます。
次に"レベルのカスタマイズ"ボタンを押下し、"アクティブスクリプト"を『有効にする』にチェックを入れます。
上記の設定でJavaScriptは有効になり、"アクティブスクリプト"を『無効にする』にすれば、JavaScritptは無効になります。
ASP.net 2.0環境ではアクセスしたブラウザの情報はBrowser変数(System.Web.HttpBrowserCapabilities)に格納されます。
上記BrowserインスタンスはRequest変数下に格納されています。
Browser変数には"JavaScript"というBool値格納メンバ変数があります。
私も勘違いしたのですが、この"JavaScript"変数に格納されている値はアクセスしているブラウザのJavaScript有効設定の情報ではありません。
"JavaScript"変数に格納されている値は、そのブラウザ自体がJavaScriptをサポートしているかという意味なのです。
例えば、携帯電話などでアクセスすれば"JavaScript"変数はfalseになります。
以下のボタンをクリックするとBrowser変数下のJavaScript変数の値が確認できます。
確認の為、ブラウザのJavaScriptの設定を『無効にする』に設定して上記のボタンをクリックしてみて下さい。(設定変更後、再読み込みして下さい。)
JavaScriptをサポートしているブラウザから上記ボタンをクリックした場合、JavaScriptの有効設定の内容に関わらず、"true"になっていることがわかります。
本題のJavaScript有効設定の判別方法ですが、私は以下のような方法を採っています。
- JavaScript有効の有無を判別するページにHidden項目を設定する。
- ページのLoad処理に実行するJavaScriptをページに埋め込み、そのスクリプトでHidden項目に"true"などの情報を設定する。
- JavaScript有効の有無を判定する処理にて、Hidden項目の内容を確認し、"true"が設定されていればJavaScriptは有効であると判断する。
上記処理を説明すると、例えばJavaScriptが無効になっている場合は、当然クライアント側のスクリプトは実行されないのでHidden項目の値は初期値から変更されません。
JavaScriptが有効になっている場合のみ、スクリプトが実行されHidden項目の内容が変更されるのです。
上記の判断方法ですが、一つ欠点があります。
ページのロード処理は、クライアント側(JavaScript)とサーバ側(ASP.net)の二つがありますが、処理順は"サーバ側"⇒"クライアント側"になります。
つまりJavaScriptの有効判定をするHidden項目への値の設定がJavaScriptで行われるので、サーバ側のLoad処理のタイミングではJavaScriptが有効になっているかどうかがわからないということです。
まぁ上記レベルの欠点を補う事はいかようにもできると思うのですが。。。
以下のボタンをクリックすると上記の処理方法で実装した結果を確認できます。(JavaScriptの有効可否に応じて表示が変わります)
上記ボタンの処理は以下のサンプルクラス(JavaScriptEnvCheck)にてJavaScript有効判定を行っています。
JavaScript有効判定クラス(JavaScriptEnvCheckクラス)
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
public class JavaScriptEnvCheck
{
/// <summary>
/// JavaScript有効可否情報を格納するHidden項目のコントロールID
/// </summary>
private const string _JS_ENV_CHECK_HIDDEN_VAL_ID = "id_js_env_check";
/// <summary>
/// Hidden項目のユニークID
/// </summary>
private static string _hiddenUniqueID = "";
private JavaScriptEnvCheck()
{
}
/// <summary>
/// JavaScriptEnvCheckの初期化処理
/// ※PageのLoad処理でコールします。
/// </summary>
/// <param name="checkPage">JavaScript有効のチェックを行う対象Page</param>
/// <returns>true:初期化成功</returns>
public static bool Initialize(System.Web.UI.Page checkPage)
{
if (null == checkPage) return false;
//Hidden項目を生成し、該当Pageに埋め込む
if (null == checkPage.Form.FindControl(_JS_ENV_CHECK_HIDDEN_VAL_ID))
{
HiddenField hidden = new HiddenField();
hidden.ID = _JS_ENV_CHECK_HIDDEN_VAL_ID;
hidden.Value = "false";
hidden.EnableViewState = false;
checkPage.Form.Controls.Add(hidden);
//Hidden項目に値を設定するJavaScriptを埋め込む
StringBuilder scriptBuf = new StringBuilder("<script language='JavaScript'>")
.Append("{")
.Append("var hidden = document.getElementById('").Append(hidden.ClientID).Append("');")
.Append("if(null!=hidden){hidden.value='true';}")
.Append("}")
.Append("</script>");
ScriptManager.RegisterStartupScript(checkPage, checkPage.GetType(), "checkJSEnv", scriptBuf.ToString(), false);
//Hidden値取得の為にIDを保持しておく
_hiddenUniqueID = hidden.UniqueID;
}
return true;
}
/// <summary>
/// JavaScriptが有効になっているか判定するメソッド
/// </summary>
/// <param name="request">HttpRequest</param>
/// <returns>true:JavaScriptは有効</returns>
public static bool IsEnableJavaScript(HttpRequest request)
{
//RequestよりHidden値を取得する
string hiddenValue = request.Form[_hiddenUniqueID];
if (null == hiddenValue || hiddenValue.Equals(""))
{
throw new Exception("JavaScriptEnvCheck.Initialize()が実行されていません");
}
if (hiddenValue.Equals("true")) return true;
return false;
}
}
JavaScriptEnvCheckクラスの利用方法は次の通りです。
- ページのLoad処理にてJavaScriptEnvCheck.Initialize()処理を実行する。
- JavaScriptの有効判定を行いたい箇所でJavaScriptEnvCheck.IsEnableJavaScript()をコールする。
JavaScriptEnvCheckクラスの利用方法(ページのLoad処理)
protected void Page_Load(object sender, EventArgs e)
{
//初期化処理を行います
JavaScriptEnvCheck.Initialize(this);
}
JavaScriptEnvCheckクラスの利用方法(JavaScript有効可否情報取得処理)
protected void btnCheckJavaScriptEnable_Click(object sender, EventArgs e)
{
//JavaScriptの有効可否情報を取得する。
bool bEnableJavaScript = JavaScriptEnvCheck.IsEnableJavaScript(Request);
if (bEnableJavaScript)
{
this.lblJavaScriptCheckResult.Text = "JavaScriptは有効です。";
}
else
{
this.lblJavaScriptCheckResult.Text = "JavaScriptは無効です。";
}
}
Masterページを利用している場合やPageに基本クラスを別途用意している場合などは、それらのLoad処理でInitialize処理を実行しておけばより手軽に利用できると思います。