前提・実現したいこと
ajaxを使って追加した要素のhtmlcollectionをきちんとした配列に直したい。
発生している問題・エラーメッセージ
ajaxを使って追加した要素のhtmlcollectionを配列に直せない。なぜか空の配列になる。
javascript1の書き方をしても間違っていないと思っているのですができません。htmlcollectionは取得出来ているのでpromiseはしっかりと動いておりthenのチェーンも順番に処理できていると思うのですがArray.fromだけがうまくいきません。Array.fromも一応配列の形にはなっているので働いてるのでしょうが空の配列になります。
該当のソースコード
html
1<div id="ui">unn</div>
Array.fromをしたら空の配列になるjsコード↓
javascript1
1 function delayHello(){ 2 var d = new $.Deferred; 3 d.resolve(); 4 return d.promise(); 5 } 6 let promise=delayHello(); 7 promise.then(function(){ 8 $.ajax() 9 .done(function(){ 10 $('#ui').append('<div class="yur">こんんにちは</div>'); 11 }) 12 13 }).then(function(){ 14 console.log(document.getElementsByClassName('yur'));//htmlcollectionは取得出来ている。 15 console.log(Array.from(document.getElementsByClassName('yur')));//空の配列になる。 16 17 })
Array.fromをしてもなぜかきちんと配列に値が入っているjsのコード↓
javascript2
1 function ajaxWithAppendToBody(ajaxOptions){ 2 var deferred = new $.Deferred; 3 $.ajax(ajaxOptions).done(function(data){ 4 $('#ui').append('<div class="yur">こんにちは</div>)'); 5 deferred.resolve(data); // resolve()でdoneメソッドを呼び出す 6 }).fail(function(data){ 7 deferred.reject(data); // reject()でfailメソッドを呼び出す 8 }); 9 return deferred.promise(); // 戻り値はpromiseにする 10 } 11 12 13 ajaxWithAppendToBody({ 14 }).done(function(data){ 15 // 非同期処理が成功時の処理 16 console.log(document.getElementsByClassName('yur'));//htmlcollectionは取得出来ている。 17 console.log(Array.from(document.getElementsByClassName('yur')));//きちんと配列になっている。 18 19 }).fail(function(data){ 20 // 非同期処理が失敗時の処理 21 }); 22
試したこと
javscript2のコードの真似をしてjavascript1のコードでresolveの前で要素を追加してみました。
js
1function delayHello(){ 2 var d = new $.Deferred; 3 $.ajax() 4 .done(function(){ 5 $('#ui').append('<div class="yur">こんんにちは</div>');//resolveの前で要素を追加する 6 d.resolve(); 7 }) 8 9 return d.promise(); 10 } 11 let promise=delayHello(); 12 promise.then(function(){ 13 console.log(document.getElementsByClassName('yur'));//きちんとhtmlcollectionを取得出来ていた。 14 console.log(Array.from(document.getElementsByClassName('yur')));//配列の形になっていた 15 16 })
そしたらきちんとした配列の形で出力されました。resolveの前でするとうまくいくようです。なぜresolveの後だと成功しないのでしょうか。promiseは非同期処理の順番を指定するものだと考えているのでできればthenの中でajaxなどの非同期処理を書けるようになりたいのです。
補足情報(FW/ツールのバージョンなど)
xampp
jquery 3系
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/28 11:56
2021/06/28 12:20
2021/06/28 13:11