【问题标题】:Unwanted repeats of ajax/jquery POST requestajax/jquery POST 请求的不必要重复
【发布时间】:2021-12-28 15:43:53
【问题描述】:

我遇到了一个问题,由于我无法理解的原因,我的发帖请求被重复。我正在使用 jQuery POST 请求将表单提交到 php 脚本以将其插入 SQL 数据库。

它只在某些情况下发生,而且并非始终如一。 9/10 次按预期工作,但有时 ajax 调用重复 2 或 3 次。

enter image description here

重复代码块:

函数 submitLog(){

let log = document.getElementById('logContent').value;
let project = document.getElementById('logger_active_project').innerHTML;
let category = document.getElementById('categorySelect').value;
let projectID = document.getElementById('logger_active_project_id').value;
let submit = document.getElementById('submit');
submit.disabled = true;

console.log('starting ajax post request');

$.post('./includes/logger/scripts/add_log.php', {
    log:log,
    project:project,
    category:category,
    project_id:projectID

}, function(data, status){
    document.getElementById('logContent').value= "";
    submit.disabled = false;
    console.log('ajax callback fired.' + data);
    
})

} 编辑:

似乎只有在与以下功能一起使用时才会发生:

函数 submitLogByEntering(){ let log = document.getElementById('logContent');

log.addEventListener("keyup", function(event) {
    // Number 13 is the "Enter" key on the keyboard
    if (event.keyCode === 13) {
      // Cancel the default action, if needed
      event.preventDefault();
      submitLog();
    }
  });
}

当使用按钮复制问题时,我无法让它重复。

提前非常感谢您提供的任何提示,让我找到正确的方向来解决这个热点问题!

【问题讨论】:

  • 嗨,你确定它被烧了 2-3 次吗?有时浏览器控制台不是你最好的朋友。如果你尝试了 10 次,你看到 1 次重复了 3 次,那么数据库中是否有 12 个添加的对象而不是 10 个?如果没有,那么你的脚本是可以的,如果有 12 个,那么请提供更多关于你的代码的信息。
  • 它确实会触发多次。 DB 显示相同的帖子,只是增加了一个 ID。

标签: javascript php jquery


【解决方案1】:

这很可能取决于submitLog() 的侦听器。

检查您没有使用会触发多重触发的侦听器。

如果检查太多,只需在submitLog() 之外设置一个测试变量,请将其设置为 true 并测试是否为 true,然后触发 ajax。然后在您的发布请求后将其设置为 false 。这将阻止重复的按钮按下等发生或侦听器中发生任何有趣的事情。

如果您需要重新触发函数,请在变量上设置超时(或在 ajax 完成后设置)以将其重置为 true。

示例:

    var test = true;
    
    function submitLog() {
    
        if (test) {
    
            let log = document.getElementById('logContent').value;
            let project = document.getElementById('logger_active_project').innerHTML;
            let category = document.getElementById('categorySelect').value;
            let projectID = document.getElementById('logger_active_project_id').value;
            let submit = document.getElementById('submit');
            submit.disabled = true;
    
            console.log('starting ajax post request');
    
            $.post('./includes/logger/scripts/add_log.php', {
                log: log,
                project: project,
                category: category,
                project_id: projectID
    
            }, function (data, status) {
                document.getElementById('logContent').value = "";
                submit.disabled = false;
                console.log('ajax callback fired.' + data);
    
            });
    
            test = false;
            setTimeout(function () {
                test = true;
            }, 5000);
        }
    } 

【讨论】:

  • 您好 Wakka,感谢您的建议。我已经编辑了主要帖子以包含处理事件侦听器和(似乎)导致问题的函数。有关如何解决它的任何建议?
  • 啊,您正在使用 keyup,关键侦听器的问题是,如果按键被按住以及其他方式(操作系统和其他因素在这里有影响),它们会重复。如果您在按键侦听器上为输入键 aka 13 设置了一个 console.log,您可能会看到它多次触发。这真的很常见。你将不得不像我说的那样走可变路线。这是否定这个问题的常用方法。
  • 所以我必须创建一个为 true 的变量,允许函数触发,按下按钮后它变为 false,然后例如使用 setInterval() 将其转回 true 以允许它再次开火?不完全确定我完全了解如何实施您的解决方案。非常感谢到目前为止的指导!
  • @dkvdev 我会用它更新我的答案
  • 你的英雄!一会儿就解决这个问题!
猜你喜欢
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 2014-06-29
  • 2018-11-11
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多