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

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

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

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

1826閲覧

取得したエレメントを起点に、その内部のエレメントを取得する方法

circus55

総合スコア66

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2015/06/17 10:56

初めて質問させてもらいます。よろしくお願いします。

次のようなHTMLがあった場合、

lang

1<div id="target"> 2 <span>その1</span> 3 <div> 4 <span>その2</span> 5 </div> 6</div>

Dart言語で、id=targetのエレメントを取得して、
それを起点に「その2」の文字列を取得する方法を教えていただきたいです。
具体的には、

lang

1var elm = document.querySelector("#target"); 2var span = elm.querySelector("div > span"); 3window.alert("${span.text}");

これでアラートに「その2」と表示してほしいのですが、「その1」と表示されます。
dart2jsでコンパイルして他ブラウザで見ても結果は同じでした。

次の方法も試しました。

lang

1var elm = document.querySelector("#target"); 2var span = elm.querySelector(":scope div > span"); 3window.alert("${span.text}");

これであれば期待していた「その2」が取得されるのですが、
dart2jsでコンパイルしたJavaScriptを実行した所IEのみエラーが出て正常動作してくれません。
※ その他ブラウザは期待した通りで動作しました。

どのようにすれば、1度取得したエレメントを起点にセレクタでエレメントを取得して、
dart2jsでコンパイルし、どのブラウザでも動作するようにできるでしょうか?

Dart version 1.10.1
IE version 11
Dartiumは今ダウンロードできる最新の物です。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

lang

1//var elm = document.querySelector("#target"); 2var elm = document.getElementById("target"); 3var span = elm.querySelector("div > div > span"); 4window.alert("${span.text}");

comment data

lang

1<div> 2<span>test</span> 3<div id="target"> 4<span>その1</span> 5<div> 6<span>その2</span> 7</div> 8</div> 9</div>

lang

1import 'dart:html'; 2Element target; 3Element span; 4void main() { 5target = query('#target'); 6span = target.query('div > span'); 7print(span.text); 8}

コレだ!!!

lang

1<div> 2 <span>test</span> 3 <div id="target"> 4 <span>その1</span> 5 <div> 6 <span>その2</span> 7 </div> 8 </div> 9</div>

lang

1import 'dart:html'; 2Element target; 3Element span; 4void main() { 5 target = query('#target'); 6 span = target.query('div > div > span'); 7 print(span.text); 8} 9

その2ではなくその1が取れます。
その為、起点にしているわけではないようです。

起点にして取得するには

lang

1import 'dart:html'; 2Element target; 3Element span; 4void main() { 5 target = query('#target'); 6 span = target.childNodes[3].childNodes[1]; 7 print(span.text); 8}

という取り方になるかと思われます。

よろしくお願い申し上げます。

投稿2015/06/17 10:57

編集2015/06/17 13:11
nanndemoiikara

総合スコア775

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

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

circus55

2015/06/17 11:03

回答ありがとうございます。 JavaScriptであれば、それで動作するのかもしれませんが、 Dartではそれでは正しく動作しませんでした・・・
circus55

2015/06/17 11:21

ソースの編集をしていただいたのですね、ありがとうございます。 うーん、確かにこれなら狙ったテキストを取得できているのですが、 取得したエレメントを起点にして取得ができていません・・・ むしろ、これで取れる事自体が感覚的におかしいですよね・・・
nanndemoiikara

2015/06/17 11:47

通常のJSでもこの取り方になりました。 また、 ```lang-html <div> <span>test</span> <div id="target"> <span>その1</span> <div> <span>その2</span> </div> </div> </div> ``` この場合に ```lang-javascript import 'dart:html'; Element target; Element span; void main() { target = query('#target'); span = target.query('div > span'); print(span.text); } ``` これで「その1」が取れましたので起点にはなっています。 ただ私自体も感覚的にコレジャナイ感があり狼狽しております。
circus55

2015/06/17 12:13

うーん、うーん・・・ 起点にするエレメントも指定してセレクタを組まないといけないのでしょうか・・・・ もしも、そうであったとすると次の方法で正常動作する意味がわからなくなります。 var span = elm.querySelector("div").querySelector("span"); これで取得すると期待していた「その2」が取れます・・・ ・・・Dartのバグでしょうか・・・???
nanndemoiikara

2015/06/17 12:51

回答になっておらず申し訳ございません。 ずっと調べていたのですが、純正のJavaScriptのquerySelectorも同様の動きをします。 jQueryのfindは内部的にparentNodeの物を取らない様にCSSパースしてごにょごにょしてるっぽかったです。 正確な動作は現在調査中です。。。 その為DartのバグではなくDOM仕様なのかなぁと思っておりますが、 はっきりとはわかりませんでした。 引き続き調査してみます。
nanndemoiikara

2015/06/17 13:01

下記Dartのドキュメントなのですが https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:html.Element セレクタの指定されたグループと一致し、この要素の最初の子孫要素を検索します。 Serekuta no shitei sa reta gurūpu to itchi shi, kono yōso no saisho no shison yōso o kensaku shimasu. この解釈ですと、id #target内にある「div > span」の条件に一致する物を取得するのではないでしょうか? なので、「コレだ!!!」の内容だと「その1」というtext nodeが取れます。
circus55

2015/06/17 13:43

わざわざ調査してもらってまで回答していただきありがとうございます! 説明してもらった内容で何となく飲み込めそうなのですが・・・ しかし、その内容で考えていくと・・・ var list = elm.querySelectorAll("div"); window.alert("${list.length}"); // 1 こうすると1つだけエレメントが取れますが、2つエレメントが取れないと感覚的におかしいように思うのです・・・ もう、こういう物として考えるしかないでしょうかね・・・
circus55

2015/06/17 14:19

すみません、上記の方法で2つエレメントが取れたら、 その1つは自分自身であって、それではおかしいですね。 説明してもらった内容で、よくよく考えていくと・・・ 「その1」を取得しようとして、 elm.querySelector(" > span"); こんなセレクタは書ける訳なく(jQueryは確か行けた) elm.querySelector("div > span"); で「その1」を取得するという事ですよね。 なので、何も間違ってなかったって事ですね・・・ 完璧に飲み込めました! わざわざ調べてもらいながら回答していただき本当にありがとうございました!
nanndemoiikara

2015/06/18 00:09

私もすごく勉強になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問