閲覧ありがとうございます。
下記の問題についてご教示いただきたく思います。
前提
- Canvas内で図形を作成すると、それに対応したテキストボックス3つとチェックボックスが1つをTable内に生成するJavaScriptを作成
- テキストボックスとチェックボックスはそれぞれInputタグで作成
- ソース内にEventListenerを8個作成済
発生している問題・実現したいこと
テキストボックスを連続で選択した際、カーソルの移動に2秒弱時間がかかっており、この遅延をなくしたいのですが、原因・対処法がわかりません。
例えば、1秒にテキストボックス1→テキストボックス2→テキストボックス3を順にクリックすると、
テキストボックス3をクリック後でもテキストボックス1にカーソルがあったまま2秒程動作が停止し、
その後テキストボックス3にカーソルが移動しています。
図形が3つ程度の時はカーソルの移動はスムーズですが、8つ程作ると上記の現象が起きます。
イベントリスナーを複数設置しているため、そこに原因があるのかとも思いましたが、原因が突き止められずにいます。
試したこと
- Tabキーでのカーソル移動は遅延なし(クリックでのカーソル移動時のみ遅延発生)
- Chromeでの実行時はカーソル移動に遅延なし
- Edgeの開発者ツールでパフォーマンスを確認すると、DOMイベント(click)で1.8秒かかっている
- DOMイベント内で以下のものが多く呼び出されており、Inputタグの数に比例して多くなる
getBoundingClientRect() scrollLeft scrollTop
補足情報(FW/ツールのバージョンなど)
Microsoft Edge 44.18362.449.0
Microsoft EdgeHTML 18.18363
ソースコード
HTML
1<table class="table1"> 2 <tr> 3 <td class="formTypeImage"> 4 <div class="canvasDiv"> 5 <canvas class="imageCanvas" id="imageCanvas"></canvas> 6 </div> 7 </td> 8 <td class="formTypeData"> 9 <table class="dataList" id="dataList"> 10 <thead class="dataListHead"></thead> 11 <tbody class="dataListBody"></tbody> 12 <!-- 表出力はJSにて実施 --> 13 </table> 14 </td> 15 </tr> 16</table>
JavaScript
1// drawFieldTableBody 2// テーブルボディの表示項目を描画 3 4function drawFieldTableBody(data, dispList) { 5 var tableBody = document.getElementById("dataList").tBodies.item(0); 6 for(let i = 0; i < data.length; i++){ 7 addTableRow(tableBody, data[i], dispList, i); 8 } 9} 10 11// addTableRow 12// テーブルに行を追加 13function addTableRow(table, rowData, dispList, num){ 14 var row = table.insertRow(-1); 15 row.id = OBJ_NAME + num; 16 17 for(let i = 0; i < dispList.length; i++){ 18 var cell = row.insertCell(-1); 19 cell.className = dispList[i].className; 20 cell.innerHTML = getHTML(dispList[i], rowData, num); 21 if(dispList[i]['formType'] == 'checkbox'){ 22 var checkbox_id = dispList[i]["name"] + "_" + num; 23 document.getElementById(checkbox_id).value = getCheckboxValue(checkbox_id); 24 } 25 } 26} 27 28// getHTML 29// HTMLを生成 30function getHTML(format, data, num){ 31 32 var html = ""; 33 html += "<"; 34 html += getFormTypeHTML(format["formType"]) + " "; 35 html += "class=" + format["className"].replace("ThTd", "") + " "; 36 if(format['formType'] == 'checkbox'){ 37 if(data['checkbox']==1){ 38 html += "checked" + " "; 39 } 40 html += "onchange=" + "setCheckboxValue(this)" + " "; 41 html += "name=" + format["name"] + "_" + num + " "; 42 } else { 43 html += "value='" + data[format["name"]] + "'" + " "; 44 html += "name=" + format["name"] + " "; 45 } 46 html += "id=" + format["name"] + "_" + num + " "; 47 if(format['title'] != ''){ 48 html += "title=" + format["title"] + " "; 49 } 50 html += "form='register'" + " "; 51 html += "maxlength=" + format["maxlength"] + " "; 52 html += "pattern=" + format["pattern"] + " "; 53 html += "autocomplete='off'" + " "; 54 html += ">"; 55 56 // formTypeがselectの場合はoptionの記述を追加 57 html += getSelectHTML(format, data); 58 59 return html; 60} 61 62// getFormTypeHTML 63// フォームのタイプごとのHTMLを生成 64function getFormTypeHTML(formType){ 65 var html = ""; 66 switch(formType){ 67 case "text": 68 html = "input type='text'"; 69 break; 70 case "checkbox": 71 html = "input type='checkbox'"; 72 break; 73 case "select": 74 html = "select"; 75 break; 76 } 77 return html; 78} 79 80// getSelectHTML 81// プルダウンのHTMLを生成 82function getSelectHTML(format, data){ 83 if(format["formType"] != "select"){ 84 return ""; 85 } 86 87 var fieldType = data["field_type"]; 88 89 var html = ""; 90 //活字数字のみ設定 91 if (fieldType == 0 || fieldType == 2) { 92 //change 93 html += "<option value='0' selected>OPTION1</option>"; 94 } else { 95 html += "<option value='0' >OPTION1</option>"; 96 } 97 98 //活字全般設定 99 if (fieldType == 1 || fieldType == 3) { 100 //change 101 html += "<option value='1' selected>OPTION2</option>"; 102 } else { 103 html += "<option value='1' >OPTION2</option>"; 104 } 105 html += "</select>"; 106 107 return html; 108} 109 110// イベントリスナー 111window.addEventListener('DOMContentLoaded', load, false); 112document.getElementById('btnDrwaingmode').addEventListener('click', changeMode, false); 113document.getElementById('btnDelete').addEventListener('click', deleteObj, false); 114document.getElementById('selectFormTypeImage').addEventListener('change', selectImage, false); 115document.addEventListener("keydown", keyDownFunc); 116document.addEventListener("keyup", keyUpFunc); 117window.addEventListener("wheel", windowMouseWheel, { passive: false }); 118window.addEventListener("resize", windowResizeFunc);
あなたの回答
tips
プレビュー