teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

質問内容を変更しました。ソースコードにもわかりやすいように説明を付け加えました。

2021/09/02 04:34

投稿

shotaro-Nakano
shotaro-Nakano

スコア0

title CHANGED
@@ -1,1 +1,1 @@
1
- メインスレッドで同期XMLHttpRequestは、エンドユーザーエクスペリエンスに悪影響与えるため、非推奨です。の警告が表示されます。解決法を教えてください!
1
+ 「Uncaught TypeError:nullプロパティ 'token'読み取れません」いうエラーが表示されます。
body CHANGED
@@ -1,12 +1,12 @@
1
1
  ### 発生している問題
2
- 下のような警告文が表示されます。解決方法を教えてください!
2
+ エラーが表示されます。解決方法を教えてください!
3
- ![イメージ説明](c4604520547a0531a8debeef60aa449e.png)
3
+ ![イメージ説明](d17cb1b66c308e004b6d0c2c07674a2c.png)
4
4
 
5
5
 
6
6
 
7
7
 
8
+
8
9
  ### 該当のソースコード
9
-
10
10
  <!DOCTYPE html>
11
11
  <html lang="ja">
12
12
  <head>
@@ -30,9 +30,18 @@
30
30
 
31
31
  var gTimer;
32
32
  function inputText(){
33
+ // =========================================================
34
+ // 入力の度に実行される
35
+ // 入力完了までタイマーで実行待ちする
36
+ // タイマーまでに次の入力があると、再度タイマー設定
37
+ // =========================================================
38
+ // --- サンプル用 メッセージ出力 -------------------
33
39
  var wObj = document.getElementById("endMsg");
34
40
  wObj.innerHTML = '入力中です';
35
41
  wObj.className = 'defStyle runStyle';
42
+ // =============================================
43
+ // 一定時間を待って入力完了と判断
44
+ // =============================================
36
45
  if(gTimer){clearTimeout(gTimer);}
37
46
  gTimer = setTimeout(inputEnd, 700);
38
47
  }
@@ -41,17 +50,31 @@
41
50
 
42
51
 
43
52
  function inputEnd(){
44
-
53
+ // =========================================================
54
+ // タイマー時間経過で入力完了と判断
55
+ // =========================================================
56
+ // サンプル用の処理です。入れ替えて利用ください
57
+ // 入力完了後のメッセージ入れ替え
45
58
  var wObj = document.getElementById("endMsg");
46
59
  wObj.innerHTML = '入力完了と判定しました<br>入力:'+document.getElementById("inText").value;
47
60
  wObj.className = 'defStyle endStyle';
48
-
61
+ // 現在の時刻をUNIX Time に変換して取得
62
+
49
63
  const now = new Date();
50
64
  const nowtime = now.getTime();
51
65
 
66
+ // 認証トークンを取得するための関数 [getToken] を定義
67
+ // http://docs.microsofttranslator.com/oauth-token.html
68
+
52
69
  const getToken = function() {
53
70
  const defer = $.Deferred();
54
71
 
72
+ // 現在時刻と、sessionStorageに保存されている時刻を比較
73
+ // sessionStorageに保存されているトークンが8分以内に発行されたものであれば、そのまままトークンを返す
74
+ // 8分以上経っている場合、もしくはトークンが存在しない場合、新規にトークンを取得。
75
+ // 取得したトークン、および取得時間をUNIX Time に変換したデータをJSON [datalist] に格納
76
+ // sessionStorage [tdata] にJSONを保存する
77
+
55
78
  const arr = JSON.parse(sessionStorage.getItem("tdata"));
56
79
 
57
80
  if (arr === null || arr.time + 1000 * 60 * 8 < nowtime) {
@@ -61,11 +84,11 @@
61
84
  headers: {
62
85
  'Content-Type': 'application/json',
63
86
  'Accept': 'application/jwt',
64
- 'Ocp-Apim-Subscription-Key': 'キー',
87
+ 'Ocp-Apim-Subscription-Key': 'キーを入力する',
65
88
  },
66
- async: false,
89
+ async: true,
67
90
  }).done(function(data) {
68
-
91
+
69
92
  const datalist = {
70
93
  time: nowtime,
71
94
  token: data,
@@ -73,12 +96,20 @@
73
96
  sessionStorage.setItem('tdata', JSON.stringify(datalist));
74
97
  });
75
98
  }
99
+
100
+ // sessionStorage に保存されたデータを変数 arr2 に格納
101
+ // JSONを文字列に変換後、トークンデータを引き出して翻訳用の関数にひきわたす
102
+
76
103
  const arr2 = JSON.parse(sessionStorage.getItem("tdata"));
77
104
  const token = arr2.token;
78
105
  defer.resolve(token);
79
106
  return defer.promise();
80
107
  };
81
108
 
109
+ // 関数 [getToken] 実行後、取得したトークンを 受け取る
110
+ // フォームから入力したデータとともに、 Microsoft Translator テキストAPIへ送信
111
+
112
+
82
113
  $.when(getToken()).done(function(token) {
83
114
  const key = 'Bearer ' + token;
84
115
  const text = $("#inText").val();
@@ -91,8 +122,11 @@
91
122
  'text': text,
92
123
  'to': 'en',
93
124
  },
94
- async: false,
125
+ async: true,
95
126
  })
127
+
128
+ // Translator テキスト APIを通じて取得したデータから、翻訳語が含まれるプロパティを取得
129
+ // replace関数でタグを除去し、翻訳データのみを抽出して表示する
96
130
 
97
131
  const data = response.responseText;
98
132
  const translation = data.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, '');