【问题标题】:Is this the right way to use Ajax?这是使用 Ajax 的正确方法吗?
【发布时间】:2018-12-31 04:02:42
【问题描述】:

所以我正在开发一个待办事项应用程序,并在单击任务以标记为已完成时使用 Ajax 将数据发送到 PHP。然后 PHP 向 MySQL 发送一个 SQL 查询,并将完成列中的值从 1 更改为 0 或 Visa vera。最初,我尝试发送一个 PHP 标头以返回该页面,但它没有工作,所以在发送请求后我编写了一些 JavaScript 代码来刷新页面,任务现在被标记为已完成,我有一个 css 样式为了那个原因。我想知道,我认为 Ajax 的目的是不必重新加载整个页面,所以如果我使用错误的 Ajax 并且有更好的方法来做到这一点?该项目有效,但我想我只想对我的代码进行一些反馈。

main.js:

for(i=0; i < div.length; i++){
    div[i].addEventListener("click", function(e){ 
        let xhr = new XMLHttpRequest();

        xhr.open('POST', 'process_complete.php', true);
        xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
        let task_num = e.target.getAttribute("id");
        xhr.onreadystatechange = function(){
            if(xhr.readyState === 4 && xhr.status === 200){
                location.reload(); 
            }
        }
        xhr.send(JSON.stringify(task_num));
    });
}

process_complete.php:

if(isset($_SERVER['HTTP_X_REQUESTED_WITH'])){

    $data = file_get_contents('php://input');
    $id = json_decode($data);


    $sql = mysqli_query($conn, "SELECT * FROM tasks WHERE Num = '$id'"); 

    if($sql === false){
        printf("error: %s\n", mysqli_error($conn));
    }

    while($row = mysqli_fetch_row($sql)){
        if($row[3] === "1") {
            $mysqli_update = mysqli_query($conn, "UPDATE tasks SET Completed = 0 WHERE Num = '$id';");
        } else {
            $mysqli_update = mysqli_query($conn, "UPDATE tasks SET Completed = 1 WHERE Num = '$id';");
        }
    }
}

【问题讨论】:

标签: javascript php ajax


【解决方案1】:

因此,您可能缺少第三步。您已经传递了数据并将其提取到 PHP 页面中,但是您需要将其传递回来。为此,您首先在 PHP 页面中放置一个echo,它的工作方式与 PHP 中的函数 return 的工作方式非常相似。完成此操作后,您需要确保 AJAX 接收该返回值,然后确保您有一个包含此 AJAX 并使用该值替换、附加或删除 AJAX 正在使用的任何内容的函数。如果您使用 JQUERY 框架中的 .post() 之类的 AJAX 扩展,这会容易得多。

【讨论】:

  • 在 index.php 页面中,任务被输出到页面并且 css 类是动态的,基于数据库中表的 Completed col 中的任何值。当用户单击以将其标记为已完成时,我使用 ajax 将该数据发送到 php 并在 db 中更新它,然后查看结果的唯一方法是刷新页面 bc PHP 在 Js 之前运行。它有效,我只是不知道这是否是正确的方法。当用户点击完成按钮并且页面硬刷新时,它看起来有点难看。
  • 如果您将它传递给获取结果的 PHP 页面,然后将结果集作为数组(甚至是 assoc 数组)回显,那么您将能够使用 javascript 函数动态更改内容,只要您的 ajax 在该函数中的更改命令之前运行。找到了如何做到这一点的答案here
【解决方案2】:

我认为 Ajax 的目的是不必重新加载整个页面

是的。

您应该编写 JavaScript 来修改当前页面的 DOM 在您拥有 location.reload() 的位置。

【讨论】:

  • 是的,但我正在向 PHP 发送数据。 PHP 根据 col Completed 中的任何值将数据库中的数据输出到 index.php 是否已完成。如果我删除 reload();然后数据库获得更新的值,除非重新加载页面,否则用户不会看到更改。所以这就是我感到困惑的地方。
  • "PHP 将数据从数据库输出到 index.php" — 这无关紧要,因为 (a) 您正在请求的是 process_complete.php,并且 (b) 您正在使用 JS 处理响应,而不是将其作为页面加载到浏览器窗口中。您过去曾请求过index.php。如果您现在请求,Ajax 不会使浏览器及时返回并更新页面以显示index.php 将输出的内容。您必须自己进行更改。
  • 所以当我使用 Ajax 时,我正在请求一个页面......我从来没有这样想过。所以我不应该有一个像 process_complete.php 这样的第三页,它位于 index.php 和 config.php 的中间。但是,如果我用 ajax 请求 index.php 而不是 process_complete.php 它仍然会重新加载页面吗?
  • "ajax 它仍然会重新加载页面正确" — 错误。响应将提供给 JS。由您自己编写 JS 来进行 DOM 更改。
  • “所以我不应该有像 process_complete.php 这样的第三页”——错了。做简单事情的小型网络服务器是 Ajax 的基础。您不想使用 JavaScript 获取整个 HTML 文档。
猜你喜欢
  • 2012-05-11
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2017-02-01
相关资源
最近更新 更多