実現したいこと
非同期通信で表示するコンテンツの順番を指定して、画像アイコン→名前の順番で表示したい。
発生している問題・分からないこと
画像アイコンの先に名前のコード後に書いても名前が先に表示されてしまう。
divNamaePartialParts.appendChild(usericonImg); divNamaePartialParts.appendChild(child); // div (子要素) の末尾に child を追加
該当のソースコード
Javascript
1<script> 2 //非同期通信 3 fetch("<?php echo home_url('wp-admin/admin-ajax.php'); ?>", opt) 4 .then(response => { 5 //ボタンを使用可にしています「非同期通信が完了して応答があった時」の処理です。 6 submit_button.disabled = false; 7 //ボタンのクラスからwaitを削除しています(もとのボタンに戻ります) 8 submit_button.classList.remove('wait'); 9 return response.json(); 10 }) 11 .then(json => { 12 if (json.error != "") { 13 alert(json.error); 14 return; 15 } 16 namae_value = json.namae; 17 // 空文字を入れることで要素内を空にできる 18 confirm_area.textContent = ''; 19 var div; 20 var child; 21 22 const divNamaePartialParts = document.createElement("div"); // div (子)を生成 23 divNamaePartialParts.classList.add("namae-partial-parts"); // classの追加 24 child = document.createElement("p"); // p (孫)を生成 25 child.appendChild(document.createTextNode(namae_value)); //孫要素として Text ノードを生成 26 divNamaePartialParts.appendChild(child); // div (子要素) の末尾に child を追加 27 divNamaePartialParts.appendChild(usericonImg); 28 confirm_area.appendChild(divNamaePartialParts); // confirm_area (親要素) の末尾に div を追加 29 30 child = document.createElement("button"); // button (孫)を生成 31 child.type = "button"; 32 child.innerText = "入力画面へ戻る"; 33 child.addEventListener("click", () => { 34 input_area.style.display = "block"; 35 // 空文字を入れることで要素内を空にできる 36 confirm_area.textContent = ''; 37 confirm_area.style.display = "none"; 38 }); 39 divPostButton.appendChild(child); // div (子要素) の末尾に child を追加 40 child = document.createElement("button"); // button (孫)を生成 41 child.type = "button"; 42 //name属性の追加・変更 43 child.setAttribute("name", "output"); 44 child.innerText = "結果画面へ進む"; 45 child.addEventListener("click", confirm_button_click); 46 divPostButton.appendChild(child); // div (子要素) の末尾に child を追加 47 confirm_area.appendChild(divPostButton); // confirm_area (親要素) の末尾に div を追加 48 input_area.style.display = "none"; 49 confirm_area.style.display = "block"; 50 }) 51 .catch(error => { 52 console.log(error); 53 }); 54</script>
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
指定要素のあとにノードを追加するコードを書いてみたのですが、変化がありませんでした。
divNamaePartialParts.insertBefore(usericonImg, divNamaePartialParts);
補足
※参考サイト
https://so-zou.jp/web-app/tech/programming/javascript/dom/node/
コードが一部だけ提示されており、よくわからないこともありますが、
「該当のソースコード」に挙げられているコードで「名前」と「画像アイコン」にあたるものを追加する箇所だけ取り出してみると、
...
divNamaePartialParts.appendChild(child); // div (子要素) の末尾に child を追加
...
divNamaePartialParts.appendChild(usericonImg);
このような順番になっていますから、「名前」のほうが先に表示されるのは自然だと思います。
現状の提示内容だとAjaxほぼ関係ないような。
一部すぎるので手元で再現できません。
見ている人がコピペで再現できる程度に提示してください。
「名前」と「アイコン」がそれぞれ非同期に別々にやってくる(ので処理順序が保証されない)、という話であれば、プレースホルダなどを使って場所を指定する方が確実かと思います。
回答ありがとうございます。コードが長すぎるため載せられずgithubに書きました。
bbs_quest_input.phpになります。
https://wandbox.org/permlink/LSzFhTeP8vBGykXW
何行目ですか?
>>Lhankor_Mhyさん
回答ありがとうございます。
454行目になります。
この454行目と453行目を入れ替えてもダメだった、ということですよね?
>>Lhankor_Mhyさん
回答ありがとうございます、そうですね入れ替えてもダメでした。
ご提示のコードで入れ替えて試してみましたが、問題なく位置が入れ替わりました。
ですので、ご提示いただいていない部分に原因があると思われます。
・コードやリンクはこのコメント欄に書くのではなく、質問文を編集して質問の一部として掲載してください。
・問題の現象を起こす最小限のコードのみを掲載してください。今回の場合であればPHPで書かれたコードは必要なく、その中で出力されるHTMLテキストのさらに一部のjavascriptのコードがあれば現象を再現できるはずです。そしてそうすればコードを質問文中に掲載することはできます。
・ついでですが、Wandboxのことは「GitHub」と呼びません。用語は正確に使うようお願いします。
以上の点は対応していただければ特にコメント欄での返答は不要です。次に、もう一つ質問を投稿します。
> 画像アイコンを初めに表示して名前を次に表示したい。
この「初め」「次」というのは、次のどちらのことを言っていますか。
A. 画面上の位置。どちらかがもう一方より上に表示される。
B. 時間的な順番。どちらが先に見えるようになり、その後にもう一方のものも見えるようになる。
これまでに回答やコメントをしている人は(私を含め)いずれもA.だと解釈しているようですが、提示されたコードを見る限り、画面上の位置を入れ替えられないというような現象が起こるとは考えにくいです。
B. の解釈ならば質問者さんの言っているようなことは起こり得ます。
>>ikedasさん
回答ありがとうございます、Bの時間的な順番になります。必ず画像アイコンが先に名前が後に表示されます。
ん? 逆では。
とにかく、
> Bの時間的な順番になります。
そのことが質問文を読んだ人にわかるように、質問文に説明を書き足してください。
>>Lhankor_Mhyさん
原因となるコードを特定できない為、プレースフォルダを使いたいと考えているのですが、同階層のものに対して順番を指定するにはどうすれば良いのでしょうか?
Promise というのが出てきたのですが、非同期通信で使うもののようで、同階層の順番を指定するコードに使えるか分かりませんでした。
※参考サイト
https://qiita.com/terufumi1122/items/4cfcaa92e9a96058220c
質問を編集して、回答を待たれてはどうですか。少なくとも今のコードをちょっと手直ししただけでは実現できないことです。
あと「プレースフォルダ」ではなく「プレースホルダ」(placeholder) です。
>>ikedasさん
回答ありがとうございます、質問を修正いたしました。
> 原因となるコードを特定できない為、プレースフォルダを使いたいと考えているのですが、同階層のものに対して順番を指定するにはどうすれば良いのでしょうか?
時間的な順番の話であれば、プレースホルダは意味がありませんので忘れてください。
アイコン画像は URL.createObjectURL ですでに生成されているもののようなので、通信オーバーヘッドが起きないためそれほど大きな時間差がでるとは考えにくいです。具体的には何秒程度の時間差が出ていますか?また、それをどのようにして計測しましたか?目視ですか?
>>Lhankor_Mhyさん
回答ありがとうございます、時間差ではなくCSSの問題でした申し訳ありません…
マルチポストとなっているのでgoo質問は削除いたします。
ご解決ということでいいでしょうか?
> 時間差ではなくCSSの問題でした
そのCSSを提示してください。
@homepage-site さん
> マルチポストとなっているのでgoo質問は削除いたします。
回答が付いている質問は削除できません。
https://teratail.com/help/delete-policy
>>Lhankor_Mhyさん
回答ありがとうございます、解決いたしました。
>>ikedasさん
回答ありがとうございます、float: left;を削除したところ画像アイコン→名前で表示することが出来ました。
.board_form_partial
div#confirm_area
.namae-partial-parts p {
font-size: 200%;
font-weight: 700;
letter-spacing: .1em;
/* float: left; */
margin: 0 0 10px;
overflow: hidden;
text-align: left;
}
>>think49さん
回答ありがとうございます、以後気を付けるように致します。
@homepage-site さん
teratailではマルチポストは非推奨ですが、禁止されていません。
投稿したQ&Aサイトのルールを守ってマルチポストしてください。
https://teratail.com/help#posted-otherservice
マルチポスト発覚後に投稿を削除したり、一つのサイトで解決して他のマルチポスト先の回答を放置したりするのが嫌われます。
マナーを守る上でStackoverflpwの回答が参考になると思います。
https://ja.meta.stackoverflow.com/questions/2418/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B
自分で解決できたのでしたら、どうやって解決したかを自分で回答として投稿して、質問を解決済みにしておいてください。こちらの説明を見てください。
https://teratail.com/help#resolve-myself
>>think49さん
回答ありがとうございます、読ませていただきました。
今回の場合は回答してくださる方が沢山おられたためマルチポストは避けるべきでした、申し訳ありません。
※引用
質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。
>>ikedasさん
回答ありがとうございます、読ませていただきました。
自己解決として終了させます。
回答2件
あなたの回答
tips
プレビュー