none
[ASP.NET3.5] JavaScriptを記述しているのに「オブジェクトを指定してください。」実行エラーになる。 RRS feed

  • 質問

  • いつも、お世話になります。

    IEの戻るボタンを無効にするために、マスターページのbody部に

        <script type="text/JavaScript">
            history.forward();
        </script>

    と記述して正しく動作していたのですが、この記述の下に連打抑制用の共通function

        <script type="text/JavaScript">
            function IsReadyState() {
                if (window.document.readyState != null && window.document.readyState != 'complete') {
                    return false;
                } else {
                    if (event.srcElement.style.cursor == 'wait') {
                       return false;
                    }
                    event.srcElement.style.cursor = 'wait';
                    return true;
                }
            }
        </script>

    を続けて追加記述したところ、最初のhistory.forward();が効かなくなりました。

    効かないのなら消してしまえと消すと、IsReadyStateを呼んでいるonclick部分で

    <input type="submit" name="ctl00$body$LoginButton" value="ログイン" onclick="return IsReadyState ();"

    「オブジェクトを指定してください。」という実行時エラーになります。この理由も分かりません。

    どの様に記述すれば両方が有効になるのでしょうか?

    戻るボタンを無効にするのは、別の方法があるのならこだわりません。

    どなたか、ご教授ください。よろしく御願いします。

    PS:Microsoft 山本晴海様、前回はIEフォーラムに移動されましたが、実際のHTMLはVisualStudioが自動生成

    するのでASPのフォーラムで良いような気がするのですが...。IEの方は削除しました。

    • 編集済み マリカ 2010年12月13日 8:03
    2010年12月10日 3:01

回答

  • TH01様、色々と調べていただきありがとうございます。

    そして、ごめんなさい。

    以前、どなたかにソース表示ではなく、IEツールの「管理者ツール」を使えと教えていただいた事を思い出して、

    それでソースを表示したところ、<head>ブロックから<script>タグがおかしくなっており、history.forward();部分が

    連なって表示されていました。

    <head runat="server">

    <script language="JavaScript" type="text/JavaScript" src="css/fontselect.js" />  <--- 悪さをしてた行

    </head>

    <body style="cursor:default;">

        <script type="text/JavaScript">
            window.history.forward();
        </script>

    これでも、間違っていないように思うのですが、/>で終わるのを止め、きっちり</script>を付けたら全て解決しました。

    お騒がせして、TH01様、SuferOnWww様の貴重なお時間を無駄にして申し訳ございませんでした。

    お世話になりました。

     

    • 回答としてマーク マリカ 2010年12月13日 8:08
    2010年12月13日 6:55
  • マリカさんが返信されればわかることですが、補足の返信のついでに SurferOnWww さんの返信を見て思ったことも書かせてもらいます。

    SurferOnWww さん
    > UpdatePanelの中にあると

    画面遷移にかかわるボタンに書かれているハズと思いましたので、UpdatePanel 上ではないと想像しました。

    > の方も wait にならないような気がします(こちらは未確認です)。

    確認してみたところ、UpdatePanel 内にボタンがある場合でも、"wait" が判断に使用されることで IsReadyState ファンクションは正常に働き、連打が抑制されました。

    > スクリプト function IsReadyState() { ...  } を消してたのですよね?

    消されたのは history.forward の方だと想像しました。
    「(forward が)効かないのなら(forward を)消してしまえと消すと」のように。

    前の返信の際に書き忘れたのですが、私のテストでは、script は ScriptManager 等は使わずにマスターページの aspx 内に直接書きました。
    試しに以下のようにタグが正常に閉じてない場合のテストをしてみると、forward は働かなくなりました。
    もしかしてマリカさんのところでも、タグの関係におかしなところはないですか?

    <script>
    <script type="text/JavaScript">
      history.forward();
    </script>

    小さなテストプロジェクトを作成して確認されることをお勧めした理由は、通常は書かれたような不可解なことは発生しないと思いましたので、まずは単純な構成では問題が発生しないことをマリカさんの環境でも確認してもらえればと思ったのでした。

    あと、今回の問題とは全く無関係ですが、IE のフォーラムに移動される前に書かれてた内容には <!-- --> でソースを囲まれてましたけど、本当は以下のようにした方が良いみたいです。

    <script type="text/javascript">
    //<![CDATA[
    // ここにソースコード
    //]]>
    </script>

    • 回答としてマーク マリカ 2010年12月13日 6:56
    2010年12月13日 1:35

すべての返信

  • プロジェクトを新規作成して試してみましたが、問題なく機能しました。
    環境は Vista + IE8 + VS2008 + 開発サーバーです。

    <script type="text/JavaScript">
      history.forward();
    </script>

    は、一度は戻ってからすぐに進むことになりますので、もし
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    等でキャッシュを無効にされている場合には、一瞬でも戻った側の Page_Load は発生します。
    その際に何かの情報が初期化されてしまい、進んだ先のページでその情報が未セットの為にページを戻されているなど、何か ASP.NET 側のロジックが影響していたりしないでしょうか?
    (追記:value="ログイン" と書かれているので、一瞬戻った際に FormsAuthentication.SignOut() が実行されちゃているとか。)

    でも、
    > 「オブジェクトを指定してください。」という実行時エラーになります。この理由も分かりません。
    などの良くわからない話もありますので、原因は他にあるのかもしれませんね。

    <script type="text/JavaScript">
      alert("forward します");
      history.forward();
    </script>

    のようにしてみると、期待通りメッセージは表示されますでしょうか?
    マリカさんも、一度小さなテストプロジェクトを作成して確認されてみてはいかがでしょうか?

    ちなみに、私のテストで生成された HTML を書かせてもらいます。
    (この連打抑制用のスクリプト、私も使わせてもらいますね。)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head><title>
    </title>
        </head>
    <body>
        <script type="text/JavaScript">
        history.forward();
        </script>

        <script type="text/JavaScript">
        function IsReadyState() {
        ・・・中身は同じです
        }
        </script>

        <form name="aspnetForm" method="post" action="WebForm1.aspx" id="aspnetForm">
        <div>
        <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="・・・" />
        </div>
        <div>
        <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="・・・" />
        </div>
        <div>
            マスターページ部分<br />
            ページ1<br />
            コンテンツ部分
            <input type="submit" name="ctl00$Contentplaceholder1$Button1" value="Button" onclick="return IsReadyState();" id="ctl00_Contentplaceholder1_Button1" />
        </div>
        </form>
    </body>
    </html>

    • 編集済み TH01 2010年12月10日 10:27 追記
    2010年12月10日 10:22
  • 問題の、

    > 最初のhistory.forward();が効かなくなりました。

    とは関係ないかもしれませんが・・・


    > この記述の下に連打抑制用の共通function

    UpdatePanel を使っていませんか?

    <input type="submit" ... onclick="return IsReadyState ();" が UpdatePanel
    の中にあると、IsReadyState ファンクションは期待通りの動きはしないと思いま
    す。

    document.readyState は即 complete になるはずです。event.srcElement.style.cursor
    の方も wait にならないような気がします(こちらは未確認です)。

    > 「オブジェクトを指定してください。」という実行時エラーになります。こ
    > の理由も分かりません。

    スクリプト function IsReadyState() { ...  } を消してたのですよね? だっ
    たら、onclick="return IsReadyState ();" も消さないと、そのボタンをクリッ
    クすればスクリプトエラーになるのは当たり前だと思いますが。

    2010年12月11日 2:50
  • マリカさんが返信されればわかることですが、補足の返信のついでに SurferOnWww さんの返信を見て思ったことも書かせてもらいます。

    SurferOnWww さん
    > UpdatePanelの中にあると

    画面遷移にかかわるボタンに書かれているハズと思いましたので、UpdatePanel 上ではないと想像しました。

    > の方も wait にならないような気がします(こちらは未確認です)。

    確認してみたところ、UpdatePanel 内にボタンがある場合でも、"wait" が判断に使用されることで IsReadyState ファンクションは正常に働き、連打が抑制されました。

    > スクリプト function IsReadyState() { ...  } を消してたのですよね?

    消されたのは history.forward の方だと想像しました。
    「(forward が)効かないのなら(forward を)消してしまえと消すと」のように。

    前の返信の際に書き忘れたのですが、私のテストでは、script は ScriptManager 等は使わずにマスターページの aspx 内に直接書きました。
    試しに以下のようにタグが正常に閉じてない場合のテストをしてみると、forward は働かなくなりました。
    もしかしてマリカさんのところでも、タグの関係におかしなところはないですか?

    <script>
    <script type="text/JavaScript">
      history.forward();
    </script>

    小さなテストプロジェクトを作成して確認されることをお勧めした理由は、通常は書かれたような不可解なことは発生しないと思いましたので、まずは単純な構成では問題が発生しないことをマリカさんの環境でも確認してもらえればと思ったのでした。

    あと、今回の問題とは全く無関係ですが、IE のフォーラムに移動される前に書かれてた内容には <!-- --> でソースを囲まれてましたけど、本当は以下のようにした方が良いみたいです。

    <script type="text/javascript">
    //<![CDATA[
    // ここにソースコード
    //]]>
    </script>

    • 回答としてマーク マリカ 2010年12月13日 6:56
    2010年12月13日 1:35
  • TH01様、SuferOnWww様、いつもありがとうございます。

    > <script type="text/JavaScript">
    >  alert("forward します");
    >   history.forward();
    > </script>
    > 期待通りメッセージは表示されますでしょうか?

    アラームは表示されませんね。このScriptタグが無視されている様です。

    > マリカさんも、一度小さなテストプロジェクトを作成して確認されてみてはいかがでしょうか?

    2画面の簡単プロジェクトで試したら、正常に動作しました。


    > UpdatePanel を使っていませんか?

    このマスターページを使っているページでは、UpdatePanelを使っています。
    画面遷移するボタンに組み込んでいる事が多いためか、とりあえず連打抑制
    は出来ている様です。

    > スクリプト function IsReadyState() { ...  } を消してたのですよね?

    いえ、消したのは、history.forward();の方です。
    順序を逆にして、functionの後に記述してもIsReadyStateが同じ実行時エラーになります。
    2つのJavaScriptを書くと、後の方で上書きされている様に思えるのですが、
    1つのタグにまとめて
    <script type="text/JavaScript">
       history.forward();
       function IsReadyState() { ...  }
    </script>
    と記述しても同じ実行時エラーが発生します。

    そして、戻るボタン無効をあきらめて、history.forward();のScriptブロックを消して

    function IsReadyState() { ...  }のみにしてもエラーになります。

    不思議です。訳が分かりません。

     

     

    2010年12月13日 1:35
  • TH01様、検証ありがとうございます。

    色々と試していて、うっかりミス?で

        <script type="text/JavaScript">
            window.history.forward();
        </script>
        <script type="text/JavaScript">
            window.history.forward();  <------ ここ

            function IsReadyState() {
                if (window.document.readyState != null && window.document.readyState != 'complete') {
                    return false;
                } else {
                    if (event.srcElement.style.cursor == 'wait') {
                        return false;
                    }
                    event.srcElement.style.cursor = 'wait';
                    return true;
                }
            }
        </script>

    の様に、functionのScriptブロックに再度、history.forward();を記述したところ、戻るボタンは押す事は出来ても

    ページはフラッシュするだけで画面遷移はしなくなりました。

    これで、良いかどうかは不明ですが、とりあえずご報告まで。

     

    2010年12月13日 2:55
  • ひとつめの script タグが認識されていないのですね。

    すでに確認させてもらったことですが、返信では何も書かれていないので、念のため再度確認させてもらいます。

    表示されたページを右クリックして「ソースの表示」をしたとき、この script タグより前の部分に、何かおかしなところはないでしょうか?
    エンコードすべき日本語がエンコードされていない、等も含めて確認してみてください。
    (Web ページ内容を検証してくれるサイト(無料)がどこかにあると思いますが、そこで確認されてみるのも有効かもしれません。)

    それと、このスクリプトは、.aspx ファイルに直接書かれたものでしょうか?
    それとも、ScriptManager 等で出力されているのでしょうか?

    書かれた forward を2回記述する方法では、もし何らかの理由で、ひとつめの script タグも有効になった場合は、2回 forward されることになりますね。
    1回の forward で問題がないのでしたら2回行っても大丈夫だとは思いますけど。。
    1つめの方は、<script type="text/JavaScript" /> だけでもよかったりしそうですね。

    なお、最初の返信時点から思っていたことですが、本当は、「戻る」ボタンを押されても問題が生じない作りになっていることが望ましいと思います。要件によっては難しいのでしょうけど。

    2010年12月13日 4:45
  • > ひとつめの script タグが認識されていないのですね。

    そのようです。ページ遷移を伴うボタンのOnClientClickでIsReadyStateファンクションを使っているので、

    ひょっとしたら1つ目のhistory.forward();は通らないのかも知れないですね?

     

    > 表示されたページを右クリックして「ソースの表示」をしたとき、この script タグより前の部分に、何かおかしなところはないでしょうか?

    特に変わった点は見当たりません。

     

    > それと、このスクリプトは、.aspx ファイルに直接書かれたものでしょうか?

    masterページのaspxに直接書いています。

     

    しかしながら、1つ目のhistory.forward();記述を消すと、実行エラーになる現象は未だ謎です。

     

    2010年12月13日 5:07
  • > 2画面の簡単プロジェクトで試したら、正常に動作しました。

    前の返信に書かれていたこの行を見落としてました。
    2画面の簡単なものでは正常に動作しても、マリカさんの実際のプロジェクトでは問題が発生するのですね。
    実際のプロジェクト側の、何か(script タグより前にあると思われます)が災いしているのですね。
    それを地道に特定するしかないと思います。

    それと、念のため、細かなことですが確認させてください。

    > しかしながら、1つ目のhistory.forward();記述を消すと、実行エラーになる現象は未だ謎です。

    1つ目の history.forward(); の消し方ですが、その行だけを消されたのではなくて、
    <script type="text/JavaScript">
        history.forward();
    </script>
    ごと消されているのですよね?

    すると、IsReadyState が定義された script ブロックが「1つめの script タグ」になるので、たんにそれが認識されないだけかと思います。
    つまり、マリカさんの環境での問題としては、「1つめの script タグが認識されないこと」に尽きるのかなと思います。

    2010年12月13日 5:33
  • 関係ないと思いますが、script タグに language="javascript" を追加してもダメでしょうか?
    通常は指定しますので。

    (追記:
    ひとつ前に vbscript を書いてみたりしても問題は発生しなかったので、この返信は関係なさそうです。
    あと、type の中身をすべて小文字にしてもダメですよね? もう私にはこんなあてずっぽうなことしか書けません。。)

    さらに追記:
    手元の書籍に、HTML4.0 以降は language の指定は不適切と書かれていました。
    失礼しました。

    あと、以下のサイト(英語)にマスターページを使用時の JavaScript の使用に関する注意点のようなことがまとめられていましたが、今回は関係ないと思ってます(全部ちゃんと把握したわけではないです。何か良い情報が書かれていればいいのですが)。

    Calling JavaScript from ASP.NET Master Page and Content Pages - Part I
    http://www.dotnetcurry.com/ShowArticle.aspx?ID=273

    • 編集済み TH01 2010年12月13日 6:23 たくさん追記
    2010年12月13日 5:38
  • TH01様、色々と調べていただきありがとうございます。

    そして、ごめんなさい。

    以前、どなたかにソース表示ではなく、IEツールの「管理者ツール」を使えと教えていただいた事を思い出して、

    それでソースを表示したところ、<head>ブロックから<script>タグがおかしくなっており、history.forward();部分が

    連なって表示されていました。

    <head runat="server">

    <script language="JavaScript" type="text/JavaScript" src="css/fontselect.js" />  <--- 悪さをしてた行

    </head>

    <body style="cursor:default;">

        <script type="text/JavaScript">
            window.history.forward();
        </script>

    これでも、間違っていないように思うのですが、/>で終わるのを止め、きっちり</script>を付けたら全て解決しました。

    お騒がせして、TH01様、SuferOnWww様の貴重なお時間を無駄にして申し訳ございませんでした。

    お世話になりました。

     

    • 回答としてマーク マリカ 2010年12月13日 8:08
    2010年12月13日 6:55
  • そんなこともあるんですね。
    検索してみると、ここに書かれてました。

    scriptタグを<script src="~" />って書くと、なんで上手くいかないかまとめてみた
    http://d.hatena.ne.jp/kasei_san/20090616/p1

    HTML4.1 の仕様みたいですね。
    script は空要素ではないというのがポイントみたいです。

    マリカさんの情報は、今後、同じ問題に遭遇した人のためになるかもしれないので、
    マリカさん自身の返信に「回答マーク」を付けられるべきと思いました。
    (私の返信は外してもらってもいいです。悲しいですけど。(^^;)

    私も勉強になりました(いつも人の質問で勉強してます)。

    2010年12月13日 7:44
  • TH01様の最初の返信にも<script>タグの関係を指摘して頂いていたので回答マークを付けさせて頂きました。

    > マリカさんの情報は、今後、同じ問題に遭遇した人のためになるかもしれないので、...

    そこで、質問タイトルを内容に合ったものに変更しました。

    前のタイトルよりは同じ問題に遭遇した人が検索でヒットするかと思います。

     

    2010年12月13日 8:08
  • すでに解決済みのスレッドに、題名と直接関係のないレスするのもなんですが、
    気になった点を一言だけ・・・

    > このマスターページを使っているページでは、UpdatePanelを使っています。

    UpdatePanel を使用しているなら、PageRequestManager が提供しているイベント
    を利用して、非同期ポストバックを行う際に、最初の部分ページ更新が完了するま
    で 2 回目以降のリクエストをキャンセルする(いわゆる、ボタンの二度押し防止)
    ことができます。

    前のスレッドで紹介したサイトが分かりにくいかったかもしれませんので、もう少
    し具体的な方法が書いてあるページを紹介します。

    第2回 PageRequestManagerクラスでUpdatePanelコントロールを極める!
    http://www.atmarkit.co.jp/fdotnet/ajaxlib/ajaxlib02/ajaxlib02_02.html

    2010年12月13日 14:47