【问题标题】:Trigger Event based on Form Input Length根据表单输入长度触发事件
【发布时间】:2015-10-22 16:11:16
【问题描述】:

每当表单长度发生变化时,我都会尝试自动保存表单。 下面是我的代码。初始表单长度被正确记录,变量$("form input").length在我玩表单时会发生变化,但if语句中的块没有被触发。

有人知道这是为什么吗?

var formLength = $("form input").length;
console.log("the current formLength is" + formLength);

$(document).ready(function() {
  if ($("form input").length > formLength) {
    setTimeout(autoSaveForm, 10000);

    formLength = $("form input").length;

    console.log("the updated formLength is" + formLength);
  }
});

更新:Florian 完美地解决了这个问题。我有一个新问题的更新。我拥有的表单是在 Rails 中使用 Cocoon gem 的嵌套表单。每当在嵌套中添加一个孩子时,就会加载一个 datepicker.js。

但是,日期选择器仅在设置的时间间隔之后加载。

以下是我的新代码。有什么想法吗?

var formLength = $("表单输入").length; console.log("当前的formLength是:" + formLength);

$(document).ready(function() {
  $.each($('[data-behaviour~=datepicker]'), function(index, element) {
    if (element.value) {
      var dsplit = element.value.split("-");
      var d =new Date(dsplit[0],dsplit[1]-1,dsplit[2]);
      element.value = d;
    }
    new Pikaday({ field: element });
  });

  setInterval(function() {
    if ($("form input").length > formLength) {
      console.log("the updated formLength is : " + formLength);
      formLength = $("form input").length;

      var uuid = $("#uuid").html();
      $.ajax({
        type: "POST",
        url: "trailers/" + uuid + "/save-draft",
        data: $("form").serialize(),
        success: function() {
        }
      });
    } else {
      console.log("Nop. (" + $("form input").length + ")");
    }
  }, 30000);
});

【问题讨论】:

  • 您缺少自动保存逻辑的触发器。包装逻辑以在函数长度更改时自动保存表单,并在您对表单进行更改时调用它。
  • 嗨,我已经更新了我的问题陈述。可以再看一遍吗?

标签: jquery ruby-on-rails forms jquery-events


【解决方案1】:

不太确定您要干燥以达到什么目的,但这是一个可行的示例:

var formLength = $("form input").val().length;
console.log("the current formLength is : " + formLength);

$(document).ready(function() {
    setInterval(function(){ 
      if ($("form input").val().length > formLength) {
        formLength = $("form input").length;
        console.log("the updated formLength is" + formLength);
        //setTimeout(autoSaveForm, 10000); //auto save!
      } else {
        console.log("Nop. (" + $("form input").val().length + ")");   
      }    
    }, 3000);
});

document.ready 函数中的所有内容都只会在页面加载后执行,因此如果您想进行定期检查,您需要一个 setInterval (定期执行)。

您还可以在文本输入中添加偶数,例如:

$("form input").bind("change paste keyup", function() {
   //but your code inside
});

【讨论】:

  • 谢谢。这完全有效。解决了困扰我两天的问题。
  • 一个问题:如果不修改表单并且用户不关闭页面,这个循环函数会不会损害性能或任何东西并成倍地占用资源?我不希望任何重复性任务杀死服务器。
  • 嗨,我已经更新了我的问题陈述。可以再看一遍吗?
  • SetInterval 确实会占用一些资源 .. 最好的方法是用 jquery 绑定事件(我的第二个例子)这只会在用户更改/keyup/失去焦点时执行并且是比 setInterval 解决方案更好的处理方法。 (这也将消除您对 setInterval 的问题,所以我想尝试调试这个是没有意义的^^)
猜你喜欢
  • 1970-01-01
  • 2019-09-29
  • 2015-01-15
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多