1

私はこれに完全に固執しています。私が間違っていること、または問題をデバッグするためにさらに何ができるかについてのアドバイスが欲しいです。

フォームを検証する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を呼び出す必要がある場所)にブレークポイントを設定したため、実行が到達することはありません。親関数にも到達しません。

誰かが私が欠けているものを見ますか?

4

2 に答える 2

2

答えを見つけました。検証エンジンのドキュメントには、フォーム検証用の配列の配列とフィールド検証用の配列を返す必要があると書かれています。配列を返す必要があるときに、配列の配列を返していました。

于 2012-05-20T09:13:01.153 に答える
0

私はvalidationEngineを知りません、試してみてください:文字列としての関数名(「beforeCall」)の代わりに、関数への参照を渡してみてください(beforeCall)

于 2012-05-19T20:53:38.613 に答える