2011-10-18 4 views
4

コードは、ページが読み込まれたときにテキストボックスを非表示にし、ユーザーが[その他]を選択したときにのみ表示されるようになっています。このjquery検証コードで何が問題になっていますか?

<script type="text/javascript"> 
     $(document).ready(function() { 
     $('#ddlMajor').change(function() { 
     if ($(this).val() == 'Other') { 
       //    $('#txtOther').show(); 
     $('#txtOther').css('display', 'inline'); 
     } 
     else { 
       //    $('#txtOther').hide(); 
     $('#txtOther').css('display', 'block'); 
     } 

     }); 

}); 
</script> 

<asp:TextBox runat="server" ID="txtOther" style="display:none;" > </asp:TextBox> 

<asp:DropDownList runat="server" ID="ddlMajor"> 
       <asp:ListItem Value="Accounting">Accounting</asp:ListItem> 
       <asp:ListItem Value="Management">Management</asp:ListItem> 
       <asp:ListItem Value="Other">Other</asp:ListItem> 
</asp:DropDownList> 
+0

そして、それは現在何をしますか? –

+1

asp.netコードで生成されたHTMLを表示できますか? –

+3

私はあなたがASPで設定したID:dropdownListが結果のHTMLで生成されたIDと同じではないと思います。あなたがFirebugやIEデバッガのようなツールでこれを見るとどうなるでしょうか? –

答えて

2

サーバーサイドコントロールを使用している場合、IDは再レンダリングされます。あなたは、あなたのjavascriptのコードブロックを置くこともできますが、私の代わりにクラスを使用することをお勧めします:

<asp:TextBox runat="server" ID="txtOther" style="display:none;" CssClass="txtOther"> </asp:TextBox> 

<asp:DropDownList runat="server" ID="ddlMajor" CssClass="ddlMajor"> 
       <asp:ListItem Value="Accounting">Accounting</asp:ListItem> 
       <asp:ListItem Value="Management">Management</asp:ListItem> 
       <asp:ListItem Value="Other">Other</asp:ListItem> 
</asp:DropDownList> 

$('.ddlMajor').change(function() { 
... 
}); 

私はまた、あなたのCSS display値が間違っていると信じています。

$(document).ready(function() { 
     $('.ddlMajor').change(function() { 
     if ($(this).val() == 'Other') { 
     $('.txtOther').css('display', 'block'); 
     } 
     else { 
     $('.txtOther').css('display', 'none'); 
     } 

     }); 

をそれとも、マークアップを変更したくない場合は、ClientIDを使用します。これを試してみてください。注意:youveは

$(document).ready(function() { 
     $('#<%= ddlMajor.ClientID %>').change(function() { 
     if ($(this).val() == 'Other') { 
     $('#<%= txtOther.ClientID %>').css('display', 'block'); 
     } 
     else { 
     $('#<%= txtOther.ClientID %>').css('display', 'none'); 
     } 

     }); 
+0

<%= ddlMajor.ClientID%>などを使用して、CssClassを使用して、使用する必要があるオブジェクトを指すようにしてください。 – StefanE

+0

これはなぜですか?あなたはリファレンスがありますか? javascriptが.jsファイルに含まれている場合はどうなりますか?あなたはどうしますか? – Curt

+0

aspxファイルからJSを分離する場合、サーバーコントロールのIDを設定するためのJS変数を引き続き使用できます。私が言っていることは、この問題を解決するためにCssClassを使用すると、その目的のためにCssClassを使用する必要があるときに後で問題が発生する可能性があるということです。コーダーとWebデザイナーは必ずしも同じ人ではありません:) – StefanE

1

あなたの問題は、あなたがテキストボックスを非表示にしようとするとき、あなたはblockにその表示を設定することであるの.aspxファイル内に含まれるJavaScriptを得た場合にのみ動作します。 JQueryは表示プロパティーdisplay: noneを使用してテキストボックスを非表示にします。だから、あなたがやっているのはjQueryの隠蔽です。これを試してみてください:

$(document).ready(function() { 
    $('#ddlMajor').change(function() { 
     $('#txtOther').css('display', 'inline'); 
     if ($(this).val() == 'Other') { 
      $('#txtOther').show(); 
     } else { 
      $('#txtOther').hide(); 
     } 
    }); 
}); 
+0

これは唯一の問題ではありません。 jQueryはクライアント側でレンダリングされるので、 '#ddlMajor'要素は見つかりません。私の答えを見てください。 – Curt

+0

ああ、私はASPがidタグを書き換えることに気づいていませんでした。知らせてくれてありがとうございます! – jtfairbank

1

あなたが参照としてクラスを使用する必要はありませんが、レンダリング時にサーバーコントロールが別のIDを持つことになりますと、あなたが取得する代わりに、(<% = ddlMajor.ClientID%>)インラインを使用することができます適切なID:たとえば

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#<%= ddlMajor.ClientID %>").change(function() { 
     if ($(this).val() == 'Other') { 
       $('#<%= txtOther.ClientID %>').show(); 

     } 
     else { 
       $('#<%= txtOther.ClientID %>').hide(); 

     } 

     }); 

    }); 
+0

これはCSSディスプレイの問題を考慮していないか、 '#txtOther'も再レンダリングされます。 – Curt

+0

さて、あなたの答えにクラスを使用することは、jQueryとASP.NETを扱う際には間違った勧告です。私は正しいIDを持っていなければ、実行されることのないjavascriptコードの問題を指摘しました。 – StefanE

+0

私はまだ最初の質問に対する正解を言っていないでしょう。 – Curt

関連する問題