如何移除Ninja Forms的失焦(Blur)验证,仅保留提交时验证
如何移除Ninja Forms的失焦(Blur)验证,仅保留提交时验证
嘿,我看到你想让Ninja Forms只在提交表单时执行验证,去掉失焦(blur)和内容变化时的自动验证,而且你已经参考了Ninja Forms和Marionette的官方文档,写了Hook脚本,控制台能打印字段ID说明脚本加载正常,但就是没法成功移除那些验证事件对吧?咱们来搞定这个问题。
首先,你原来的代码里直接用fieldChannel.off('change:modelValue')和fieldChannel.off('blur')没生效的原因是:Backbone.Radio的off方法如果只传事件名,需要和绑定事件时的上下文完全匹配才能解绑,而Ninja Forms默认的验证监听器是在它自己的上下文里绑定的,咱们直接这么调用没法精准命中,所以解绑失败。
给你两个可行的解决方案,优先推荐第一个,更稳定:
方案一:拦截验证触发逻辑(推荐)
这种方式不用去解绑事件,而是直接覆盖Ninja Forms的验证触发判断,只有提交时才执行验证:
<?php namespace App\Hooks; use function add_action; class NJFormsDisableOnChangeValidation extends Hook { public $priority = 9; protected $type = 'filter'; protected $actions = [ 'wp_enqueue_scripts' ]; public function __invoke() { add_action('wp_footer', function() { ?> <script type="text/javascript"> jQuery(document).ready(function($) { console.log('Script loaded correctly'); // 覆盖字段验证的触发逻辑 const fieldChannel = Backbone.Radio.channel('fields'); // 先保存原本的验证方法 const originalValidate = fieldChannel.request('validate:model'); fieldChannel.reply('validate:model', function(model, options) { // 只有当验证来自提交操作时,才调用原验证逻辑 if (options && options.source === 'submit') { return originalValidate.call(this, model, options); } // 失焦/内容变化触发的验证直接返回true,跳过 return true; }); console.log('已禁用失焦和内容变化时的验证,仅保留提交验证'); }); </script> <?php }); } }
方案二:精准解绑默认监听器(依赖版本,不推荐)
如果你坚持要解绑事件,可以先在控制台打印出所有绑定的监听器,找到默认验证的处理函数再移除:
<?php namespace App\Hooks; use function add_action; class NJFormsDisableOnChangeValidation extends Hook { public $priority = 9; protected $type = 'filter'; protected $actions = [ 'wp_enqueue_scripts' ]; public function __invoke() { add_action('wp_footer', function() { ?> <script type="text/javascript"> jQuery(document).ready(function($) { console.log('Script loaded correctly'); const fieldChannel = Backbone.Radio.channel('fields'); // 先打印所有blur事件的监听器,找到默认验证的处理函数 console.log(fieldChannel.listeners('blur')); // 假设默认验证的处理函数是第一个,你可以根据控制台输出调整索引 const blurListener = fieldChannel.listeners('blur')[0]; // 精准解绑 fieldChannel.off('blur', blurListener); // 同理处理change:modelValue事件 console.log(fieldChannel.listeners('change:modelValue')); const changeListener = fieldChannel.listeners('change:modelValue')[0]; fieldChannel.off('change:modelValue', changeListener); console.log('已移除失焦和内容变化的验证事件'); }); </script> <?php }); } }
为什么方案一更靠谱?
- 方案一基于Ninja Forms的公开Radio接口,不会因为版本更新导致失效(只要官方不修改这个接口)
- 保留了Ninja Forms原生的所有验证规则,只是限制了触发时机,不用自己重新写验证逻辑
- 避免了依赖内部监听器的索引,更稳定
备注:内容来源于stack exchange,提问作者alfong
相关产品推荐
相关产品推荐

