我使用的是纯 JavaScript,但我继续收到以 "is not a function" 结尾的错误。如何做到这一点,以便我可以检测单词并做出相应的回复?

I'm using pure JavaScript but I continue to get errors that end with "is not a function". How do make it so I can detect words and reply accordingly?

我想检测用户输入文本中的一个或多个特定单词并相应地回复。我计划添加更多的单词来检测,但现在我一直在使用它。 我的结果是 finalKey.contains 不是函数。

<html>
<div>
  <p1 id="iOut"></p1>
</div>
<div>
  <input id="uIn" value=""></input>
</div>
<button onclick="regis()">SUBMIT</button>

<script>
  var key = document.getElementById("uIn").value;
  var finalKey = key.toUpperCase();

  function regis() {
    if (finalKey.contains("Hi" || "H")) {
      document.getElementById("iOut").innerHTML = "HEY";

    } else if (finalKey.contains("Bye" || "Goodbye")) {
      document.getElementById("iOut").innerHTML = "Okay";

    } else {
      document.getElementById("iOut").innerHTML = " Try again";
    }
  }
</script>

</html>

没有包含这样的东西。是 .includesindexOf != -1

您的值收集也需要在函数内部

此外,您不能在一个语句中测试两个值,除非您将其翻转并使用数组:

["Hi","H"].indexOf(finalKey) !=-1 

["HI","H"].filter(text => finalKey.startsWith(text)).length > 0

如果您希望 finalkey 以任一开头 - 如果您想测试完整的输入,请使用 .includes

最后您将文本大写,因此比较大写文本

function regis() {
  var key = document.getElementById("uIn").value;
  var finalKey = key.toUpperCase();

  if (["HI","H"].filter(text => finalKey.includes(text)).length > 0) {
    document.getElementById("iOut").innerHTML = "HEY";
  } else 
    if (["BYE","GOODBYE"].filter(text => finalKey.includes(text)).length > 0) {
    document.getElementById("iOut").innerHTML = "Okay";
  } else // GOOD has to be AFTER GOODBYE to not catch it
    if (["GOOD","GREAT"].filter(text => finalKey.includes(text)).length > 0) {
    document.getElementById("iOut").innerHTML = "That's Good";
  } else {
    document.getElementById("iOut").innerHTML = " Try again";
  }
}
<div>
  <p1 id="iOut"></p1>
</div>
<div>
  <input id="uIn" value="" />
</div>
<button type="button" onclick="regis()">SUBMIT</button>

使用正则表达式和单词边界

注意我包裹在一个表格中,现在你也可以按回车键

const wordList = [
  { list: ["HI", "H"], answer: "HEY" },
  { list: ["BYE", "GOODBYE"], answer: "Okay" },
  { list: ["GOOD", "GREAT"], answer: "That's good" }
];

const defaultText = " Try again";

document.getElementById("inputForm").addEventListener("submit", e => {
  e.preventDefault()
  const input = document.getElementById("uIn").value.trim().toUpperCase();
  let result = wordList
    .filter(({ list, answer }) => list
      .filter(word => new RegExp("\b" + word + "\b").test(input))
      .length > 0);
      
  console.log(result)
  document.getElementById("iOut").innerHTML = result.length > 0 ? result[0].answer : defaultText;
})
<div>
  <p1 id="iOut"></p1>
</div>
<form id="inputForm">
  <div>
    <input id="uIn" value="" />
  </div>
  <button>SUBMIT</button>
</form>

您需要使用 .includes() 而不是 .contains()。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String

我建议您熟悉 Chrome 的开发人员工具。例如,打开浏览器输入"xyz".,你会看到各种可用的方法,而contains()不在列表中。

此外,正如@mplungjan 指出的,这里还有其他问题。

"Hi" || "H" 的计算结果为“嗨”。所以"HI"在这里完全被忽略了。

您可以改写 finalKey.includes("Hi") || finalKey.includes("H")),但是添加其他条件会变得很麻烦。

更好的方法是按照以下思路使用函数式编程:

const wordsToTest = ['FOO', 'BAR'];
if (wordsToTest.find(word => finalKey.includes(word))) {

我意识到我在之前的回答中犯了一个根本性的错误,所以我想出了另一个解决方案。使用这种方法,您不必进行多个 if/else 语句,而只需将新对象添加到数组中,我希望在查看它时它是非常不言自明的:)

<html>
<div>
  <p1 id="iOut"></p1>
</div>
<div>
  <input id="uIn" value=""></input>
</div>
<button onclick="regis()">SUBMIT</button>

<script>


  function regis() {

    let key = document.getElementById("uIn").value;
    let finalKey = key.toUpperCase();
    let match = false;

    // Words to test for 
    autoComplete = [
        { // Hey
            response: "hey",
            input: [
                'HI',
                'H',
            ]
        },
        { // Bye
            response: "Bye",
            input: [
                'BYE',
                'GOODBYE',
            ]
        }
    ]

    for (potentialMatch of autoComplete){
        for (input of potentialMatch.input){
            if (input === finalKey){
                document.getElementById("iOut").innerHTML = potentialMatch.response;
                match = true;
            }
        }
    }

    if (match === false)
        document.getElementById("iOut").innerHTML = " Try again";
    }
    
</script>

</html>