• ベストアンサー

jqueryについて、$("+dd",this)について教えていただけ

jqueryについて、$("+dd",this)について教えていただけませんでしょうか 【参考サイト】 http://ascii.jp/elem/000/000/498/498710/index-6.html 上記のページのアコーディオンメニューを作る記述において、 $(function(){ $("dd:not(:first)").css("display","none"); $("dl dt").click(function(){ if($("+dd",this).css("display")=="none"){ $("dd").slideUp("slow"); $("+dd",this).slideDown("slow"); } }); }); の if($("+dd",this).css("display")=="none") の部分の"+dd"に何故、+が付くのでしょうか。 確かに上記の様に記述をすると上手く動作をしますので、正しいのだと 思うのですが、そうなる理由が解らなくて混乱してしまっています。 thisが示す$("dl dt")の下層の要素を指定するための記述ならば、 if($("this dd").css("display")=="none") として、$("dl dt")の下層にあるddという様な指定は出来ないのでしょうか。 まだ、ほとんどjqueryの記述ルールを把握していないので、お恥ずかしいのですが、 何卒、宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.2

>thisが示す$("dl dt")の下層の要素を指定するため ddはdtの下層ではなくdtの兄弟です そのため隣接セレクタを使う必要があります 別の書き方をするなら $(this).next() とか。 あと、記述ルールというか、 オブジェクトであるthisと、 文字列でしかないセレクタ を混同してしまっているようなのでその辺りを意識してみてはどうでしょう。

oiwai-giftland
質問者

お礼

> 別の書き方をするなら > $(this).next() とか .next()を使って記述を $(function(){ $("dd:not(:first)").css("display","none"); $("dl dt").click(function(){ if($("+dd",this).css("display")=="none"){ $("dd").slideUp("slow"); $("+dd",this).slideDown("slow"); } }); }); を $(function(){ $("dd:not(:first)").css("display","none"); $("dl dt").click(function(){ if $($(this).next()).css("display")=="none"){ $("dd").slideUp("slow"); $($(this).next()).slideDown("slow"); } }); }); としたら同じように動きました。 こちらの記述ならば、一応自分の中で納得ができました。 (無知に近い状態の身で納得もくそも無いかもしれませんが・・・。) > 記述ルールというか、 > オブジェクトであるthisと、 > 文字列でしかないセレクタ > を混同してしまっているようなのでその辺りを意識してみてはどうでしょう。 もっと記述ルールを覚え、また基本的な部分をちゃんと理解していきたいと思いました。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.3

No.1です。私もそんなにjqueryの仕組みに精通してるわけじゃないんですが、 jqueryのコアクラス?である$()は、引数の数とそのタイプ、内容によって いろいろな物に化けて、多様な機能を提供できるようになっているのですよ。 このへんはまさに、javascriptのオブジェクトや関数定義の内容を後から好き 方だいに追加・変更・削除できるという性質やargumentsオブジェクトなんて のがあるのを、とことん利用して作られてますね。 「プロトタイプベースオブジェクト指向言語」てゆうそうですが、難しいです よね。 ちなみに $(this + dd) だと、まずjavascriptでthis+ddを計算しようとして、 thisがオブジェクトでddは未定義の変数と解釈されるのでエラーですよね。 何故 $("+dd",this) が許されるのかは、jqueryのソースをじっくり研究しな いと真の解答はでないです。 ここは素直に thisに格納されたjqueryオブジェクトに対して"+dd"のセレクター書式で もって検索されると納得しときましょう。 ※(CSSの隣接セレクターだと E1 + E2 と2つ書かないとエラーなんですが..) 納得出来ないなら、jquery使うのを止めるか、納得出来るまでとことん調べて 納得してから使うとか、ツールに対するこだわりですね。

oiwai-giftland
質問者

お礼

> jqueryのコアクラス?である$()は、引数の数とそのタイプ、内容によって > いろいろな物に化けて、多様な機能を提供できるようになっているのですよ。 > 何故 $("+dd",this) が許されるのかは、jqueryのソースをじっくり研究しな > いと真の解答はでないです。 なるほど! 自分の勉強不足で、本当に理解するにはjqueryのルールだけではなく、根本的なjavascriptから 勉強していかないといけないみたいですね。 一朝一夕で理解しようと思うほうが無理という話ですね。 しかし、毎度yyr446さんからいただく説明はとてもわかりやすく親切に書いていただいているので とても参考になります。 > thisに格納されたjqueryオブジェクトに対して"+dd"のセレクター書式で > もって検索されると納得しときましょう。 わかりました!今は納得しておいて、追々勉強をしていきたいと思います。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

if($("this dd").css("display")=="none") として、$("dl dt")の下層にあるddという様な指定は出来ないのでしょうか。 =>$("this dd")とするとthisが単なる文字列となって<this>要素を探しちゃいますよね だからだめです。 ここでのthisは、クリックされた<dt>要素の事ですよね。 +ddの+の意味は次に出現する要素の意味で,$("+dd")は次に出現する<dd>要素を選ぶ セレクター(検索条件)です。 一方 $("+dd",this) の構文はセレクターというより、  jQuery(expression, context) の構文で expressionの条件にマッチする要素をcontextの要素から抽出して返す意味合いです。 日本語の解説サイトもありますよ。 ご参考に http://semooh.jp/jquery/api/core/jQuery/expression%2C+context/

oiwai-giftland
質問者

お礼

いつも。お世話になっております。 早速のご回答、誠にありがとうございます。 > +ddの+の意味は次に出現する要素の意味で,$("+dd")は次に出現する<dd>要素を選ぶ > セレクター(検索条件)です。 についてですが、それは 隣接セレクター $("要素1 + 要素2") とはまた違うものなのでしょうか。 僕の勝手な思い込みで、『隣接セレクター』は要素1に対しての隣り合わせの要素2を抽出するという 事かと思っておりましたが、その場合、例えば、まったく関係ない構文で $(function(){ $('+dd').html(); }); のような記述の時は、何に対しての隣接を指すのでしょうか。 もしくは、Query(expression, context)の構文では、"+"を付けるだけでcontextが示す要素の隣接要素という認識になるという事なのでしょうか。 いまいち隣接セレクターの使い方が把握できていませんでした。 また、例えば、 > if($("this dd").css("display")=="none") > として、$("dl dt")の下層にあるddという様な指定は出来ないのでしょうか。 > =>$("this dd")とするとthisが単なる文字列となって<this>要素を探しちゃいますよね > だからだめです。 とありますが、 if($(this + dd).css("display")=="none")のような記述でも、やはり駄目でしょうか。 本当に何も知らないので、基本中の基本のような質問ばかりになってしまいますが・・・。 丁寧に参考サイトまで教えていただき、誠にありがとうございます。 お手数をお掛けしますが、何卒、宜しくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • jQueryでアコーディオンメニュー

    質問させてください。 jQueryを使用してアコーディオンメニューを作成しているですが、上手くいきません。 ソースは以下のように記載しました。 (jQuery) <script type="text/javascript"> $(function(){ $("dd:not(:first)").css("display", "none"); $("dl dt").click(function(){ if($("+dd", this).css("display")=="none"){ $("dd").slideUp("slow"); $("+dd", this).slideDown("slow"); } }); }); </script> (HTML) <dl> <dt>Step.1.</dt> <dd><p>aaaaa</p></dd> <dt>Step.2.</dt> <dd><p>bbbbb</p></dd> <dt>Step.3.</dt> <dd><p>ccccc</p></dd> </dl> 上記の場合、if()の中の$("+dd", this).css("display")がundefinedになるためチェックが正常に行われません。 どのように修正すればよいのでしょうか。 お手数ですがお知恵をお貸しください。お願いします。

  • アコーディオンメニューについて

    jQueryを使ったアコーディオンメニューを作成しているのですが、 <dt>をクリックすると<dd>部分に外部のテキストファイルを表示させる方法がわかりません。 以下の記述に何を付け足せば良いのですか? $(function(){ $("dd:not(:first)").css("display","none") $("dt:first").addClass("selected"); $("dl dt").click(function(){ if($("+dd",this).css("display")=="none"){ $("dd").slideUp("slow"); $("+dd",this).slideDown("slow"); $("dt").removeClass("selected"); $(this).addClass("selected"); } }).mouseover(function(){ $(this).addClass("over"); }).mouseout(function(){ $(this).removeClass("over"); }) }) <dl> <dt>Step.1</dt> <dd><p>Lorem ...(中略)... venenatis.</p></dd> <dt>Step.2</dt> <dd><p>Integer ...(中略)... accumsan. </p></dd> <dt>Step.3</dt> <dd><p>Integer ...(中略)... imperdiet. </p></dd> </dl>

  • 【jQuery】jQuery Masonry

    この度jQueryで壁にぶつかり、質問させて頂きます。 現在開発中のWEBサービスにて、jQuery Masonryとアコーディオン機能を組み合わせたページを構築する流れとなっております。 画面イメージとしては・・ Pinterestにアコーディオン機能が付いており、各帯をクリックする毎に内容が表示される機能です。 【Point】横幅は制限がありますが、縦幅には制限が無く、アコーディオンが開閉する毎にグリッド部分の再構築(ムーブアクション)を行いたいのですが、それが上手くいきません。 参考サイト:http://goo.gl/QLQI7 実際のソース(抜粋): <script> jQuery(function(){ var $container = $('#container'); $container.imagesLoaded( function(){ jQuery('#container').masonry({ itemSelector: '.item', isAnimated:true }); }); }); </script> <script> jQuery(function () { jQuery("dd").css("display","none"); jQuery("dl dt").click(function(){ var cont = jQuery(this).next(); if(jQuery(cont).css("display")=="none"){ jQuery("dd").slideUp("slow"); jQuery(cont).slideDown("fast"); jQuery("dt").removeClass("select"); jQuery(this).addClass("select"); } }).hover( function(){jQuery(this).addClass("over");} ),( function(){jQuery(this).removeClass("over");} ); }); </script> <div id="container"> ~ここから~ <div class="item"> <dl> <dt>タイトル1</dt> <dd>本文1</dd> <dt>タイトル2</dt> <dd>本文2</dd> <dt>タイトル3</dt> <dd>本文3</dd> </dl> </div> </div> ~ここまでがLoopで複数のデータが表示される~ なお、jQuery初心者でして具体的な構文までをサポート頂けますと幸いです。 よろしくお願い致します。

    • ベストアンサー
    • CSS
  • jQueryのmouseoutについての質問です。

    jQueryの質問です。 dtにマウスを合わせた時にddが表示し、dlの領域以外にマウスが外れるとdd が非表示させるような設定をしたいのですがうまくいきません。 子要素のddとかdtとかaに合わさるとすぐに非表示になってしまいます。 dl内は、どこを移動しても非表示にならずdl要素以外の箇所にマウスが合わ さった時に非表示になってほしいのですが どなたかアドバイスいただけないでしょうか? 自分なりにはこのように記述してみました。 ■jQueryの記述 $(function(){ $("dt").mouseover(function(){ $("dd:not(:animated)").slideDown("slow"); }); $("dl").mouseout(function(){ $("dd:not(:animated)").slideUp("slow"); }); }); ■CSSの記述 <dl> <dt>スライドして表示状態を切り替える</dt> <dd> あああ<a href="#">ああああ</a>あああああああ ああああああああああああああああああああああああああああああああああ あああああああああああああ<a href="#">ああああ</a>あああああ<a href="#">ああ</a>あああああ </dd> </dl> デモURL: http://tegarude.web.fc2.com/faq/test.html

  • jQuery

    http://ascii.jp/elem/000/000/498/498710/ 上記サイトの6page目をみて、サイトに手順のあるjQueryアコーディオンを作成しようとおもったのですが、クリックすると2番目と3番目のddの部分が表示されるのですが、私のは最初からddの画像が 3枚とも表示されています。 私の作成したサイトのhtml、cssの記述は以下です。 また、jsフォルダにはjquery.animate-colors-min と jquery.easying.1.3と jquery.skitterと jquery-1.6.3.minが入っていて、jqueryskitterをダウンロードしたときのものです。それが間違いでしょうか? 上記サイトでは他のバージョンを使っているので、それをダウンロードしないとダメなのでしょうか? <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> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>メニューページ</title> <link href="all.css" rel="stylesheet" type="text/css" media="all" /> <script type="test/javascript" src="js/jquery-1.6.3.min.js"></script> $(function(){ $("dd:not(:first)").css("display","none"); $("dl dt").click(function(){ if($("+dd",this).css("display")=="none"){ $("dd").slideUp("slow"); $("+dd",this).slideDown("slow"); } }); }); </head> <body> <dl> <dt>course</dt> <dd> <p><img src="image/menu1_03.jpg" width="728" height="515" /></p> </dd> <dt>a la calt</dt> <dd> <p><img src="image/menu2_03.jpg" width="763" height="560" /></p> </dd> <dt>waine</dt> <dd> <p><img src="image/manu3_03.jpg" width="763" height="561" /></p> </dd> </dl> </body> </html> ○CSS部分*他のhtmlページともリンクしているため、下記以外にも書いてあります *{ margin:0; padding:0; } a imag{ border:none; } dl{ width:763px; margin:50px auto; } dl dt{ background:#7CADB6; border-bottom:1px solid #FFFFFF; cursor:pointer; } dl dd{ border:1px solid #7CADB6; border-top:none; height:561px; }

  • JQueryについて教えて下さい。

    html部分は <ul>  <li>テスト1です。</li>  <li>テスト2です。</li>  <li>テスト3です。</li> </ul> <div id="test">test</div> となっており、 スクリプト部分は、 $("ul li:not(:first)").css("display","none"); $("#test").click(function(){   if($("+li",this).css("display")=="none"){     $("li").slideUp("slow");     $("+li",this).slideDown("slow");   } }); としています。 やりたいことは、"test"をクリックしたら、 次の"li"が表示されるようにしたいのですが、 動きません。 どなたかご教授よろしくです。

  • jQueryで条件が正の場合にクラスを追加

    開閉式のリストを作成しています。 ツリーが閉じている場合は+の画像、開いている場合は-の画像を表示させる為、 jQueryで条件が正の場合のみクラスを追加したいです。 if文を挿入するとクラスの追加が反映されません。 #.jsコード ----------------------------------------------------- $(document).ready(function() {   $("dd").css("display","none");   $("dt").click(function(){     $(this).next().slideToggle("fast");     if(! $("dd").css("display","none") ) {       $("dd").addClass("aaa");     }   }); }); ----------------------------------------------------- ↑上記コードでddにaaaクラスがある場合画像、cssで背景画像を表示したいです。 #.htmlコード ----------------------------------------------------- <dl>   <dt>ここの画像を変更させたいです。</dt>     <dd>       ここを開閉させたいです。     </dd> </dl> ----------------------------------------------------- よろしくお願い致します。

  • アコーディオンメニューが他にも影響してしまう

    $(function(){ $("dd:not(:first)").css("display","none"); $("dt:first").addClass("selected"); $("dl dt").click(function(){ if($("+dd",this).css("display")=="none"){ $("dd").slideUp("slow"); $("+dd",this).slideDown("slow"); $("dt").removeClass("selected"); $(this).addClass("selected"); } }).mouseover(function(){ $(this).addClass("over"); }).mouseout(function(){ $(this).removeClass("over"); }); }); <div class="accordion"> <dl> <dt>Step.1</dt> <dd><p>Lorem ipsum dolorturpis suscipit pretium. Aenean ultricies scelerisque dictum. Phasellus tincidunt, nibh lacinia facilisis aliquam, lacus quam condimens.</p></dd> <dt>Step.2</dt> <dd><p>Integer rhoncus felis mauris. Donec massa Donec elementum arcu tortor.ec at pellentesque mi. Mauris lobortis libero ac metus ultricies accumsan. </p></dd> <dt>Step.3</dt> <dd><p>Integer pretium porttitor lectus at tempor. Donec nec cursus elit. sit amet turpis Praesent feugiat est eu tellus dictum ac imperdiet nisi imperdiet. </p></dd> </dl> </div> 「jQueryデザイン入門」という本を読みながらアコーディオンメニューを作ってみたのですが、HTML内のほかのdd,dtも隠れたり現れたりしてしまいます(^^;) div class="accordion"のdd,dtに適用して他のdd,dtに影響しないようにするにはどのようにしたらいいのでしょうか?

  • JQueryで$("dt span")クリック動作

    JQueryで$("dt span")をクリックしたときに 隣接するddタグの部分を表示させるには以下の記述を どのように修正すればよいのでしょうか? <html> <head> <style type="text/css"> dl { margin-bottom: 20px; } dd { display: none; } </style> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $("dt span").click(function(){ $("+dd",this).slideToggle(); }); }); </script> </head> <body> <dl> <dt>toggle<span>開く</span></dt> <dd>テキストが入ります。</dd> </dl> <dl> <dt>toggle<span>開く</span></dt> <dd>テキストが入ります。</dd> </dl> </body> </html> ご存じの方がおられましたらご回答をよろしくお願いします。

  • アコーディオンメニューをブラウザー幅で変更したい

    下記のようにHTMLを組んでjQueryを使ってアコーディオンメニューを作りました。 <dl id="List"> <dt>タイトル</dt> <dd>詳細テキスト</dd> <dt>タイトル</dt> <dd>詳細テキスト</dd> <dt>タイトル</dt> <dd>詳細テキスト</dd> </dl> jQueryは下記の通りで検索して見つけたものを使わせていただきました。 jqueryのバージョンは「1.10.1」。 $(function(){ $('#List dd').hide(); $('#List dt').click(function() { if($(this).next('dd').is(':visible')) { $(this).next('dd').slideUp(300); } else { $(this).next('dd').slideDown(300).siblings('dd').slideUp(300); } }); }); これでdtのタイトルをクリックするとdd部分が表示され、 別のdt部分をクリックすれば、先に開いていたdd部分が隠れて、 クリックしたdtの下部にあるdd部分を表示するというように 問題なく機能してくれました。 これを活かしつつ、レスポンシブのようにしたいなと思ったのです。 仕様としては、パソコンで見る時はdd部分を隠さず表示して、 ブラウザー幅が480pxに以下になったら、 dd部分を隠してアコーディオンとして機能させたい、 と思いました。 プログラムは初心者ゆえ、ライブラリの応用しかできず、 検索で見つけ出したのが下記のようなソースです。 $(function() { var w = $(window).width(); var x = 480; if (w <= x) { } }); これに上のアコーディオン用のソースを合体させればいけるのではないか? と漠然と思って(確証がもてるはずもなく…)下記のようにしてみました。 $(function() { var w = $(window).width(); var x = 480; if (w <= x) { $('#kuchikomiList dd').hide(); $('#kuchikomiList dt').click(function() { if($(this).next('dd').is(':visible')) { $(this).next('dd').slideUp(300); } else { $(this).next('dd').slideDown(300).siblings('dd').slideUp(300); } }); } }); 動いてくれそうな気がしたのですが、 全く動いてくれませんでした(涙) この情報だけを見て、 間違っている箇所がお分かりになる方がいらっしゃいましたら、 ぜひともご教授いただきたいのですが… よろしくお願いいたします。

このQ&Aのポイント
  • DCP7065DNの印刷後に紙にシワができる問題について相談します。背面パネルを開けると、茶色いローラーの凹凸とシワの形状や位置が一致していることがわかりました。このローラーの役割や凹凸の原因、修理の可否、修理費用などについて教えてください。
  • 私が使用しているブラザー製品のDCP7065DNで、印刷後に紙にシワができる問題が発生しています。シワの形状や位置が背面パネルにある茶色いローラーの凹凸と一致しているため、このローラーが原因ではないかと思っています。ローラーの役割や凹凸の原因、修理の可否、修理費用などについて教えてください。
  • DCP7065DNというブラザー製のプリンターを使用しているのですが、印刷後に紙にシワができる現象が起きています。シワの形状や位置が背面パネルにある茶色いローラーの凹凸と一致することがわかりました。このローラーが原因でシワが発生しているのか、修理が可能なのか、修理費用はどれくらいかかるのか教えてください。
回答を見る

専門家に質問してみよう