Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AJAX-jQuery与直接XmlHttpRequest返回脚本的比较_Jquery_Ajax_Xmlhttprequest - Fatal编程技术网

AJAX-jQuery与直接XmlHttpRequest返回脚本的比较

AJAX-jQuery与直接XmlHttpRequest返回脚本的比较,jquery,ajax,xmlhttprequest,Jquery,Ajax,Xmlhttprequest,我试图弄清使用jQuery执行AJAX与直接操作XmlHttpRequest之间的一些奇怪之处。下面的测试用例是经典的ASP,但这只是我的方便之处——服务器端技术不重要 我应该补充一点,我并没有排除我自己的愚蠢——我只是不确定它是什么:-)这可能是完全琐碎的,我遗漏了一些相当明显的东西,但我没有正确地使用我的google fu来真正找出我遗漏了什么 本质上,我调用的是返回内联Javascript的代码。这将被注入HTML页面,并打算执行。我完全控制所有代码和服务器(即,这不应该是跨域请求) 我看

我试图弄清使用jQuery执行AJAX与直接操作XmlHttpRequest之间的一些奇怪之处。下面的测试用例是经典的ASP,但这只是我的方便之处——服务器端技术不重要

我应该补充一点,我并没有排除我自己的愚蠢——我只是不确定它是什么:-)这可能是完全琐碎的,我遗漏了一些相当明显的东西,但我没有正确地使用我的google fu来真正找出我遗漏了什么

本质上,我调用的是返回内联Javascript的代码。这将被注入HTML页面,并打算执行。我完全控制所有代码和服务器(即,这不应该是跨域请求)

我看到的是jQuery版本可以工作——它执行AJAX页面返回的脚本。直接法不起作用。javascript不会执行

我的第一个想法是“XSS”,jQuery做了一些特定于头的事情,但是我用fiddler进行了调查,我看到两个请求都发出了,都返回相同的代码。除了
GET
(jQuery在请求上粘贴一个querystring-我假设这是为了避开缓存问题),我还得到了两个要精确镜像的请求,但本质上请求是这样的:

GEThttp://myLocalMachine:8000/ajaxtest/ajax.asp HTTP/1.1
x-request-with:XMLHttpRequest
接受语言:en gb
推荐人:http://hsl10161:8000/ajaxtest/main.html
接受:text/html*/*
接受编码:gzip,deflate
用户代理:Mozilla/4.0(兼容;MSIE 7.0;Windows NT 6.1;Trident/4.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;Media Center PC 6.0;.NET4.0C;.NET4.0E;Tablet PC 2.0;.NET CLR 1.4322;InfoPath.3;MATM)
主机:myLocalMachine:8000
连接:保持活力
…请注意,请求中没有访问控制标头,响应标头中也没有返回任何访问控制标头:

HTTP/1.1200正常
缓存控制:没有缓存
Pragma:没有缓存
内容类型:text/html
到期时间:2012年3月14日星期三格林威治标准时间10:00:57
改变:接受编码
服务器:Microsoft IIS/7.5
X-Powered-By:ASP.NET
X-UA-Compatible:IE=仿真E7
日期:2012年3月14日星期三格林尼治标准时间10:01:57
内容长度:55
本内容的其余部分是一个测试用例……所描述的行为发生在IE8和Firefox 10上

ajax.asp


jQuery使用
.html()
执行添加到DOM中的代码。。。JavaScript
。innerHTML
不会。您可以对代码使用
eval()
函数使其执行Ta。。。我有一种感觉,这将是一件非常明显的事情,但我不知道我错过了什么。
<%@ Language=VBScript %>
<%
Option Explicit
Response.CacheControl = "No-cache"
Response.AddHeader "Pragma", "No-cache"
Response.Expires = -1
%>
<script type="text/javascript">alert('Hi!');</script>
<html>
<head>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript" src="ajax.js"></script>
    <script type="text/javascript">
        function resetdiv()
        {
            $('#target').html('...');
        }
    </script>
    <title>AJAX test</title>
</head>
<body>
    <div id="target"></div>
    <button onclick="ajax1('ajax.asp', 'target')">With jQuery</button>
    <button onclick="ajax2('ajax.asp', 'target')">Without jQuery</button>
    <button onclick="resetdiv();">Reset</button>
</body>
</html>
function ajax1(strURL,target)
{
$.ajax({
    url: strURL,
    cache: false,
    dataType: "html",
    async: false,
    type: "GET",
    success: function (data) {
        $('#' + target).html(data);
    }
});
}

function ajax2(strURL,target)
{
var localAjax = new XMLHttpRequest();
localAjax.open("GET", strURL, false);
localAjax.setRequestHeader("Accept", "text/html, */*");
localAjax.setRequestHeader("x-requested-with", "XMLHttpRequest");
localAjax.onreadystatechange = function() {
    if (localAjax.readyState == 4)
    {
        var respText = localAjax.responseText;
        var targetField = document.getElementById(target);
        if (targetField != null) {
            targetField.innerHTML = respText;
        }
    }
}
localAjax.send(null);
}