我很難為這個問題選擇一個標題,但我會盡力在下面解釋。我制作了這個檢查器,它可以一一檢查輸入的單詞,如果單詞輸入正確,它會將顏色更改為綠色。它通過將輸入拆分為單獨的單詞并將其放入數組中來實現。但我看到的是,如果我將輸入單詞與文本中的重復單詞進行比較,它不會改變顏色。為什么會這樣呢?我看到更改顏色的函數采用的是單詞在數組中的位置,而不是其值,然后簡單地添加 html 元素的顏色。let text = document.querySelector('.card-body').innerHTML;let splitText = text.split(' ');let userInput = document.querySelector('.form-control');userInput.addEventListener('input', acceptInput)let correctWords = [];let mistakes = 0;let words = [];function acceptInput() { userInput.onkeydown = function(e){ if(e.keyCode == 32){ words = userInput.value.split(' '); console.log(words); console.log(splitText); let position = words.length-1; compareWordsArrays(position); } }}function compareWordsArrays(position) { for(i = position; i < words.length; i++) { if(words[i] === splitText[i]) { console.log(`Correct word detected: ${words[i]}`); let wordIndex = words.indexOf(words[i]); changeColor(wordIndex); } else { console.log('Incorrect word;'); mistakes += 1; console.log(mistakes); } } }function changeColor(pos) { splitText[pos]="<font color=green>"+splitText[pos]+"</font>"; let c = splitText.join(' '); document.querySelector('.card-body').innerHTML = c;} <div class="card"> <div class="card-body">Random text that appears from some generator or some stuff. But it needs to have quite few text, actually. </div></div><input type="text" class="form-control">在我的示例中,您可以看到單詞“some”在句子中重復兩次,而第二個單詞“some”沒有被更改,盡管它不將第二個單詞算作錯誤,我也不希望我說得足夠清楚。
2 回答

肥皂起泡泡
TA貢獻1829條經驗 獲得超6個贊
只是改變
if(words[i] === splitText[i]) {
console.log(`Correct word detected: ${words[i]}`);
let wordIndex = words.indexOf(words[i]);
changeColor(wordIndex);
}
到
if(words[i] === splitText[i]) {
console.log(`Correct word detected: ${words[i]}`);
changeColor(i);
}
作為:
尋找您已經知道的索引是沒有意義的(
i
在這種情況下)indexOf 僅返回第一次出現的索引,因此您的腳本僅適用于第一次出現...

Helenr
TA貢獻1780條經驗 獲得超4個贊
indexOf()
將為您提供值出現的第一個索引。
因此,如果您的數組包含重復的單詞,您將找到第一次找到該單詞的索引,而不是重復單詞的索引。
.lastIndexOf()
幸運的是,數組也有這個方法。
換成筆就可以了let wordIndex = words.indexOf(words[i]);
。let wordIndex = words.lastIndexOf(words[i]);
- 2 回答
- 0 關注
- 170 瀏覽
添加回答
舉報
0/150
提交
取消