2011-07-26 15 views
2

私は単純なHTMLとして、つまりコードビハインドなしで使用しているASP.NETのユーザーコントロールをいくつか持っています。jQueryとASP.NETユーザーコントロールを使用する場合の要素IDの処理方法

私は固定IDの要素を持っていますが、私はいくつかのjQueryクライアントスクリプトを指しています。例:

<div id="slider-section"></div> 

<script type="text/javascript" language="javascript"> 
    $(document).ready(function() { 
     var slider = $('#slider-section'); 
     // ... do something with the jQuery Object 
    }); 
</script> 

これは問題なく非常に良好に動作します。しかし、これには副作用があります。実際、同じユーザーコントロールのインスタンスをページに2つ追加すると、同じIDを持つ2つの要素が表示されます。

これはあなたの意見では、このような状況に対処する良い方法はありますか?

おかげ

答えて

2

単純なHTMLコントロールにrunat="server"を追加した場合、他のすべてのサーバーコントロールと同様にページ固有のClientIDが使用されます。コードビハインドコードは必要ありません。

など。

+0

私はしようとしています... – Lorenzo

+0

これは間違いなくそれを行う方法です。 runat = "server"は、ユーザーコントロールのインスタンス数にかかわらず、ページ内のどこにあっても一意のID(ClientIDを通じて利用可能)を生成します。 –

+0

提案したように、マークアップに 'runat =" server "属性を追加しました。結果的にjqueryコードも更新しました。しかし、残念ながらそれはもう動作しません...オブジェクトはマークアップで正しく見つかりましたが、私が使っていたjqueryプラグインはその要素ではもう動作しません... – Lorenzo

0

マークアップ内のコントロールのclientIDを読み、あなたのjQueryの機能に直接JavaScript変数の中に置きますか。

すなわち:

<div id="slider-section"></div> 

<script type="text/javascript" language="javascript"> 
    $(document).ready(function() { 
     var slider = $('#<%= yourControl.ClientID %>'); 
     // ... do something with the jQuery Object 
    }); 
</script> 
+0

質問は、サーバー上で実行していないコントロールについてです。 –

+0

宇宙炎のための権利。私は私のコントロールで 'runat =" server "'を使用していません... – Lorenzo

+0

ああ申し訳ありません...私はあなたがサーバコントロールについて話したと思った – Fender

1

私は、私は完全にあなたの質問を理解していることをわからないんだけど、私はあなたが求めていると思うものに基づいて、 html要素のクラスを使用するようにjQueryセレクターを変更すると問題が解決するでしょうか?おそらくこのようなものがあなたのために働くでしょう:

<div id="slider-section1" class="slider-section"></div> 
<div id="slider-section2" class="slider-section"></div> 

<script type="text/javascript" language="javascript"> 
    $(document).ready(function() { 
     var slider = $('.slider-section'); 
     // ... do something with the jQuery Object 
    }); 
</script> 

p.s.たとえブラウザがサポートしていても、id/nameが同じhtml要素をページ上に持つのは良い方法ではありません。

+0

完全に正しくはありません。あなたの提案がうまくいく間に私はすべてのコントロールを一意に参照することができません.... – Lorenzo

+0

私の意見では、これはこの特定のケースでは正しいアプローチです。 「スライダセクション」は、要素の一般的なカテゴリを表し、すなわち要素の_クラスの一部である。 IDは、何らかの形で固有の_specific_要素を識別するのに最適です。 (つまり、クライアントコントロール用の一意のIDを生成する@Lorenzoのより一般的な質問には答えません) –

2

ブラウザは複数の同一のIDについて不平を言うことはできませんが、HTMLページにそれらを置くことは正しくありません。

実際の問題は、すべてのIDが一意であることを確認するためにユーザーコントロールを追加するASP.NETコードを変更する必要があることです。その後、jQueryの問題も解消されます。

+0

あなたの答えをありがとう。問題は、Sharepoint環境でWebパーツ内にユーザーコントロールをラップしていることです。だから私は、ユーザーがページにコントロールの別のインスタンスを追加するかどうかを制御できません。あなたが提案しているコードは、コントロールそのものの内部にあるはずです。これで私はちょっと混乱します:) – Lorenzo

+0

カスタムコントロールを構築するためのMSDNドキュメントを見ていきたいと思います。コントロール自体に一意のIDが割り当てられていない場合は、それを確実に追加するコードが必要です。私はあなたの制御にもう少しコードを追加する必要があるかもしれないと思う - おそらくどこかでコンストラクタをオーバーライドする。 – Widor

0

IDの全体点は、要素を一意に識別することです。要素をまとめてグループ化する場合は、同じclassを与える必要があります。

これはかなり良い説明です。 http://css-tricks.com/818-the-difference-between-id-and-class/

+0

あなたの答えに感謝します。とにかく、すべてのコントロールを一意に参照する機会を失いたくはありません。 – Lorenzo

+0

次に、作成したコントロールのIDをインデックスするコードを修正する必要があります。また、あなたのスライダーが一意のIDを持つ異なる親div内にネストされている場合、それらのクラスには、人々が示唆し、それらの親に基づいて一意に選択するようなクラスを与えることができます。 '$( 'parentId')。find( '。slider-section');例えば、 – Jack

5

Asp。ネットコントローラクライアント側でレンダリングする場合、別のIDを作成し、例:

あなたはテキストボックスを定義します。

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 

ページのソースコードをチェックすると、あなたはそのテキストボックスのIDが何かになります注意しますこのように:

<div id="slider-section"></div> 

    <script type="text/javascript" language="javascript"> 
     $(document).ready(function() {  
      var slider = $('input[id$='TextBox1']').{youroptions}; 
      // ... do something with the jQuery Object 
     }); 
    </script> 

id="{GUID}_Textbox1" 

はそう、あなたが何をする必要があるか、このようなIDの終わりを見つけるために、セレクタを使用していますここ

チェックドキュメント:http://api.jquery.com/category/selectors/

を楽しむには、 - すなわちなしのclientid)

関連する問題