一切困难都能打倒我 2024-10-16 21:37 采纳率: 87.1%
浏览 5

fetch请求返回数据正确但是表单为空

fetch发送请求,返回正确,但是表单是空的

img


```html
<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>图书管理系统</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      margin: 20px;
    }
    table {
      width: 100%;
      border-collapse: collapse;
      margin-top: 20px;
    }
    th, td {
      padding: 10px;
      border: 1px solid #ccc;
      text-align: left;
    }
    .button {
      padding: 5px 10px;
      cursor: pointer;
    }
  </style>

  <%-- <script src="js/jquery.min.js"></script>--%>
  <%-- 使用 CDN 引入 jQuery 库,以便在后续的 JavaScript 中使用--%>
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

</head>
<body>

<h1>图书管理系统</h1>

<div>
  <%--通过 label 标签进行标识--%>
  <%--for 属性用于将 <label> 标签与某个表单控件它的值应该与表单控件的 id 属性值相匹配
  当用户点击标签文字(在本例中是“图书名称”)时,浏览器会自动将焦点转到与 for="name" 关联的输入框,
  即 <input id="name">。这种行为对于提高表单可用性和用户体验非常有用。
  <label for="name">图书名称:</label>
 --%>
  <label for="name">图书名称:</label>
  <input type="text" id="name">
  <label for="author">作者:</label>
  <input type="text" id="author">
  <label for="publisher">出版社:</label>
  <input type="text" id="publisher">
  <button onclick="searchBooks()">查询</button>
</div>

<%--表格用于展示查询结果,包含表头(<thead>)和表体(<tbody>)。--%>
<table id="bookTable">
  <thead>
  <tr>
    <th>图书名称</th>
    <th>作者</th>
    <th>出版社</th>
    <th>操作</th>
  </tr>
  </thead>
  <tbody>
  <!-- 查询结果将插入在这里,Script中 -->
  </tbody>
</table>

<script>
  // 页面加载时获取所有书籍
  //事件处理器,当整个页面(包括所有图像、脚本和样式)完全加载后,onload事件就会触发。
  window.onload = function() {
    getAllBooks();
  };

  // 编写获取所有书籍的方法
  function getAllBooks() {
    fetch('http://localhost:8080/springMVCdemo03_war_exploded/getAll') // 请求所有书籍的接口,fetch 是一个现代 JavaScript API,用于进行网络请求
            .then(response => {
              if (!response.ok) {
                throw new Error('Network response was not ok: ' + response.statusText);
              }
              return response.json(); // 解析 JSON 响应
            })
            .then(data => {
              //验证
              console.log("Data received:", data);

              const tableBody = document.getElementById("bookTable").querySelector("tbody");
              tableBody.innerHTML = ""; // 清空现有数据

              // 遍历每一本书,创建新的表格行 <tr>
              data.forEach(book => {

                const row = document.createElement("tr");
                row.innerHTML = `
                        <td>${book.name}</td>
                        <td>${book.author}</td>
                        <td>${book.publisher}</td>
                        <td>
                            <button class="button" onclick="toggleBorrow(${JSON.stringify(book)}, this)">${book.isborrowed ? '归还' : '借阅'}</button>
                        </td>
                    `;
                tableBody.appendChild(row);
              });
            })

            .catch(error => console.error('Error:', error));
  }


  //通过 fetch向服务器发送 POST 请求以搜索书籍
  function searchBooks() {
    const name = document.getElementById("name").value;
    const author = document.getElementById("author").value;
    const publisher = document.getElementById("publisher").value;

    // 构建请求体,封装为一个 JavaScript 对象
    const requestBody = {
      name: name,
      author: author,
      publisher: publisher
    };

    fetch('http://localhost:8080/springMVCdemo03_war_exploded/search', {
      method: 'POST', // 设置请求方法为 POST
      headers: {
        'Content-Type': 'application/json;charset=utf-8' // 指定请求体格式为 JSON
      },
      body: JSON.stringify(requestBody) // 将请求体转换为 JSON 字符串
    })
            //then 方法用于处理服务器的响应。首先检查响应的状态是否正常(response.ok 为 true),
            //如果不正常则抛出一个错误。
            //return response.json(); 将响应体解析为 JSON 格式。
            .then(response => {
              if (!response.ok) { // 检查响应状态是否正常
                throw new Error('Network response was not ok: ' + response.statusText);
              }
              return response.json(); // 解析 JSON 响应
            })
            //这个部分是一个占位符,表示可以在此处处理从服务器获取的数据。可以根据具体需求对数据进行操作

           /* .then(data => {
              // 处理返回的数据
            })*/
            //使用 catch 方法捕获并处理任何可能发生的错误,并在控制台输出错误信息
            .catch(error => {
              console.error('Error:', error); // 捕获并输出错误
            })

            //处理服务器返回的数据。首先获取到表格的 tbody 元素并清空现有内容,以便插入新的书籍信息
            .then(data => {
              const tableBody = document.getElementById("bookTable").querySelector("tbody");
              tableBody.innerHTML = ""; // 清空现有数据

              //遍历每一本书,创建新的表格行 <tr>,并填充书名、作者和出版社
              //该按钮的文本取决于书籍是否被借出(通过 book.borrowed 来判断)。
              // 按钮点击时会调用 toggleBorrow 函数,传递书名和当前按钮对象。
              //
              data.forEach(book => {
                const row = document.createElement("tr");
                row.innerHTML = `
                <td>${book.name}</td>
                <td>${book.author}</td>
                <td>${book.publisher}</td>
                <td>
                    <button class="button" onclick="toggleBorrow(${JSON.stringify(book)}, this)">${book.isborrowed ? '归还' : '借阅'}</button>
                </td>
            `;
                tableBody.appendChild(row);
              });
            })
            //处理错误
            .catch(error => console.error('Error:', error));
  }

  //name 表示书籍的名称,button 是用户点击的按钮元素的引用
  //fetch 函数向 /change 路径发送一个 POST 请求
  function toggleBorrow(book, button) {
    fetch('http://localhost:8080/springMVCdemo03_war_exploded/change', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json;charset=utf-8'
      },
      //将一个对象 { name: name } 转换为 JSON 字符串并作为请求体发送。
      body: JSON.stringify(book)
    })
            .then(response => response.json())
            //再次使用 then 方法来处理从服务器返回的数据,isBorrowed 表示书籍当前的借阅状态。
            //根据 isBorrowed 的值更新按钮的文本:
            .then(isBorrowed => {
              button.innerText = isBorrowed ? '归还' : '借阅'; // 更新按钮文本
            })
            .catch(error => console.error('Error:', error));
  }
</script>

</body>
</html>

```

  • 写回答

1条回答 默认 最新

  • 无疆76 2024-10-16 21:38
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据您提供的信息和代码,问题可能出在以下几个方面:

    1. 数据格式问题:确保服务器返回的书籍数据格式正确,即每个书籍对象必须包含nameauthorpublisher属性。另外,请检查返回的书籍数组长度是否与您期望的一致。

    2. 表格渲染问题:在JavaScript代码中,您使用document.getElementById("bookTable").querySelector("tbody")来获取表格的tbody元素。请确保页面上存在ID为bookTable的表格元素,并且您的脚本代码在表格元素加载之后执行(例如,将脚本放在</body>标签之前)。

    3. fetch请求问题:请检查您的fetch请求是否正确发送到服务器,并且服务器是否正确处理了请求并返回了正确的响应。您可以在浏览器的开发者工具中查看网络请求和响应的详细信息。

    4. 浏览器控制台中的错误:请查看浏览器控制台中是否有任何错误消息。这些错误消息可能有助于诊断问题所在。

    根据您提供的代码和描述,这里有一些可能的解决方案和建议:

    1. 确保服务器返回的书籍数据格式正确,并且控制台中的数据显示没有问题。
    2. 确保表格元素在脚本代码执行之前已经加载完成。您可以将脚本移动到</body>标签之前,或者将页面加载事件监听器(如window.onload)用于确保在脚本执行之前页面已经完全加载。
    3. 检查fetch请求是否正确发送,并且服务器是否返回了正确的响应。您可以在浏览器的开发者工具中查看网络请求的详细信息,并确保请求的URL、方法和头部信息正确无误。
    4. 检查浏览器控制台中的错误消息,并根据错误信息进行调试。

    如果您仍然遇到问题,请提供更多关于服务器返回数据的详细信息,以及任何在浏览器控制台中出现的错误消息。这将有助于更准确地定位问题所在。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月16日

悬赏问题

  • ¥15 报酬10000,做一个简单的换汇网站
  • ¥15 关于#vue.js#的问题:word excel和ppt预览问题语言-javascript)
  • ¥15 Apache显示系统错误3该如何解决?
  • ¥30 uniapp小程序苹果手机加载gif图片不显示动效?
  • ¥20 js怎么实现跨域问题
  • ¥15 C++dll二次开发,C#调用
  • ¥15 请教,如何使用C#加载本地摄像头进行逐帧推流
  • ¥15 Python easyocr无法顺利执行,如何解决?
  • ¥15 为什么会突然npm err!啊
  • ¥15 java服务连接es读取列表数据,服务连接本地es获取数据时的速度很快,但是换成远端的es就会非常慢,这是为什么呢