AJAX - JQuery против прямого XmlHttpRequest возвращая странность сценария - PullRequest
0 голосов
/ 14 марта 2012

Я пытаюсь докопаться до некоторой странности между выполнением AJAX с jQuery и манипулированием XmlHttpRequest напрямую.Тестовый пример, который я привел ниже, это классический ASP, но это только мое удобство - технология на стороне сервера не должна иметь значения.

Я должен добавить, что я не исключил глупости с моей стороны - яЯ просто не уверен, что это такое :-) Это может быть совершенно тривиально, и я упускаю что-то довольно очевидное, но я не понимаю, как правильно гугл-фу выяснить, что именно я пропускаю.

По сути, я вызываю код, который возвращает встроенный Javascript.Это внедрено в страницу HTML и предназначено для выполнения.У меня есть полный контроль над всем кодом и сервером (т. Е. Это не должен быть междоменный запрос).

Я вижу, что работает версия jQuery - она ​​выполняет сценарий, возвращаемый AJAXстр.Прямой метод не работает.Javascript не выполняется.

Моей первой мыслью было «XSS», и что jQuery сделал что-то специфическое для заголовков, однако я исследовал с помощью fiddler и, как я вижу, оба запроса выходят, оба возвращают одинаковыекод.У меня также есть оба запроса для точного зеркалирования, за исключением GET (jQuery вставляет строку запроса в запрос - я предполагаю, что это позволяет обойти проблемы с кэшированием), но по сути запрос выглядит так:

GET http://myLocalMachine:8000/ajaxtest/ajax.asp HTTP/1.1
x-requested-with: XMLHttpRequest
Accept-Language: en-gb
Referer: http://hsl10161:8000/ajaxtest/main.html
Accept: text/html, */*
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; 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.1.4322; InfoPath.3; MATM)
Host: myLocalMachine:8000
Connection: Keep-Alive

... обратите внимание, что в запросе нет заголовка Access-Control, и в заголовках ответа ничего не возвращается:

HTTP/1.1 200 OK
Cache-Control: No-cache
Pragma: No-cache
Content-Type: text/html
Expires: Wed, 14 Mar 2012 10:00:57 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
X-UA-Compatible: IE=EmulateIE7
Date: Wed, 14 Mar 2012 10:01:57 GMT
Content-Length: 55

Остальная часть этого содержимого представляет собой тестовый пример... описанное поведение происходит в IE8 и Firefox 10.

ajax.asp

<%@ Language=VBScript %>
<%
Option Explicit
Response.CacheControl = "No-cache"
Response.AddHeader "Pragma", "No-cache"
Response.Expires = -1
%>
<script type="text/javascript">alert('Hi!');</script>

main.html

<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>

ajax.js

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);
}

1 Ответ

0 голосов
/ 14 марта 2012

jQuery выполняет код, добавленный в DOM, когда он добавляется с использованием .html() ... JavaScript .innerHTML нет. Вы можете использовать функцию eval() в своем коде, чтобы заставить его выполнить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...