【问题标题】:How to use jQuery to remotely validate a field that depends on another field in the form?如何使用jQuery远程验证依赖于表单中另一个字段的字段?
【发布时间】:2011-02-12 05:23:23
【问题描述】:

我有一个表单,我在其中使用远程验证来检查数据库中是否已存在电子邮件地址。然而,问题在于,在此表单上,用户可以在几个不同的“组”之间进行选择,并且每个组都有自己不同的电子邮件地址集(因此同一电子邮件可以在每个组中存在一次)。

组选择是表单上的下拉菜单,电子邮件地址是具有远程验证的输入字段。我有几个问题。首先,我设置了这样的远程规则:

remote: {
    url: 'remote_script.php',
    data: {  group_id:  $('select.group_id').val() }
}

但是,这似乎将 group_id 参数静态设置为选择中的第一个值。意思是,如果我改变select,然后再次触发远程验证,group_id参数不会改变

首先,如何使这个参数动态化,取决于表单中的一个select的值?

其次,如何手动触发邮件地址字段的远程验证?更改 group_id 选择时,我想重新触发电子邮件地址字段上的远程验证(不更改字段的值)。我尝试使用

$(selector).validate().element('.email_addr')

但这似乎只会触发标准验证(必需,电子邮件),而不是远程调用。

【问题讨论】:

  • @Adrian 感谢编辑,但我认为标题的第二部分实际上是更难弄清楚的部分!我认为出于搜索目的,在标题中对此进行一些参考会更有用。回想起来,我应该提出两个问题,但那是五年前的事了……

标签: jquery validation forms jquery-validate


【解决方案1】:

找到我问题第二部分的解决方案:

 $(".email_addr").removeData("previousValue");

将移除远程请求的缓存,并允许远程请求再次被触发,使用.element()。

因此我的代码如下:

$("select.group_id").change(function() {
    $(".email_addr").removeData("previousValue"); //clear cache when changing group
    $("#customer_form").data('validator').element('.email_addr'); //retrigger remote call
    //my validator is stored in .data() on the form
});

在此处找到解决方案:solution

@Jeffery To 最初回答了我的问题的第一部分

所有需要做的就是将参数的值更改为函数,而不仅仅是一个值。 Jeffery 的示例复制如下,供未来的 Google 员工使用:

remote: {
  url: 'remote_script.php',
  data: {
    group_id: function () {
        return $('select.group_id').val();
    }
  }
}

【讨论】:

  • 这似乎对我不起作用:stackoverflow.com/questions/11479383/…
  • 另外,'validator 选择器从何而来?在上面的评论中查看我的问题。
  • @Jason,验证器选择器只是我为了方便而做的。我像这样实例化验证器:v = $('#form').validate({ ... });,然后我只是将 v 存储在表单上的数据中,以便以后可以访问它。
  • 这个无证的removeData方法救了我的命!
  • 经过 2 小时的挖掘,这对我有帮助
【解决方案2】:

second example for remote 看来,函数(在验证期间评估)可用于数据,所以

remote: {
    url: 'remote_script.php',
    data: {
        group_id: function () {
            return $('select.group_id').val();
        }
    }
}

应该可以。

对于第二个问题,您是否尝试将验证规则传递给validate()

【讨论】:

  • 是的,你是对的,它适用于动态数据。我从 .validate() 调用中返回原始验证器,然后执行 v.element('.email_addr') 之类的操作,但我似乎无法让它工作。你知道 .element() 是否会触发远程调用吗?
  • 没关系,我想通了,我的选择器出错了。 .element() 确实重新触发了远程调用,只需要原始的验证器对象,回想起来,这是完全有意义的。
  • 嗯,在进一步测试中,似乎问题的第二部分仍未解决 - 似乎无法触发未更改字段的远程调用。将这个问题标记为完成并单独提问。谢谢
  • 我必须在远程选项中附加 async: false 才能让它为我工作。
  • @KevinJhangiani - 你有没有想过这个问题?我遇到了同样的问题 - 我可以进行多次远程调用,除非该字段恢复为有效 - 在这种情况下,如果该字段发生更改,它将永远不会再次进行远程调用。
猜你喜欢
  • 2015-09-20
  • 2017-04-12
  • 2013-12-26
  • 2016-10-03
  • 1970-01-01
  • 2011-04-27
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多