Dojo xhr没有设置XmlHttpRequest

时间:2012-07-19 20:07:21

标签: php ajax dojo

我正在使用Dojo 1.7.2并尝试以下代码

var request = xhr.get({
        url: location,
        content : content,
        load : function( data ){
            for( var x in data )
                {
                    alert ( x + data[x] );
                }
        },
        error : function()
        {
            alert( 'Had an eror' );
        },
        handleAs : 'json'
    });

然后在php中我执行以下操作以尝试检测xmlhttprequest

function isAjax(){

    $ajax = (isset( $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] ) ) &&
        ( strtolower( $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] ) ==  'xmlhttprequest' );

    return $ajax;
}

但isAjax函数返回false。

如果我做xhr.post那么它可以正常工作。我认为这只是使用GET而不是POST的副作用?这是它还是其他我不会检查的东西。

2 个答案:

答案 0 :(得分:1)

此解决方案基于Zend Framework版本。

function isAjax() {
    $header = 'X_REQUESTED_WITH';

    // Try to get it from the $_SERVER array first
    $temp = 'HTTP_' . strtoupper(str_replace('-', '_', $header));
    if (isset($_SERVER[$temp])) {
        return $_SERVER[$temp] == 'XMLHttpRequest';
    }

    // This seems to be the only way to get the Authorization header on
    // Apache
    if (function_exists('apache_request_headers')) {
        $headers = apache_request_headers();
        if (isset($headers[$header])) {
            return $headers[$header]  == 'XMLHttpRequest';
        }
        $header = strtolower($header);
        foreach ($headers as $key => $value) {
            if (strtolower($key) == $header) {
                return true;
            }
        }
    }

    return false;
}

答案 1 :(得分:0)

附加此标头不是标准 - 因为在大多数情况下它是无用的开销。

你需要自己设置标题 - 并且可以随意调用它。你想要的是headers: { "X-Requested-With": "XMLHttpRequest" }

var request = xhr.get({
    url: location,
    content : content,
    headers: { "X-Requested-With": "XMLHttpRequest" }, // << < add this
    load : function( data ){
        for( var x in data )
            {
                alert ( x + data[x] );
            }
    },
    error : function()
    {
        alert( 'Had an eror' );
    },
    handleAs : 'json'
});