none
asp.netのウェブアプリケーションでjavascriptが動作しません RRS feed

  • 質問

  • 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の設定に何か問題があるのでしょうか?よろしくお願い申し上げます。

     

    2011年10月17日 3:11

回答

  • 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
    2011年10月17日 4:14
    モデレータ
  • > スクリプトの書式を変えたことで、復旧したかのように見えますが、な
    > ぜそうなったのか理由がわかっていないので 解決したとは思っていま
    > せん。

    たぶん 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
    2011年10月20日 15:56

すべての返信

  • WindowsServer2008R2, Framework4.0, IIS7.5 です。

    aspx に <body onload="document.Form1.TextBox1.focus()"> と書いたのですが

    ページのオープン時にフォーカスがTextBox1に来ません。

    同じサーバーで、htmlソースに書いた、同じjavascriptは動作します。


    ASP.NET が生成してブラウザーに送り込んできた HTML と、静的に書いた HTML との違いを比較してはいかがでしょうか。
    2011年10月17日 3:39
  • 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
    2011年10月17日 4:14
    モデレータ
  • ASP.NETではマスターページやユーザーコントロールなどを考慮して、HTML要素のIDを動的に制御します。

    totojoさんがおっしゃっているように、クライアントのブラウザーにダウンロードされたHTMLのソースを確認して、TextBox1がどんなIDになっているか確認してみてください。

     

    2011年10月17日 6:00
  • 鰻亭です 皆さん、ご助言ありがとうございます

    ご指摘のとおり、クライアントのブラウザにダウンロードされた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 でした。

    以上よろしくお願い申し上げます。

    2011年10月17日 7:31
  • ASP.NET が送り込んできた HTML をファイルに保存して、これを同じサーバーに配置して静的ページとしてアクセスすると、どうなりますか?
    2011年10月17日 7:56
  • こんにちは。

     

    <body onload="document.forms.form1.TextBox1.focus()">

     

    じゃないかと思うのですが。


    ※本筋じゃないとは思いますが。
    2011年10月17日 7:59
  • ブラウザは何を使っているのでしょうか?

    Windows Server や .NET や IIS のバージョンは関係なくて、ブラウザの
    違いが問題ではないのですか?

     

     

    2011年10月17日 15:27
  • 本来は、ファンクションキーのコードを取得する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/
    2011年10月18日 0:21
    モデレータ
  • この可能性に同意します。質問者さんの書かれたJavaScriptはブラウザー依存の激しいコードなので、それが原因で動作しなくなっているように思います。
    • 編集済み 佐祐理 2011年10月18日 0:48
    2011年10月18日 0:46
  • 皆様 ご助言ありがとうございます 結論から申しますと、 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はすでに有効に設定済みです。

    以上よろしくお願いいたします。

    2011年10月18日 22:56
  • 皆様 ご助言ありがとうございます 結論から申しますと、 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 を書くこともないでしょうし。

    # 皆さん答えが分かりきった上で、鰻亭半助さんが自分で答えを見つけられるように誘導しているように思うのですが、なんだか...。
    2011年10月19日 1:16
  • ところでHtmlForm.DefaultFocusプロパティがあるので、

    <form runat="server" id="form1" defaultfocus="TextBox1">

    と書けるそうですよ。TextBox1はIDではなくClientIDです。試したことないので期待通りの動作かはわかりませんが。

    JavaScriptに関しては先にも指摘しましたが、書き方が10年以上前の古いブラウザー向けのコードです。現代ではこのような書き方はしません。
    (attachEvent / addEventListenerを使うし、document.formsも使いません。)

    2011年10月19日 1:46
  • こんにちは。

    あわわ、なんだか間違った方向へ誘導する原因になったみたいですみません。
    単純に、Focusがあたらないということに対するコメントだったのですが(^^;

    もちろん本筋ではありません。

    ASP.NET 側で対処するのが本筋でしょう。
    後、自分だったら(要求仕様と状況によりますが)jQueryで、$("#ここにID")[0]とかKeyUp Event と Eventオブジェトを使うかもって気もします。今あるFunctionの内容と大差ない形で実装できると思います。

    • 編集済み Keiichi Oumi 2011年10月19日 5:16 まちがって送信押したので
    2011年10月19日 5:16
  • もちろん、Keiichi Oumi のアドバイスが、「ASP.NET どうこうではなくて、単純に JavaScript に間違いがあるんじゃ?」という趣旨であることは重々承知しております。
    が、質問者さんがアドバイスの表面だけを取り込んで「対処した」と思っていることに、「おいおい、マジか」と思った次第です。

    Web Form だとどうしても ID に縛られるので、イマイチ jQuery の力を生かし切れないところがもどかしいですね。
    2011年10月19日 5:40
  • 鰻亭です 問題の切り分けが いい加減なまま質問を投稿したため、本来お尋ねしたかった質問からずれた、何を知りたいかわからないグダグダな内容になってしまい、皆さんにご迷惑をおかけしました。申し訳ありません、お詫びいたします。

    スクリプトの書式を変えたことで、復旧したかのように見えますが、なぜそうなったのか理由がわかっていないので 解決したとは思っていません。本来の対処ではなく、ただの見せ掛けに過ぎないと承知しています。

    皆さんから頂いた助言を手がかりに勉強してまいります。ご指導ありがとうございました。

     


    2011年10月20日 3:45
  • > スクリプトの書式を変えたことで、復旧したかのように見えますが、な
    > ぜそうなったのか理由がわかっていないので 解決したとは思っていま
    > せん。

    たぶん 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
    2011年10月20日 15:56
  • 鰻亭です

    皆さんからの「お前の書いたスクリプトは古い!」のご指摘を受けて
    恥ずかしながら改めて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で統合されて来ていることも今回はじめて知りました。
    というか、それとは知らず使っていたのかもしれません。

    狭いところに閉じこもって、全体像を知ることから背を向け、つまみ喰いで誤魔化し続けていたと思います。
    全体像を基礎から勉強し直さなければなりません。 皆さん ご指導ありがとうございました。

    2011年10月24日 2:20