注意 :我粘贴的代码不仅仅是ajax调用,以免代码是(导致)问题的一部分。但是,我认为并不是这样,因此您最好将注意力集中在ajax和jAjax功能上。 还要注意,由于对此问题有一个评论(带有否决权),说我的代码很难解密,所以我很乐意澄清需要澄清的内容,如果这可以证明是找到问题的关键。 谢谢。
ajax
jAjax
就是这个 我正在尝试抛弃jQuery,因为我唯一使用的是$.ajax()方法,而包括jQuery之类的整个库仅具有一项功能就令IMO疯狂。$.ajax无论如何,我什至不需要该方法的全部功能,因此我编写了自己的ajax函数。
$.ajax()
$.ajax
问题是:它不起作用,我似乎无法弄清楚原因。我正在尝试将对象发送到服务器(特别是:控制器中的ajaxAction-使用Zend FW)。以下是javascript代码,以及Firebug控制台告诉我的内容摘要。
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”:true,“ controller”:“ index”,“ action”:“ ajax”,“ module”:“ default”,“ identity”:{},“ data”:{“ foo”:“ Bar“}}参数:data [foo]’bar’和源:data%5Bfoo%5D = Bar(来自FB控制台的POST选项卡)标头:application / x-www- form-urlencoded; charset = UTF-8 所有这些都发送到以下URL:http : //www.foo.bar/index/ajax? data%5Bfoo%5D=bar
[] {“ ajax”:true,“ controller”:“ index”,“ action”:“ ajax”,“ module”:“ default”,“ identity”:{}}是FB:JSON数据中的响应POST选项卡:{foo:’Bar’}来源:{“ data”:{“ Foo”:“ Bar”}}(但情况1的网址相同)标头:json; 字符集= UTF-8
情况1:参数:data [foo]’bar’源:data%5Bfoo%5D = Bar 在这种情况下,我看不到“参数”部分,仅:源:data%5Bfoo%5D = Bar
encodeURI
在所有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没有起作用?
XMLHttpRequest
PS:这可能无关紧要,但是在疯狂的一刻,我尝试将this:添加ret.setRequestHeader('Connection','close');到ajax函数中,但是我注意到,在发出的标头中,Connection设置为保持活动状态不变。也许这为某人提供了有关出了什么问题的线索?
ret.setRequestHeader('Connection','close');
Connection
提前致谢
如果有人想知道出什么问题了:
ret.setRequestHeader('Content-type', 'application/x-www-form-urlencode');
应该是“ x-www-form-urlencoded”,最后是“ d”:
ret.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
发送 形式化的 对象现在可以正常工作了,我可以摆脱jQuery的:-)