function familiar(theWord) { let username = $("#username").text(); let word = $("#word_" + theWord).text(); let freq = $("#freq_" + theWord).text(); $.ajax({ type:"GET", url:"/" + username + "/" + word + "/familiar", success:function(response) { let new_freq = freq - 1; const allow_move = document.getElementById("move_dynamiclly").checked; if (allow_move) { if (new_freq <= 0) { removeWord(theWord); } else { renderWord({word: theWord, freq: new_freq}); } } else { if(new_freq <1) { $("#p_" + theWord).remove(); } else { $("#freq_" + theWord).text(new_freq); } } } }); } function unfamiliar(theWord) { let username = $("#username").text(); let word = $("#word_" + theWord).text(); let freq = $("#freq_" + theWord).text(); $.ajax({ type:"GET", url:"/" + username + "/" + word + "/unfamiliar", success:function(response) { let new_freq = parseInt(freq) + 1; const allow_move = document.getElementById("move_dynamiclly").checked; if (allow_move) { renderWord({word: theWord, freq: new_freq}); } else { $("#freq_" + theWord).text(new_freq); } } }); } function delete_word(theWord) { let username = $("#username").text(); let word = theWord.replace('&', '&'); $.ajax({ type:"GET", url:"/" + username + "/" + word + "/del", success:function(response) { const allow_move = document.getElementById("move_dynamiclly").checked; if (allow_move) { removeWord(theWord); } else { $("#p_" + theWord).remove(); } } }); } function read_word(theWord) { let to_speak = $("#word_" + theWord).text(); original_position = 0; current_position = 0; Reader.read(to_speak, inputSlider.value); } /* * interface Word { * word: string, * freq: number * } * */ /** * 传入一个词频HTML元素,将其解析为Word类型的对象 */ function parseWord(element) { const word = element .querySelector("a.btn.btn-light[role=button]") // 获取当前词频元素的词汇元素 .innerText // 获取词汇值; const freq = Number.parseInt(element.querySelector(`#freq_${word}`).innerText); // 获取词汇的数量 return { word, freq }; } /** * 使用模板将传入的单词转换为相应的HTML字符串 */ function wordTemplate(word) { // 这个模板应当与 templates/userpage_get.html 中的

...

保持一致 return `

${word.word} ( ${word.freq} ) 熟悉 不熟悉 删除 朗读

`; } /** * 删除某一词频元素 * 此处word为词频元素对应的单词 */ function removeWord(word) { // 根据词频信息删除元素 word = word.replace('&', '&'); const element_to_remove = document.getElementById(`p_${word}`); if (element_to_remove !== null) { element_to_remove.remove(); } page_reload(); } function renderWord(word) { const container = document.querySelector(".word-container"); // 删除原有元素 removeWord(word.word); // 插入新元素 let inserted = false; const new_element = elementFromString(wordTemplate(word)); for (const current of container.children) { const cur_word = parseWord(current); // 找到第一个词频比它小的元素,插入到这个元素前面 if (compareWord(cur_word, word) === -1) { container.insertBefore(new_element, current); inserted = true; break; } } // 当word就是词频最小的词时,把他补回去 if (!inserted) { container.appendChild(new_element); } // 让发生变化的元素抖动 new_element.classList.add("shaking"); // 移动到该元素 new_element.scrollIntoView({behavior: "smooth", block: "center", inline: "nearest"}); // 抖动完毕后删除抖动类 setTimeout(() => { new_element.classList.remove("shaking"); }, 1600); } /** * 从string中创建一个HTML元素并返回 */ function elementFromString(string) { const d = document.createElement('div'); d.innerHTML = string; return d.children.item(0); } /** * 对比两个单词: * 当first小于second时返回-1 * 当first等于second时返回0 * 当first大于second时返回1 */ function compareWord(first, second) { if (first.freq !== second.freq) { return first.freq < second.freq ? -1 : 1; } if (first.word !== second.word) { return first.word < second.word ? -1 : 1; } return 0; } //通过在单词本删除单词后加入刷新页面功能,可以使文本高亮实时取消 function page_reload(){ location.reload(); }