質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

2163閲覧

【jQuery】親ブロック内にて appendTo() を実行したい

退会済みユーザー

退会済みユーザー

総合スコア0

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2016/04/27 14:01

###前提・実現したいこと
同じ class のブロックがいくつかあり、その中に子要素 ul がある。
また、ul からはみ出した li が1つだけある。
このはみ出した li を、親ブロック内の ul 最後に移動させたい。

###発生している問題・エラーメッセージ
this の使い方が不得手で上手くいきません。

###該当のソースコード

html

1<section class="block"> 2<h2>見出しタイトル</h2> 3<ul> 4 <li>ダミーテキスト</li> 5 <li>ダミーテキスト</li> 6 <li>ダミーテキスト</li> 7</ul> 8<li class="list"><a href="">リンク</a></li> 9</section> 10 11<section class="block"> 12<h2>見出しタイトル</h2> 13<ul> 14 <li>ダミーテキスト</li> 15 <li>ダミーテキスト</li> 16 <li>ダミーテキスト</li> 17</ul> 18</section>

javascript

1$(".block .list").appendTo($(this).prev("ul"));

###補足情報(言語/FW/ツール等のバージョンなど)
jQuery バージョンは 2.2.0 です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

appendToに渡した$(this)は$('.block .list)ではありません。
そのため

$(".block .list").appendTo($(".block .list").prev("ul"));

とするだけで動くはずです。
ただ、もう少し厳密に書くなら(今回の例題なら).children()を使って取得したほうがいいかなとも思います。
(本来liが飛び出している時点でHtml的にはおかしいですが)

var trg = $('.block').children('.list'); trg.appendTo(trg.prev('ul'));

のような感じかなと。

投稿2016/04/27 14:27

manabufukai

総合スコア700

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/04/27 14:35

確かに this は .block .list ではありませんね。 ご指摘頂いて気づきました…。 children を使ったやり方も納得いたしました。 早々にご返答くださりありがとうございました。
unau

2016/04/27 14:54

横から失礼します。 .children() を使わず $('.block>.list') でもアリですか。
manabufukai

2016/04/27 15:02 編集

Re: KEITA_HIRAIさん とんでもないです。このコードはあくまでも、この質問の例題に対する一つの解でしかありません。 実用的に使おうとするならばunauさんの回答をよくご覧になられたほうが良いです。
manabufukai

2016/04/27 15:00

Re: unauさん $('.block>.list') でも全然問題は無いと思います。 一応.childrenのほうが若干処理が早い、という程度なので…
unau

2016/04/27 15:04

あ、そうなんですね。勉強になりました。ありがとうございます。
manabufukai

2016/04/27 15:16 編集

とんでもないです、基本としてはcssセレクタでネイティブのJavaScriptでは取得できない記述は基本遅めになるようです。 (といってもchildlenとの差は体感できるレベルでもないと思いますが…実際childrenもfindより遅いですし$('.block .list'の記述のほうがfindより高速だったりします)) ただ、ブラウザのJavaScriptエンジンの進化でこのあたりの速度差などは結構変動していたりもするので、よほどの差がない限りは意識しなくても良いかもしれません。
guest

0

this について正確に書こうとすると長くなりますので、とりあえず、jQurery を使う上では、「イベントハンドラの中でイベントが発生した DOM 要素にバインドされる」というのと、「each()map() のコールバックの中で各 DOM 要素にバインドされる」というのを覚えておけばよいかと思います(どちらもコールバックの中で DOM 要素にバインドされていますね)。

javascript

1$('#button').on('click', function() { /* ここでの this はクリックされた DOM 要素 */ }); 2$('#button').each(function() { /* ここでの this はラップ集合に含まれる各 DOM 要素 */ });

これ以外の this については、どのようにコードを書いているかによって変わってきます。

おそらく、やりたいと思われていることは、次のようにすればよいかと思います。

javascript

1 $('.block .list').each(function() { 2 var $li = $(this); 3 $li.appendTo($li.prev('ul')); 4 });

$('.block .list') に該当する li は複数ある場合があり、それぞれの親に appendTo() する必要がありますので、each() で一つずつ処理する必要がある、とお考えください。

投稿2016/04/27 14:52

unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/04/27 14:54

うわぁ、ご丁寧にありがとうございます~。 とても勉強になりました。
unau

2016/04/27 15:06

manabufukai さんのやり方は知らなかったので、私も勉強になりました。 よい質問をあげてくださってありがとうございます。
manabufukai

2016/04/27 15:08

To: unauさん おっしゃる通り、本来使う場合ならeach()使うべきですよね… 「そこまでの説明はいいか…」と、思ってしまった自分を省みます。。
manabufukai

2016/05/02 16:07

To: unau さん 以前.children() と $('.block>.list')の速度差について申しましたが 申し訳ないです、誤りでした! どうやら今は.children()より $('.block>.list')のほうが早いようです…(しかもchildrenの倍ほど早くなってました。。) 現在は(セレクタそのものの指定はシンプルにしつつ)cssライクな記述にしたほうがパフォーマンスが上がるようです。(※ただし擬似クラスは相変わらず低速) Ex $('#foo bar') $('#foo baz') $('.qux > quux > foobar') のような
unau

2016/05/02 20:02

To: manabufukai さん document.querySelectorAll() が使えるようになったから、とか関係あるんでしょうか。昔はこんな便利メソッドなかったし。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問