注 :我已经贴更多的代码不仅仅是Ajax调用,上关的机会,代码是什么导致了问题(的一部分)。 我不认为它是,但是,所以你可能会更好过集中在ajax
和jAjax
功能位进一步下跌。
还要注意的是,因为在这个问题上有一个注释(以给予好评)说我的代码是难以破译,我会高兴地阐明什么需要澄清如果能够证明是在寻找问题的关键。
谢谢。
事情是这样的。 我想沟jQuery的,因为我使用的唯一的事情是$.ajax()
方法,以及包括像jQuery整个lib中仅有1功能是IMO疯狂。 我甚至都不需要的全部功能$.ajax
法反正,所以我写我自己ajax
功能。
问题是:它不工作,我似乎无法找出原因。 我试图将对象发送到服务器(具体为:在控制器ajaxAction - 使用Zend FW)。 下面是javascript代码,以及什么样的萤火虫控制台告诉我一个总结。
if (!String.prototype.trim)
{
String.prototype.trim = function()
{
"use strict";
return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
};
}
function getUrl(action,controller)
{
var base,uri;
base = window.location.href.replace('http://'+window.location.host,'');
if (base.length > 1)
{
base = base.substring(1,base.length).split('/');
controller = controller || base[0];
base[0] = controller || base[0];
base[1] = action || base[1];
return '/'+base.join('/');
}
controller = controller || 'index';
action = action || 'ajax';
return base+controller+'/'+action;
}
function formalizeObject(obj,recursion)
{
recursion = recursion || false;
if (typeof obj !== 'object')
{
throw new Error('no object provided');
}
var ret = '';
for (var i in obj)
{
if (!obj.hasOwnProperty(i) || typeof obj[i] === 'function')
{
continue;
}
if (recursion)
{
ret +='['+i+']';
}
else
{
ret += (ret.length > 0 ? '&' : '') + i.toString();
}
if (typeof obj[i] === 'object')
{
ret += formalizeObject(obj[i],true);
continue;
}
ret += '='+obj[i].toString();
}
if (recursion)
{
return ret;
}
return encodeURI(ret);
}
function success()
{
if (this.readyState===4 && this.status===200)
{
console.log(this.responseText);
}
}
function ajax(str,url,method,json)
{
var ret;
json = json || false;
str = str || {};
method = method || 'POST';
url = url || getUrl();
str =
str = (typeof str === 'object' ? str : {data:str});
try
{
ret = new XMLHttpRequest();
}
catch (error)
{
try
{
ret= new ActiveXObject('Msxml2.XMLHTTP');
}
catch(error)
{
try
{
ret= new ActiveXObject('Microsoft.XMLHTTP');
}
catch(error)
{
throw new Error('no Ajax support?');
}
}
}
if (typeof ret !== 'object')
{
throw new Error('No Ajax, FFS');
}
ret.open(method, url, true);
ret.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
ret.setRequestHeader('Content-type', (json ? 'application/json' : 'application/x-www-form-urlencode'));
ret.onreadystatechange = success;
ret.send((json ? JSON.stringify(str) : formalizeObject(str)));
return true;
}
function jAjax(str,url)
{
$.ajax(
{
url : url,
data: str,
type: 'POST',
success: function(res)
{
console.log(res);
}
});
}
四种方式,我试图让Ajax请求:
jAjax({data:{foo:'bar'}},getUrl());//1
jAjax({data:{foo:'bar'}},getUrl(),true);//2
ajax({data:{foo:'bar'}},getUrl());//3
ajax({data:{foo:'bar'}},getUrl(),true);//4
jAjax({data:{foo:'bar'}},getUrl());
:这只是正常:[] { “AJAX”:真, “控制器”: “索引”, “动作”: “AJAX”, “模块”: “默认”, “同一性”:{}, “数据”:{ “foo” 的:”栏“}}参数:数据[富]‘酒吧’和来源:数据%5Bfoo%5D =巴(从FB控制台POST标签)部首:应用/ X WWW的窗体-urlencoded; 字符集= UTF-8
所有这一切都被送到了以下网址: http://www.foo.bar/index/ajax?data%5Bfoo%5D=bar然而,这并不工作,:
[] { “AJAX”:真, “控制器”: “索引”, “动作”: “AJAX”, “模块”: “默认”, “同一性”:{}}是在FB的响应POST标签:JSON数据:{FOO: '酒吧'}源:{ “数据”:{ “富”: “酒吧”}}(但是相同的URL是情况1)部首:JSON; 字符集= UTF-8
这是最大的一个 :完整的请求URL是相同的情况下,1至URL,因为是头,但是当我看到在FB控制台中的POST选项卡(检查请求)这是我能找到的唯一区别是:
壳体1:参数:数据[富] '酒吧' 来源:数据%5Bfoo%5D =酒吧
在这种情况下,我无法看到参数部分,只有:来源:资料%5Bfoo%5D =酒吧相同的情况2,除了网址,我想我忘了通过
encodeURI
。 这种情况是不太重要的现在。 我想/希望我会得到这个工作,我找出什么是错的情况下3的时刻。
在所有4个的情况下,请求被发送,和接收。 控制器动作如下:
public function ajaxAction()
{
$this->_helper->layout->disableLayout();
$this->getHelper('viewRenderer')->setNoRender();
$this->_helper->getHelper('AjaxContext')->addActionContext( 'ajax' , 'json' )
->initContext('json');
if($this->getRequest()->isPost() && $this->getRequest()->isXmlHttpRequest())
{
echo json_encode(array_merge(array('ajax'=>true),$this->_getAllParams()));
}
else
{
throw new Exception('no ajax call made??');
}
}
由于我收到一个JSON字符串,我敢肯定,要求张贴,并且具有正确XMLHttpRequest
头。 那么,为什么我不能发表JSON对象? 甚至更重要的是:为什么是3的情况下不能正常工作? 什么是jQuery的做的我不知道呢? 这是什么,这使得1的情况下工作,但不区分3?
PS:这可能是无关紧要的,但在疯狂的时刻,我尝试添加此: ret.setRequestHeader('Connection','close');
在ajax
功能,但我注意到,在被罚出了头, Connection
设置为保持活动都是一样的。 或许这给了别人一个线索,什么地方出了错?
提前致谢