私はこれに完全に固執しています。私が間違っていること、または問題をデバッグするためにさらに何ができるかについてのアドバイスが欲しいです。
フォームを検証する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を呼び出す必要がある場所)にブレークポイントを設定したため、実行が到達することはありません。親関数にも到達しません。
誰かが私が欠けているものを見ますか?