【问题标题】:jquery validation engine ajax field validation failingjquery验证引擎ajax字段验证失败
【发布时间】:2012-05-19 19:53:55
【问题描述】:

我完全被这个问题所困扰,我希望得到关于我做错了什么或者我可以做些什么来调试问题的建议。

我有 jquery 验证引擎验证表单。 例如检查网名是否存在的代码如下;

<input value="[% fields.screenname | html %]" placeholder="Screenname" 
                onclick="$('#screenname').validationEngine('showPrompt', 'For example: JohnDoe_68.', 'load')" 
                class="validate[required,custom[onlyLetterNumber],maxSize[41],ajax[ajaxNameCallPerlScreenname]]" 
                name="screenname" id="screenname" type="text" size= "41" maxlength="24" data-prompt-position="centerRight"/>

验证引擎的调用是

jQuery(document).ready(function(){
jQuery("#register").validationEngine('attach', 'autoHidePrompt', {
    promptPosition : "topRight", 
    scroll: "false",
    ajaxFormValidation : "true",
    onBeforeAjaxFormValidation: "beforeCall",
    onAjaxFormComplete: "ajaxValidationCallback"
    });
});

在这个阶段,beforeCall 和 ajaxValidationCallback 函数直接来自演示,并且永远不会被调用,所以我不会在此处包含它们。

在服务器端,我有一个简单的脚本检查是否使用该用户名并通过用 perl 编写的脚本返回 json(utf8 编码)。相关代码是;

use utf8;
my $output;
eval { $output = JSON::XS->new->utf8->encode( $data ); };
if($@)
{
    use Carp;
    confess($@);
}
warn "Form Output is " . $output;
$self->discard_request_body();
$self->req->content_type('application/json; charset=utf-8');
$self->req->headers_out->set( 'Expires' => 'Thu, 1 Jan 1970 00:00:00 GMT' );

$self->req->headers_out->set( 'Content-Length' => length $output );
$self->req->print($output);

这就是麻烦的开始。 在 chrome 和 firefox 中,我可以看到验证请求到达服务器, 我可以看到正确的响应被发送回浏览器, 我可以在浏览器中查看正确的响应(我认为)并且喜欢这样

[["screenname","false","That user name is already taken. Please try again."]]

然而实际的 onAjaxFormComplete 从未被调用。如果我在 beforeCall 和 ajaxValidationCallback 函数中设置断点,它们永远不会被调用。

标题如下;

Response Headers
Connection  Keep-Alive
Content-Encoding    gzip
Content-Length  89
Content-Type    application/json; charset=utf-8
Date    Sat, 19 May 2012 19:47:28 GMT
Expires Thu, 1 Jan 1970 00:00:00 GMT
Keep-Alive  timeout=15, max=100
Server  Apache/2.2.16 (Debian)
Vary    User-Agent,Accept-Encoding
X-UA-Compatible chrome=1
X-What-Alias    flooting
Request Headers
Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Connection  keep-alive
Cookie  flooting_session=be8aec0e39f12ee031c9103072b19a66
Host    six.flooting.com
Referer http://six.flooting.com/register
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:12.0) Gecko/20100101      Firefox/12.0
X-Requested-With    XMLHttpRequest

这就是我目前能告诉你的全部内容。我想我在配置回调函数的方式上遗漏了一些非常简单的东西,但是我一直在努力解决这个问题已经有一段时间了,我还没有找到答案。

注意 beforeCall 在 ajax 请求之前不会被调用,但是我已经在validationEngine 中的代码的适当部分(应该调用 beforeCall 的地方)设置了断点,并且执行永远不会到达它。甚至没有进入父函数。

有人知道我错过了什么吗?

【问题讨论】:

    标签: jquery json perl validation jquery-validation-engine


    【解决方案1】:

    我找到了答案, 在验证引擎的文档中,它说您必须返回一个用于表单验证的数组和一个用于字段验证的数组。当我应该返回一个数组时,我正在返回一个数组。

    【讨论】:

    • 很高兴找到马克-但您的示例也存在缺陷,因为您没有实现回调。你只是在这里传递字符串。你能更新一下代码示例吗?
    【解决方案2】:

    我不知道validationEngine,只是尝试一下:尝试将函数名作为字符串(“beforeCall”)而不是函数名传递给函数的引用(beforeCall)

    【讨论】:

    • 您好,感谢您的意见。我应该提到我已经尝试使用引号,而不是用匿名函数替换函数名。这些方面对我没有任何帮助。
    • 在浏览器中打开 javascript 控制台时是否看到任何错误消息?
    • 不,一切看起来都很好,包括服务器的响应。关于响应中的字段顺序,有一些相互矛盾的文档,但是我已经尝试了所有组合,无论如何,它只是没有调用处理程序。我将尝试下载旧版本的库,看看是否有任何显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多