質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Microsoft Edge

Microsoft Edgeは、マイクロソフト社が開発する新しいWebブラウザです。Windows 10から標準搭載されており、Internet Explorerとは違うレンダリングエンジンが採用されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

0回答

1749閲覧

クリックでテキストボックスのフォーカスを移動させる動作が重い(Edgeのみ)

pop0910

総合スコア10

Microsoft Edge

Microsoft Edgeは、マイクロソフト社が開発する新しいWebブラウザです。Windows 10から標準搭載されており、Internet Explorerとは違うレンダリングエンジンが採用されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2020/05/15 10:42

編集2020/05/18 07:05

閲覧ありがとうございます。
下記の問題についてご教示いただきたく思います。

前提

  • 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);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/05/15 10:47

ソースを厳選して載せてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問