我有以下AJAX调用:
$('#FonykerUsernameRegister').blur(function(){
if($(this).val().length > 2) {
alert($(this).val());
$.ajax({
url: '<?php echo $html->url('/fonykers/validate_username',true); ?>' + '/' + $(this).val(),
dataType: 'json',
type: 'POST',
success: function(response) {
if(!response.ok) {
$(this).addClass('error');
error.html(response.msg);
error.fadeIn();
} else {
if($(this).is('.error')) {
alert('im in');
$(this).removeClass('error');
}
$(this).addClass('ok');
}
},
error:function (xhr, ajaxOptions, thrownError){
alert('You fail');
alert(xhr.statusText);
alert(thrownError);
}
});
} else {
error.html('Username must have at least 3 characters');
error.fadeIn();
$(this).addClass('error');
}
});
这是它调用的方法:
function validate_username($username) {
$this->layout = 'ajax';
$response = array();
$fonyker = $this->Fonyker->find('first', array(
'conditions' => array('Fonyker.username' => $username)
));
if(!strlen($username) > 2) {
$response = json_encode(array('ok' => false, 'msg' => 'Username must have at least 3 characters'));
} else if(!preg_match('"^[a-zA-Z0-9]+$"', $username)) {
$response = json_encode(array('ok' => false, 'msg' => 'Username must be alphanumeric'));
} else if ($fonyker) {
$response = json_encode(array('ok' => false, 'msg' => 'Username is already in use'));
} else {
$response = json_encode(array('ok' => true, 'msg' => ''));
}
echo $response;
}
在AJAX调用中,它总是转到错误部分并输出该错误,并且我在PHP代码中没有看到任何空白。任何想法吗?编辑:发生的事情是CakePHP在响应中返回整个视图,但不是视图,而是错误屏幕。
如果你需要在你的控制器的AJAX方法,不需要一个视图,你必须设置$this->autoRender
属性的控制器方法为false
之前做任何事情。
您的ajax函数中可能有一个回显。检查它并从ajax函数中删除任何echo、print和debug。
当你返回json数据时,你不能回显任何东西。
根据OP的评论回复:
虽然我不是特别熟悉CakePHP这样做的方式,当使用ZendApplication时,要做的第一件事就是做一个空的布局。普通响应被放置在默认布局中,而ajax响应被放置在空布局中。
在你的控制器方法中,设置$this->layout
为你的空布局来覆盖默认值。
参见http://www.balistupa.com/blog/2009/07/how-to-change-cakephp-layout/获取更详细的说明
检查ajax了吗?CTP文件在布局文件夹内视图文件夹?
当使用ColdFusion进行开发时,请确保关闭调试,否则可能会导致此问题
客户端/ajax调用期望从服务器获得JSON数据类型。现在您需要确保服务器返回的是JSON数据类型,否则将请求更改为request,以反映服务返回的内容。
要对此进行研究,请使用firebug查看您得到的响应。我刚得到这个错误,我修复了它。
我有同样的问题,但我解决了"$this->autoRender = false;"在函数!