【问题标题】:How do I prevent multiple duplicate events from firing on a dynamic form?如何防止在动态表单上触发多个重复事件?
【发布时间】:2016-10-20 17:22:34
【问题描述】:

我有一个动态表单,可让您根据需要添加更多子记录。我正在使用茧红宝石。我使用以下代码自动保存表单:

  <script>

  $(document).on('turbolinks:load', function() {

    var $form = $('form.autosave');
    var saving = false;

    function autoSaveForm(actionPath) {
      var data = $form.serialize();
      console.log("POST: " + actionPath);
      var request = new XMLHttpRequest();
      request.open('POST', actionPath, true);
      request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
      request.send(data);
      request.onreadystatechange = function () {
        if(request.readyState === XMLHttpRequest.DONE && request.status === 200) {
          saving = false;
        }
      };
    }

    $form.on('blur', 'input', function() {
      if (saving) {
        return; // don't do the blur action
      }
      saving = true;
      var actionPath = $form.attr('action');
      autoSaveForm(actionPath);
    });

  });

  </script>

“模糊”事件被触发了两次。这是我的控制台输出:

POST: /user/profile VM1717:9 
POST: /user/profile VM1717:9 

我根据@samanime 的建议更新了我的代码,添加了一个布尔值以防止事件被触发 4 次。现在它只触发了两次。进步!

看来问题出在 turbolinks 以及我如何设置 JS。

【问题讨论】:

  • 我还发现您不应该将内联 JS 与 turbolinks 一起使用。这并不能解决问题,但使用此方法的其他任何人都应该知道这一点。

标签: javascript jquery ruby-on-rails turbolinks cocoon-gem


【解决方案1】:

添加一个布尔值以跟踪您当前是否正在保存,如果您正在保存,请不要再这样做。

var saving = false;
$form.on('blur', function () {
    if (saving) {
        return; // don't do the blur action
    }

    saving = true;
    // do saving stuff
});

然后你需要在保存完成后观看,然后将saving 设置回 false。

function autoSaveForm(actionPath) {
    // other stuff
    request.onreadystatechange = function () {
        if(request.readyState === XMLHttpRequest.DONE && request.status === 200) {
            saving = false;
        }
    };
}    

如果您愿意,您还可以更进一步,使用另一个布尔值(如 needsToSave),如果您在保存时尝试保存,则会将其标记为 true,然后立即开始保存最新的内容第一次保存已完成。

【讨论】:

  • 感谢这个想法!我现在正在实现它,但我收到一个错误:“未捕获的 ReferenceError:xhr 未定义”。我到底在哪里初始化 xhr?
  • 我刚刚意识到 xhr 是请求。你只是命名不同而已。
  • 你的灵魂部分起作用了。现在我得到了两个触发器:
  • POST: /user/profile VM1717:9 POST: /user/profile VM1717:9
  • @BagoCamembert 对xhr 的事情感到抱歉。我复制并粘贴了该行并忘记更改变量。我已经更新了代码。您可以添加到您的问题中以显示您当前的代码吗?
猜你喜欢
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多