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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

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

Q&A

解決済

4回答

309閲覧

【子要素の指定方法?】jQueryをプレーンなJavaScriptで使う方法

helloman

総合スコア39

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

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

0グッド

0クリップ

投稿2017/09/06 04:51

現在簡単なスライダーを製作中で、
jQueryでの実装はできたのですが、プレーンなJavaScriptで書こうと挑戦するとエラーが出てしまいました。

「li.activeの次の要素があれば取得して、なければ最初に戻る」部分のコードなのですが、
「Uncaught TypeError: t.queryAll is not a function」というエラーが出てしまします。

js

1var $active = $('#slide li.active'); 2var $next = $active.next('li').length ? $active.next('li') : $('#slide li:first');

上記jQueryをプレーンなJavaScriptでの記述方法を考え中です。

js

1var doc = document; 2var slide = doc.getElementById('slide'); 3var childs = slide.querySelectorAll('li'); 4var $active = slide.querySelector('.active'); 5var $next = $active.queryAll('~ li').length ? $active.nextElementSibling : childs[0];

slide.querySelector('.active')の部分がうまく取れてないようなのですが、
行き詰まってしまいました。

よろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

queryAll の誤字は修正頂けたので、残る問題はここですね。

JavaScript

1var $next = $active.queryAll('~ li').length ? $active.nextElementSibling : childs[0];

~ はコンテキストノードをルートとした相対的なセレクタを指定することを意図していると思われますが、そのような書き方は出来ません。
~ は2つのセレクタを繋ぐ結合子であり、先頭に指定することは出来ません。

このようなケースを想定して、Selectors Level 4 では :scope が用意されていますが、まだ実用段階にはありません。

HTML

1<ul id="slide"> 2 <li>a</li> 3 <li class="active">b</li> 4 <li>c</li> 5 <li>d</li> 6 <li>e</li> 7</ul> 8 9<script type="text/javascript"> 10'use strict'; 11var slide = document.getElementById('slide'); 12var childs = slide.querySelectorAll('li'); 13var active = slide.querySelector('.active'); 14var next = active.querySelectorAll(':scope~li').length ? active.nextElementSibling : childs[0]; 15</script>

現実的には下記コードになるであろうと思います。

JavaScript

1var next = active.nextElementSibling || childs[0];

ところで、セレクタの相対指定は jQuery でも未対応だったと思うのですが、なにがしかの方法が存在したでしょうか。
現状、セレクタ的な文法で相対指定をしようとしたら、XPath ぐらいしか私は思いつきません。

Re: helloman さん

投稿2017/09/06 06:48

編集2017/09/06 06:51
think49

総合スコア18162

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

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

helloman

2017/09/06 06:52

どこのサイトか忘れましたが、理解せずコピペで使ってました。m_ _m jQueryで言う.next()がしたかった結果でした。
guest

0

まずはqueryAll の箇所をquerySelectorAll にするところから

sample

一応sampleつけておきます
.aciveをつけたりはずしたり、別のところにつけたりして確認してみて下さい

<script> window.onload=function(){ var n1=document.querySelector("#slide").querySelectorAll("li"); var n2=document.querySelector("#slide").querySelector("li.active"); var v=(n1==null || n2==null)?"no active":(n2.nextElementSibling||n1[0]).innerHTML; console.log(v); }; </script> <ul id="slide"> <li>test1</li> <li>test2</li> <li class="active">test3</li> <li>test4</li> <li>test5</li> </ul>

投稿2017/09/06 05:16

編集2017/09/06 05:45
yambejp

総合スコア114779

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

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

helloman

2017/09/06 06:13

サンプルありがとうございます。 ちょっと挑戦してみます。
guest

0

.querySelectorAll()NodeListを返しますので、.querySelector()メソッドを直接使うことはできません。.forEach()メソッドなどを介してください。
NodeList.prototype.forEach() - Web APIs | MDN

投稿2017/09/06 05:44

Lhankor_Mhy

総合スコア36074

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

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

Lhankor_Mhy

2017/09/06 05:47

あ、違うんですね。コードを読み違えました、失礼しました。 え、でも、それでいいのかな?
Lhankor_Mhy

2017/09/06 05:50

ああ、いいんですね。重ね重ね失礼をいたしました。
helloman

2017/09/06 06:14

ありがとうございます。 入り口がjQueryだったので苦戦中です。
guest

0

querySelectorAllを利用するのであれば、
細切れに利用するのではなく

var $active = slide.querySelector('#slide li.active');
でいけるんじゃないですかね(多分)
ツリー構造側明確であれば、以下を組み合わせた方が良さそうに思います(速度的に)
getElementById
getElementsByClassName

投稿2017/09/06 05:39

t_obara

総合スコア5488

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

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

helloman

2017/09/06 06:13

参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問