トップ回答者
asp.netのウェブアプリケーションでjavascriptが動作しません

質問
-
WindowsServer2008R2, Framework4.0, IIS7.5 です。
aspx に <body onload="document.Form1.TextBox1.focus()"> と書いたのですが
ページのオープン時にフォーカスがTextBox1に来ません。
同じサーバーで、htmlソースに書いた、同じjavascriptは動作します。
さらにASP.NET 2.0, IIS6.0、またASP.NET 2.0, IIS7.0 のサーバーでも aspxの、同じjavascriptが動作します。
ASP.NETの設定に何か問題があるのでしょうか?よろしくお願い申し上げます。
回答
-
TextBox1はASP.NETのコントロールのIDではないでしょうか? このコントロールのIDと実際にHTMLに書き出されるIDは異なる場合があります。ASP.NET側でClientIDプロパティを使用してjavascriptを書き出すのが間違いないでしょう。
(参考)
[ASP.NET]コントロールにフォーカスをセットするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/161setfocus/setfocus.html上記のページでは、Page.RegisterStartupScript メソッド が使用されていますが、現在はClientScriptManager.RegisterStartupScript の使用が推薦されています。
ClientScriptManager.RegisterStartupScript メソッド
http://msdn.microsoft.com/ja-jp/library/system.web.ui.clientscriptmanager.registerstartupscript(v=VS.100).aspx
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク 鰻亭半助 2011年10月24日 2:22
-
> スクリプトの書式を変えたことで、復旧したかのように見えますが、な
> ぜそうなったのか理由がわかっていないので 解決したとは思っていま
> せん。たぶん form 要素の name 属性の有無が影響していると思います。.NET 4
では name 属性がレンダリングされません。.NET 3.5 では name 属性に
id 属性と同じ値が設定されレンダリングされます。それより、問題は、document.Form1.txtKeyCd というコードが古い IE 専
用ということです。目的が、ブラウザ側で「ファンクションキーのコードを取得する」であれ
ば、本筋は、クライアントスクリプトで対応するということになるはず
で、解決策は正しいスクリプトを書くということだと思います。以下のように変更すれば ASP.NET のバージョンには関係なく動くと思い
ます。document.Form1.txtKeyCd.value=chr0;
↓
document.getElementById("<%=txtKeyCd.ClientID%>").value = chr0;
- 編集済み SurferOnWww 2011年10月22日 2:28 誤字訂正
- 回答としてマーク 鰻亭半助 2011年10月24日 2:21
すべての返信
-
TextBox1はASP.NETのコントロールのIDではないでしょうか? このコントロールのIDと実際にHTMLに書き出されるIDは異なる場合があります。ASP.NET側でClientIDプロパティを使用してjavascriptを書き出すのが間違いないでしょう。
(参考)
[ASP.NET]コントロールにフォーカスをセットするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/161setfocus/setfocus.html上記のページでは、Page.RegisterStartupScript メソッド が使用されていますが、現在はClientScriptManager.RegisterStartupScript の使用が推薦されています。
ClientScriptManager.RegisterStartupScript メソッド
http://msdn.microsoft.com/ja-jp/library/system.web.ui.clientscriptmanager.registerstartupscript(v=VS.100).aspx
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク 鰻亭半助 2011年10月24日 2:22
-
鰻亭です 皆さん、ご助言ありがとうございます
ご指摘のとおり、クライアントのブラウザにダウンロードされたHTMLソースを確認したところ
テキストボックスのIDは、サーバー側と同じTextBox1 でした。
私の質問の仕方がまずかったのですが、本来は、ファンクションキーのコードを取得するjavascriptを、Framework4.0, IIS7.5の環境に
移植したところ動作しなくなったので、focus()でも試したところ、これでも動作しなかったので、こちらに相談の書き込みをした次第です。
ちなみに ファンクションキーを取得するjavascriptは 以下の通りでです。
window.document.onkeydown = key_get;
function key_get(){
chr0=event.keyCode;
document.Form1.txtKeyCd.value=chr0;
if((chr0>=113) && (chr0<=123)){
event.keyCode=0;
return false;
} }なお、この場合も クライアントのブラウザにダウンロードされたHTMLソースでは、テキストボックスのIDはtxtKeyCD でした。
以上よろしくお願い申し上げます。
-
こんにちは。
<body onload="document.forms.form1.TextBox1.focus()">
じゃないかと思うのですが。
※本筋じゃないとは思いますが。- 編集済み Keiichi Oumi 2011年10月17日 8:16 コメ
-
本来は、ファンクションキーのコードを取得するjavascriptを、Framework4.0, IIS7.5の環境に
移植したところ動作しなくなったので、focus()でも試したところ、これでも動作しなかったので、こちらに相談の書き込みをした次第です。
動作しない時に、ブラウザがIEであれば左下に黄色のエクスクラメーションマークのアイコンが出ていませんか? もし出ていればそこをクリックしてみて下さい。
また、javascriptが動作しているかどうかを確認するのであれば、もっと単純なalert文などでも試してみると良いと思います。ちなみにIEの場合ですと、javascriptの有効/無効を切り替えるには以下のようにするようです。IE で JavaScript の有効 / 無効 を設定する
http://sonic64.com/2002-10-02.html
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/ -
皆様 ご助言ありがとうございます 結論から申しますと、 Keiichi Oumi さんのご指摘のとおり
document.forms.form1.TextBox1 と書き直すことで focus() が動作するようになりました。
また、ファンクションキーコードの取得も、
chr0=event.keyCode;
document.forms.Form1.txtKeyCd.value=chr0; とすることで うまく行きました。
javascipt が作動していなかったわけではなく、書式の問題だったようです。 Keiichi Oumiさん、本筋でした。ありがとうございました。
それでも、ASP.NET4.0, IIS7.0 の別のサーバーでは
document.Form1.txtKeyCd.value=chr0; でも テキストボックスに値を表示できます。
いまは対処療法的な形で、根本的な部分は解決できていませんが、これでやって見ます。 違いの原因になっているものが見つかれば 改めてお知らせします。
ちなみに ブラウザは IE8.0を一貫して使っており、Javascriptはすでに有効に設定済みです。
以上よろしくお願いいたします。
-
皆様 ご助言ありがとうございます 結論から申しますと、 Keiichi Oumi さんのご指摘のとおり
document.forms.form1.TextBox1 と書き直すことで focus() が動作するようになりました。
また、ファンクションキーコードの取得も、
chr0=event.keyCode;
document.forms.Form1.txtKeyCd.value=chr0; とすることで うまく行きました。
javascipt が作動していなかったわけではなく、書式の問題だったようです。 Keiichi Oumiさん、本筋でした。ありがとうございました。
もちろん本筋ではありません。本筋を見えなくしてしまっただけです。
trapemiya さんのアドバイスが真っ当な意見ではないかとおもうのですが。
TextBox1はASP.NETのコントロールのIDではないでしょうか? このコントロールのIDと実際にHTMLに書き出されるIDは異なる場合があります。ASP.NET側でClientIDプロパティを使用してjavascriptを書き出すのが間違いないでしょう。
(参考)
[ASP.NET]コントロールにフォーカスをセットするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/161setfocus/setfocus.html上記のページでは、Page.RegisterStartupScript メソッド が使用されていますが、現在はClientScriptManager.RegisterStartupScript の使用が推薦されています。
ClientScriptManager.RegisterStartupScript メソッド
http://msdn.microsoft.com/ja-jp/library/system.web.ui.clientscriptmanager.registerstartupscript(v=VS.100).aspx
そうすれば、
document.forms.Form1.txtKeyCd.value
のような、ちょっとどうかと思う JavaScript を書くこともないでしょうし。
# 皆さん答えが分かりきった上で、鰻亭半助さんが自分で答えを見つけられるように誘導しているように思うのですが、なんだか...。 -
ところでHtmlForm.DefaultFocusプロパティがあるので、
<form runat="server" id="form1" defaultfocus="TextBox1">
と書けるそうですよ。TextBox1はIDではなくClientIDです。試したことないので期待通りの動作かはわかりませんが。
JavaScriptに関しては先にも指摘しましたが、書き方が10年以上前の古いブラウザー向けのコードです。現代ではこのような書き方はしません。
(attachEvent / addEventListenerを使うし、document.formsも使いません。) -
こんにちは。
あわわ、なんだか間違った方向へ誘導する原因になったみたいですみません。
単純に、Focusがあたらないということに対するコメントだったのですが(^^;もちろん本筋ではありません。
ASP.NET 側で対処するのが本筋でしょう。
後、自分だったら(要求仕様と状況によりますが)jQueryで、$("#ここにID")[0]とかKeyUp Event と Eventオブジェトを使うかもって気もします。今あるFunctionの内容と大差ない形で実装できると思います。- 編集済み Keiichi Oumi 2011年10月19日 5:16 まちがって送信押したので
-
鰻亭です 問題の切り分けが いい加減なまま質問を投稿したため、本来お尋ねしたかった質問からずれた、何を知りたいかわからないグダグダな内容になってしまい、皆さんにご迷惑をおかけしました。申し訳ありません、お詫びいたします。
スクリプトの書式を変えたことで、復旧したかのように見えますが、なぜそうなったのか理由がわかっていないので 解決したとは思っていません。本来の対処ではなく、ただの見せ掛けに過ぎないと承知しています。
皆さんから頂いた助言を手がかりに勉強してまいります。ご指導ありがとうございました。
- 編集済み 鰻亭半助 2011年10月20日 3:58
-
> スクリプトの書式を変えたことで、復旧したかのように見えますが、な
> ぜそうなったのか理由がわかっていないので 解決したとは思っていま
> せん。たぶん form 要素の name 属性の有無が影響していると思います。.NET 4
では name 属性がレンダリングされません。.NET 3.5 では name 属性に
id 属性と同じ値が設定されレンダリングされます。それより、問題は、document.Form1.txtKeyCd というコードが古い IE 専
用ということです。目的が、ブラウザ側で「ファンクションキーのコードを取得する」であれ
ば、本筋は、クライアントスクリプトで対応するということになるはず
で、解決策は正しいスクリプトを書くということだと思います。以下のように変更すれば ASP.NET のバージョンには関係なく動くと思い
ます。document.Form1.txtKeyCd.value=chr0;
↓
document.getElementById("<%=txtKeyCd.ClientID%>").value = chr0;
- 編集済み SurferOnWww 2011年10月22日 2:28 誤字訂正
- 回答としてマーク 鰻亭半助 2011年10月24日 2:21
-
鰻亭です
皆さんからの「お前の書いたスクリプトは古い!」のご指摘を受けて
恥ずかしながら改めてWikipediaのJavaScriptの説明を見ました(泣)
そこで「バージョンとブラウザの対応表」を見て愕然としました。
ECMScriptについてネット上をたどっていくうち、皆さんが私を誘導しようとなさった「本筋」がようやく判りました。
JavaScriptの書式がブラウザや そのバージョンによって適合する・しないがあるのは知っていたつもりですが
社内イントラのウェブアプリケーションのため、利用者(社員)には「IE以外は使わないこと」と縛っていたので、適合性には全く無頓着でした。
タコツボのような環境で、とりあえず動いている状況に安住し、皆さんにとっては常識以前のことを、全く知らないままでいました。
こんな調子なので、trapemiyaさんの助言
>このコントロールのIDと実際にHTMLに書き出されるIDは異なる場合があります。
>ASP.NET側でClientIDプロパティを使用してjavascriptを書き出すのが間違いないでしょう。
の意味が全く理解できず、的外れの返答をしていましたが、
SurferOnWwwさんの最新の助言
>以下のように変更すれば ASP.NET のバージョンには関係なく動くと思います。
>document.Form1.txtKeyCd.value=chr0;
>↓
>document.getElementById("<%=txtKeyCd.ClientID%>").value = chr0;
にていただいた具体的な書式を見て、目からウロコの境地です。
JavaScriptの構文がDOMで統合されて来ていることも今回はじめて知りました。
というか、それとは知らず使っていたのかもしれません。
狭いところに閉じこもって、全体像を知ることから背を向け、つまみ喰いで誤魔化し続けていたと思います。
全体像を基礎から勉強し直さなければなりません。 皆さん ご指導ありがとうございました。