小编典典

JavaScript Ajax请求与jQuery $ .ajax

ajax

注意
:我粘贴的代码不仅仅是ajax调用,以免代码是(导致)问题的一部分。但是,我认为并不是这样,因此您最好将注意力集中在ajaxjAjax功能上。
还要注意,由于对此问题有一个评论(带有否决权),说我的代码很难解密,所以我很乐意澄清需要澄清的内容,如果这可以证明是找到问题的关键。
谢谢。


就是这个
我正在尝试抛弃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
  1. 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

  1. 但是,这不起作用:

[] {“ ajax”:true,“ controller”:“ index”,“ action”:“ ajax”,“ module”:“
default”,“ identity”:{}}是FB:JSON数据中的响应POST选项卡:{foo:’Bar’}来源:{“ data”:{“
Foo”:“ Bar”}}(但情况1的网址相同)标头:json; 字符集= UTF-8

  1. 这是一个很大的问题 :完整的请求url与案例1中的url相同,当我在FB控制台中查看POST选项卡(检查请求)时,标题BUT也是一样的。这是我可以找到的唯一区别:

情况1:参数:data [foo]’bar’源:data%5Bfoo%5D = Bar
在这种情况下,我看不到“参数”部分,仅:源:data%5Bfoo%5D = Bar

  1. 与case2相同,除了url(我认为我忘了通过url)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设置为保持活动状态不变。也许这为某人提供了有关出了什么问题的线索?

提前致谢


阅读 216

收藏
2020-07-26

共1个答案

小编典典

如果有人想知道出什么问题了:

ret.setRequestHeader('Content-type', 'application/x-www-form-urlencode');

应该是“ x-www-form-urlencoded”,最后是“ d”:

ret.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

发送 形式化的 对象现在可以正常工作了,我可以摆脱jQuery的:-)

2020-07-26