You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:49:29