注意
:我粘贴的代码不仅仅是ajax调用,以免代码是(导致)问题的一部分。但是,我认为并不是这样,因此您最好将注意力集中在ajax
和jAjax
功能上。
还要注意,由于对此问题有一个评论(带有否决权),说我的代码很难解密,所以我很乐意澄清需要澄清的内容,如果这可以证明是找到问题的关键。
谢谢。
就是这个
我正在尝试抛弃jQuery,因为我唯一使用的是$.ajax()
方法,而包括jQuery之类的整个库仅具有一项功能就令IMO疯狂。$.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
。目前,这种情况不太重要。我认为/希望我能弄清楚案例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:这可能无关紧要,但是在疯狂的一刻,我尝试将this:添加ret.setRequestHeader('Connection','close');
到ajax
函数中,但是我注意到,在发出的标头中,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的:-)
问题内容: 我正在尝试构建一个发出ajax请求的Google Chrome扩展程序。与GMail Checker扩展程序类似。问题是,当我使用jquery进行请求时,并输入了错误的用户名/密码时,它会静默失败,并忽略错误回调函数。 如果我将ajax调用从background.html脚本(在开发人员窗口中看不到请求)中移出到options.html脚本中,则会得到一个对话框来重新进行身份验证。如果
问题内容: 我在处理ajax请求时遇到麻烦。我遇到了错误 所以我尝试的是这个jQuery ajax请求: 但是它仍然无法正常工作。我仍然遇到错误。 我该如何解决? 问题答案: 这很容易,您应该首先设置服务器http响应标头。 问题不在于您的前端javascript代码。 您需要返回此标头: 要么 在Apache配置文件中,代码如下: 在nodejs中,代码是这样的:
我试图通过ajax发布json数据。json数据包含一个大的html表。然而,这个POST请求被转换成GET请求,我得到错误414(请求-URI太长)。我知道jsonp POST请求转换成GET,但是为什么我的json请求转换成GET?
问题内容: 如何使用jQuery在Grails页面中发出Ajax请求? 如何在Grails Controller上设置击中方法的URL?假设控制器:“机场”,动作:“ getJson”,动作的输入为“ iata”。 我能够将静态网址设置为,但无法弄清楚如何为iata传递输入。 我对Grails并不陌生,并遵循IBM的“掌握Grails”教程系列。建议我给我一些有关将Grails与jQuery一起使
问题内容: 所以我刚才正在使用jQuery的.load(),看来我们无法配置`$(“#example”).load(‘./uri.ext `$(“#example”).load(‘./uri.ext #ID1’).load(‘./uri.ext #ID2’).load(‘./uri.ext ID3’)` 如果我们具有DIV的模板文件或用于动态构建页面的文件,而不将HTML存储在字符串变量中或沿这些
问题内容: 对于一个项目,我需要获取其他不同域的网页的源代码。我尝试了以下代码: 我仍然没有得到任何结果,只是一个空白的警告框。 问题答案: 默认情况下,所有浏览器都限制跨域请求,您可以使用YQL作为代理来解决此问题。在此处查看指南:http://ajaxian.com/archives/using-yql-as-a- proxy-for-cross-domain-ajax