前提・実現したいこと
formでkeyupする度にajaxで要素を生成。
今回のタスクで何回か質問させていただいています。
ajaxを触るのは今回が初めてで四苦八苦している半年目のwebDesignerです。
suggest機能を作成しています。
suggestはul > liで作成しています。
ulは静的。
liはajaxで動的に生成しています。
liは5個まで生成されます。
発生している問題・エラーメッセージ
入力速度が早いと同じデータのliがulの中に表示される。 さらに早いとliが生成されない。
該当のソースコード
HTML
1<input type="text" class="profile-edit-add-tag-myself-search js-profile-edit-add-skill-tag-myself-search"> 2<ul class="profile-edit-suggest-list js-profile-edit-skill-suggest-list"></ul>
JavaScript
1 2 var $addMyTagSearch = $('.js-profile-edit-add-skill-tag-myself-search'); 3 var $suggestList = $('.js-profile-edit-skill-suggest-list'); 4 5 // form内でkeyupされた時 6 $addMyTagSearch.on('keyup', function (e) { 7 var inputCharacter = $(this).val(); 8 var inputCharacterLength = inputCharacter.length; 9 10 $suggestList.show(); 11 $('.profile-edit-suggest-list-item').remove(); 12 $.ajax({ 13 //省略 14 } 15 }) 16 .then( 17 function (data) { 18 19 for (var item in data) { 20 var dataName = data[item].name; 21 var dataCount = data[item].count; 22 var dynamicSuggestListItem = $('<li class="profile-edit-suggest-list-item js-profile-edit-suggest-list-item"></li>'); 23 24 $suggestList.append(dynamicSuggestListItem); 25 dynamicSuggestListItem.append('<p class="profile-edit-suggest-list-item-character">' + dataName + '</p>').append('<span class="profile-edit-suggest-list-item-registered">' + dataCount + '</span>'); 26 27 // 5つまで生成 28 $('.js-profile-edit-suggest-list-item:nth-child(n+6)').remove(); 29 } 30 }, 31 function () { 32 alert('通信に失敗しました。恐れ入りますが、再度操作をお願いいたします。'); 33 } 34 ); 35 })
試したこと
ajaxの回し方に着目してアプローチしました。
以下を組み合わせるなどして試行錯誤しました。
- for inが悪いと思って以下に書き換えた。
for of
$.each()
- ajaxが何回も繰り返されてしまうと思い以下を使用した。
setTimeout()
- setTimeout(function () {
for (var item in data) {
//省略
}
}
という感じで使用しました。
ここだとインデント効かないので少し見辛くなってます。
すみません。
補足情報(FW/ツールのバージョンなど)
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー