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

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

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

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

jQuery

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

Q&A

解決済

3回答

1599閲覧

jQueryで特定の一意の要素がDOMノードとして存在しているかを確かめる最良の方法

flc

総合スコア13

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2018/12/18 18:08

編集2018/12/18 19:28

現在

$(コンテナ).find( 探したい要素 ).length

という方法を使っていますが、このやり方で合っているでしょうか?

動くことは動くものの若干腑に落ちなさもあり、このやり方しかないのかな?と疑問に思っています。

[0]や.size()など、いくつかやり方はあるようですが…

あるいは逆に

$( 探したい要素 ).closest().length

のように、探したい要素から見て親があるかどうかを調べたほうがいいとかあったりするのでしょうか?

jQuery

1const $main = $('#main'); //documentとかbodyとかでもいいかもしれないけど、IDで絞っておいたほうが高速らしいので 2 3const $header = $('<header><h1>ハロー、ハッピーワールド!</h1></header>'); 4 5if( $main.find( $header ).length ) { 6 console.log("そんなわけない"); 7} 8else { 9 console.log("そうだよね") 10} 11 12$header.appendTo( $main ); 13 14if( $main.find( $header ).length ) { 15 console.log("そうだよね"); 16} 17else { 18 console.log("そんなわけない"); 19} 20 21$header.remove(); 22 23if( $main.find( $header ).length ) { 24 console.log("そんなわけない"); 25} 26else { 27 console.log("そうだよね"); 28}

追記

関数の引数として、すでに消えたはずの子要素(上記の場合は h1 )を渡し、その関数の中で親要素を削除しようとするとエラーになるようです
これがどうも回避できずにいます…

jQuery

1const $main = $('#main'); 2const $header = $('<header><h2>追記</h2></header>'); 3 4const func = ( $node ) => { 5 //中略 6 const $closest = $node.closest(); 7 8 if( $main.find( $node ).length && $main.find( $closest ).length ) { 9 $closest.remove(); //エラー 10 } 11}; 12 13const $h2 = $header.children('h2'); 14 15//中略 16 17$h2.remove(); 18 19//中略 20 21func( $h2 );

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

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

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

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

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

kei344

2018/12/18 18:55

どちらも再現しません。最初の物は$h1が定義されておらず、後者は$headerが定義されていません。
flc

2018/12/18 19:23

訂正のための編集をした際に漏れがあったようです。気付かせていただきありがとうございます。
m.ts10806

2018/12/19 00:49 編集

追記に今更気づきました。タイトルと質問内容精査したほうがいいです。何がベストかは人によって違うので明確な基準も欲しいですね
guest

回答3

0

ベストアンサー

質問自体はすでに出ている回答で十分です。
追記は「以前取得した要素のドキュメントツリーへの存在確認をしたい」ということになります。

JavaScript

1document.contains(対象要素ノード);

あるいは(IE用には)ドキュメントツリーはルートがdocument.documentElementなので

JavaScript

1document.documentElement.contains(対象要素ノード);

https://developer.mozilla.org/ja/docs/Web/API/Node/contains

jQueryで書く場合は次のようになります。

JavaScript

1$node.closest(':root').length; // 1 or 0

投稿2018/12/19 03:26

x_x

総合スコア13749

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

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

flc

2018/12/20 00:27

.closest(':root')! 単純明快でよいですね。そのうちVanilla JSへの以降も考えておりますので、いずれも使わせていただきたく思います。
guest

0

ちょっと大喜利要素がありそうな質問ですね・・。

「探したい要素」にもよるかと思いますが、提示部分の$(コンテナ)の「コンテナ」部分は子要素を辿ることもできたはずなので、親子関係がはっきりしているのであれば下記のような書き方「も」出来ると思います。

※未検証です

js

1if( $("#main > header > h1").length > 0 ){ 2 3}

「腑に落ちない」と仰っていますが、やり方が1つでない以上は、同じコード内で同じようなことをする際に記法が散らばらないように気をつければあとは好みでいいようにも思います。

速度をそこまで気にされるのであればjQueryではなくPure JavaScriptを選択するのが最も賢明です。

投稿2018/12/19 00:17

m.ts10806

総合スコア80850

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

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

0

jQueryの特徴は、セレクタで指定した存在しない要素もlength=0のオブジェクトとして返すことですね
ちょうどquerySeletorAllをすると空のNodeListをつかめるのと同じ状況です
つまり戻り値がかならずオブジェクトなので

javascript;

1console.log($('hoge')?1:2);

のような処理が適用できません

したがって、lengthを調べるか1つ目の要素を抜き出すかするのが妥当です。
なお1つ目の要素を抜き出すという意味では.eq()がありますが、これも
0個の要素しかないjQueryオブジェクトからeq(0)しても
結果はまた0個の要素をもつjQueryを返すので意味がありません。

javascript

1<script> 2$(function(){ 3 console.log($('div')?'ok':'ng'); 4 console.log($('span')?'ok':'ng');//想定どおりにならない 5 6 console.log(document.querySelectorAll('div')?'ok':'ng'); 7 console.log(document.querySelectorAll('span')?'ok':'ng');//想定どおりにならない 8 9 console.log(document.querySelector('div')?'ok':'ng'); 10 console.log(document.querySelector('span')?'ok':'ng'); 11 12 console.log($('div').length>0?'ok':'ng'); 13 console.log($('span').length>0?'ok':'ng'); 14 15 console.log($('div').get(0)?'ok':'ng'); 16 console.log($('span').get(0)?'ok':'ng'); 17 18 console.log(document.querySelectorAll('div')[0]?'ok':'ng'); 19 console.log(document.querySelectorAll('span')[0]?'ok':'ng'); 20 21 console.log($('div')[0]?'ok':'ng'); 22 console.log($('span')[0]?'ok':'ng'); 23}); 24</script> 25<div>1</div> 26<div>2</div> 27<div>3</div>

投稿2018/12/19 00:49

yambejp

総合スコア114829

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問