![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
こんにちわ
現在、AjaxでApiを使ってHTMLのcontentを収得しています。
それをquerySelectorAllで見出しタグから目次を作成しようとしていますが
うまくいきません。
AjaxでApiを使ってHTMLのcontentを収得した
そのHTMLのcontentを<div>の中に
すっぽりとApiのHTMLのcontentの文字列を入れて
HTML表示させています。
つまり、
--- html ---
<div id="entry-content"></div>
--- js ---
document.getElementById( "entry-content" ).innerHTML = object.api_html_content ;
こんな感じ
そのあと、JavaScriptで
var matches = document.querySelectorAll('h2, h3, h4');
var matches = document.getElementById( "entry-content" ).innerHTML.querySelectorAll('h2, h3, h4');
とやりたいのですが収得できません。
querySelectorAllのやり方は大体理解できているのですが
id要素からquerySelectorAllが出来るか教えてください。
No.4ベストアンサー
- 回答日時:
No3です
>ご指摘のように APIから受け取った文字列を~~
これまでのやり取りから推察するところ、ajaxで内容を取得する前に内容を読もうとして、(まだ存在しないので)単純に失敗しているだけではないかと思います。
最初の、ご質問文に
>そのあと、JavaScriptで~
とありましたので、順序の問題はないものとはずして考えていましたが、単なるタイミングの問題のように思えます。(要は、「そのあとに~~」が、後になっていないだけ)
このあたりの制御に関しては、No2様がすでに回答なさっていらっしゃいますので、そちらを参考になさるのが宜しいかと思います。
・・・ってか、他の方法でも良いですけれど、このようなタイミングの制御はajax等の場合には必須になりますので、避けては通れません。
一番簡単な対処法は、responceの処理に併せて、その後の処理もまとめて記述しておくことでしょうかね。
なるほど、なるほど。。。。
(consoleのlog)
(consoleのlog)
(consoleのlog)
XHR finished loading: OPTIONS "https://api.xxx.com/.....".
となっているので
タイミングが悪く
うまくいかないということですね。
ajaxの処理にheaderにトークンをつけるのを覚えたばかりで余裕がないのです。
でも、MDNを見てみると暖めておけばうまく行きそうな気もします。
何度もお付き合い頂き、とても恐縮です。
----- MDN -----
Fetch API - Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/Fe …
GlobalFetch.fetch() - Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/Wi …
-- ガイド --
Fetch の基本コンセプト - Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/Fe …
Fetch を使う - Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/Fe …
-- インターフェイス --
Body - Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/Body
Headers - Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/He …
Request - Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/Re …
Response - Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/Re …
No.3
- 回答日時:
No1です
>console.log(el);
>は、ちゃんと取れているようですが
>console.log(matches.length);
>は、0になります。
素直に解釈するなら、elの子孫要素にはh2, h3, h4要素(あるいはdiv要素)が存在しないってことでしょう。
同じタイミングで、
console.log(el.innerHTML)
としてみれば、el要素内がどうなっているかを確認できると思いますが?
ご質問文によれば、その処理の前にel要素内に内容を書き込んでいるようですが、そちらの処理がうまくいっていない可能性が高そうに感じますけれど…
回答ありがとうございます。
console.log(el.innerHTML);
は
undefined
になります。
getElementsByClassName
だと、いろいろとれるのですが
HTMLCollection []
で
0:h1.title1
1:h2.title2
2:h3.title3
3:h3.title3
4:h2.title2
.......
とか出てくるだけで
HTMLCollection { length: 0 }
のように length: 0なのです
--------------------------------
>ご質問文によれば、その処理の前にel要素内に内容を書き込んでいるようですが、そちらの処理がうまくいっていない可能性が高そうに感じますけれど…
ご指摘のように APIから受け取った文字列を
<div id="entry-content"></div>
につける前の文字列に注目することにしました。
文字列の検索でいじったら簡単に見出しタグから目次を作成出来たのでそれを採用します。
No.2
- 回答日時:
以下のようにします
・ mypage.html
<script>
window.addEventListener('DOMContentLoaded', function(e){
var url="data.html";
fetch(url)
.then(data=>data.text())
.then(data=>document.querySelector('#hoge').innerHTML=data)
.then(()=>{
var matches=document.querySelector('#hoge').querySelectorAll('h2,h3,h4');
console.log(matches);
});
});
</script>
<div id="hoge"></div>
・data.html
<h2>hoge2</h2>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
<h3>hoge3</h3>
<div>
<span>4</span>
<span>5</span>
<span>6</span>
</div>
<h4>hoge4</h4>
<div>
<span>7</span>
<span>8</span>
<span>9</span>
</div>
No.1
- 回答日時:
こんにちは
>id要素からquerySelectorAllが出来るか教えてください。
意味がよくわからないけれど、特定のDOM要素に対してquerySelectorAllメソッドが使えるかって意味なら使えます。
https://developer.mozilla.org/ja/docs/Web/API/El …
(↑)にも記されていますが、戻り値はNodeListになりますので、その後の扱いにご注意。
>var matches = document.querySelectorAll('h2, h3, h4');
要素は取得できているはずです。(対象が存在しない場合も含めて)
alert( matches.length )
などとすれば、取得要素数が表示されるはずです。
>var matches = document.getElementById( "entry-content" ).innerHTML.querySelectorAll('h2, h3, h4');
innderHTMLの結果は、基本的に文字列になりますので、これに対してはquerySelectorAllメソッドは存在しないためエラーになるはずと思います。
エラーが発生してはいませんか??
回答ありがとうございます。
上記のMDNの解説の通り
let el = document.querySelector('#entry-content');
console.log(el);
let matches = el.querySelectorAll('h2, h3, h4');
console.log(matches);
console.log(matches.length);
と やってみると
console.log(el);
は、ちゃんと取れているようですが
console.log(matches.length);
は、0になります。
let el = document.querySelector('#entry-content');
console.log(el);
let matches = el.querySelectorAll('div');
console.log(matches);
console.log(matches.length);
と やっても
console.log(el);
は、ちゃんと取れているようですが
console.log(matches.length);
は、0になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS html/cssで要素が出てこなくて困ってます 1 2022/12/31 16:59
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- HTML・CSS cssが効かなくて困ってます 1 2023/01/01 23:57
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- HTML・CSS 書籍を見つつサイト造りの練習をしているのですが、見た目が一致しません 2 2022/11/28 15:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<a>タグのテキストを取得
-
ActiveXobjectが作成できない
-
innerHTML実行後のイベント
-
【Tabキー】特定の範囲内だけで...
-
テキストボックスがブランクの...
-
ブラウザに応じたJavaScriptの...
-
フレームでページ内検索機能
-
同じIDで定義した要素の配列を...
-
C#OpenCv V4にのエラーに関する...
-
GASでundefinedエラーが出ます
-
C#テキストボックスの文字を配...
-
window.openでタイトル名の指定
-
functionから別のfunctionを実...
-
クリッカブルマップのリンク部...
-
JAVAスクリプトで指定時間以降...
-
undefinedを表示させない方法は...
-
Vb.netのグローバル変数の宣言...
-
googleスプレッドシートのApps ...
-
シンプルなweb版スタンプラリー...
-
DOM要素を削除しても、イベント...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<a>タグのテキストを取得
-
任意の座標をクリックさせるには
-
ActiveXobjectが作成できない
-
innerHTML実行後のイベント
-
Click回数を数え、規定された回...
-
HTML:Tableタグに対し、JavaScr...
-
JavaScriptでオブジェクトを取...
-
onchangeイベントを使ってspan...
-
【Tabキー】特定の範囲内だけで...
-
モーダルダイアログウィンドウ...
-
重複しないくじの作り方がわか...
-
javascript 特定のタグのidの存...
-
配列の大括弧と丸括弧はどう違う?
-
javascriptであるボタンを押す...
-
「nullまたはオブジェクトでは...
-
div要素内の全input要素をdisable
-
onclickを使わずにイベント処理...
-
画像上のクリックした場所が分...
-
RadioButtonListの表示制御
-
javascriptで自動計算フォーム...
おすすめ情報
回答ありがとうございました。
Fetchはバッチリ使えるようになりました。
見出しタグから目次はquerySelectorAllでなく
都合上
正規表現で作ることにしました。