Home > Software engineering >  html & javascript enter button redirects to error page - otherwise duplicates text to chat (only whe
html & javascript enter button redirects to error page - otherwise duplicates text to chat (only whe

Time:01-29

Whenever I click on the enter button, it seems the page either shows me

Bad Request Did not attempt to load JSON data because the request Content-Type was not 'application/json'.

or rarely if enter is pressed it creates duplicates each chat by itself and adds it to the div

I have removed the key event of enter but for some odd reason the enter function still works, I presume this is due to bootstrap but im not too certain.

<!DOCTYPE html>
<html lang="en" style="height: 500px">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Bootstrap</title>
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" />
    <link href="https://getbootstrap.com/docs/5.3/assets/css/docs.css" rel="stylesheet" />
    <link href="https://fonts.googleapis.com/css?family=Lexend" rel="stylesheet" />
    <link rel="stylesheet" href="{{ url_for('static', filename='css/stylesheet.css') }}">
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
    <script src="https://cdn.tailwindcss.com"></script>
    <script src="https://www.unpkg.com/[email protected]"></script>
    <script src="https://releases.jquery.com/git/jquery-git.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/typeit/5.0.2/typeit.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  </head>
  <body>
    <nav >
      <!-- Navbar content -->
      <button type="button"  style="height:34px">click me</button>
      <p style="color:white; font-family: Lexend;font-size: 15px;font-weight: 400;text-align: center;">AI for a healthier you</p>
      <button type="button"  style="height:34px">click me</button>
    </nav>
    <br>
    <center>
      
        <div  style="background-color:white ;  border-radius: 20px;height:80%;-webkit-box-shadow: 10px 10px 79px -7px rgba(0,0,0,0.22);-moz-box-shadow: 10px 10px 79px -7px rgba(0,0,0,0.22);box-shadow: 10px 10px 79px -7px rgba(0,0,0,0.22);">
          <p style="color:black" id="hello"></p>
          <form method="post">
            <div >
              <input type="text"  placeholder="Type here...." aria-label="Recipient's username" aria-describedby="basic-addon2" name="userid" id="textinput">
              <div >
                <button  type="button" value="hello world" id="button">Submit</button>
          </form>
        </div>
        </div>
        </div>
      
    </center>
    <script>
      document.getElementById("button").addEventListener("click", insertText);
      // CREATES A DIV AND SENDS THE USERS TEXT
      function insertText() {
        let div = document.createElement("div");
        let usertext = document.getElementById('textinput').value;
        const usertext2 = 'Patient: '   usertext;
        let text = document.createTextNode(usertext2);
        div.appendChild(text);
        document.getElementById("hello").appendChild(div);
        /////////////// submit JSON TO APP
        var json_entry = usertext
        fetch('/dashboard', {
          method: 'POST',
          body: JSON.stringify({
            user_text: json_entry
          }),
          headers: {
            'Content-Type': 'application/json'
          }
        });
        let apiData;
        fetch('/dashboard/api').then((response) => response.json()).then((data) => {
          apiData = data;
          let div = document.createElement('div');
          let robot_reply = document.createTextNode(apiData);
          div.appendChild(robot_reply);
          document.getElementById("hello").appendChild(div);
        });
        ////// ENTER BUTTON ////
        ///////////////////////
        /////////////////////// allows the ability to hit the enter button 
        var input = document.getElementById("textinput");
        
      }
    </script>
    </div>
    </div>
  </body>
</html>

CodePudding user response:

When you hit enter, it triggers the submit event on the <form>, which will cause a page refresh. This is basically baked in browser functionality. Any enter keypress in a field inside a <form> tag, causes a form submission. If that form submission is not handled, it will attempt to POST the form to the current URL.

You need to attach everything to the submit event on the <form>, not the button click. And you also need to call e.preventDefault to prevent the browsers default form action handling.

Additionally, you need type="submit" on the button so the click on that button also submits the form.

Using form submit event is also better for accessibility. It means users can press enter in a field or click the button, and it will be handled.

<!DOCTYPE html>
<html lang="en" style="height: 500px">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Bootstrap</title>
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" />
    <link href="https://getbootstrap.com/docs/5.3/assets/css/docs.css" rel="stylesheet" />
    <link href="https://fonts.googleapis.com/css?family=Lexend" rel="stylesheet" />
    <link rel="stylesheet" href="{{ url_for('static', filename='css/stylesheet.css') }}">
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
    <script src="https://cdn.tailwindcss.com"></script>
    <script src="https://www.unpkg.com/[email protected]"></script>
    <script src="https://releases.jquery.com/git/jquery-git.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/typeit/5.0.2/typeit.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  </head>
  <body>
    <nav >
      <!-- Navbar content -->
      <button type="button"  style="height:34px">click me</button>
      <p style="color:white; font-family: Lexend;font-size: 15px;font-weight: 400;text-align: center;">AI for a healthier you</p>
      <button type="button"  style="height:34px">click me</button>
    </nav>
    <br>
    <center>
      
        <div  style="background-color:white ;  border-radius: 20px;height:80%;-webkit-box-shadow: 10px 10px 79px -7px rgba(0,0,0,0.22);-moz-box-shadow: 10px 10px 79px -7px rgba(0,0,0,0.22);box-shadow: 10px 10px 79px -7px rgba(0,0,0,0.22);">
          <p style="color:black" id="hello"></p>
          <form method="post" id="form">
            <div >
              <input type="text"  placeholder="Type here...." aria-label="Recipient's username" aria-describedby="basic-addon2" name="userid" id="textinput">
              <div >
                <button  type="submit" value="hello world" id="button">Submit</button>
          </form>
        </div>
        </div>
        </div>
      
    </center>
    <script>
      document.getElementById("form").addEventListener("submit", insertText);
      // CREATES A DIV AND SENDS THE USERS TEXT
      function insertText(e) {
        e.preventDefault();
        let div = document.createElement("div");
        let usertext = document.getElementById('textinput').value;
        const usertext2 = 'Patient: '   usertext;
        let text = document.createTextNode(usertext2);
        div.appendChild(text);
        document.getElementById("hello").appendChild(div);
        /////////////// submit JSON TO APP
        var json_entry = usertext
        fetch('/dashboard', {
          method: 'POST',
          body: JSON.stringify({
            user_text: json_entry
          }),
          headers: {
            'Content-Type': 'application/json'
          }
        });
        let apiData;
        fetch('/dashboard/api').then((response) => response.json()).then((data) => {
          apiData = data;
          let div = document.createElement('div');
          let robot_reply = document.createTextNode(apiData);
          div.appendChild(robot_reply);
          document.getElementById("hello").appendChild(div);
        });
        ////// ENTER BUTTON ////
        ///////////////////////
        /////////////////////// allows the ability to hit the enter button 
        var input = document.getElementById("textinput");
        
      }
    </script>
    </div>
    </div>
  </body>
</html>

  • Related