2012-03-14 55 views
0

我想要做的AJAX與jQuery與直接操縱XmlHttpRequest之間的一些奇怪的底部。我下面的測試案例是傳統的ASP,但這只是我的信服 - 服務器端技術應該不重要。AJAX - jQuery與直接XmlHttpRequest返回腳本奇怪

我應該補充一點,我沒有排除我的愚蠢 - 我只是不確定它是什麼:-)這可能是完全微不足道的,我錯過了一些相當明顯的東西,但我是沒有讓我的google-fu正確地找出我錯過的是什麼。

本質上我調用返回內聯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 

...注意,在請求中沒有訪問控制首部,也不是任何在響應標頭中返回:

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

回答

0

jQuery的執行添加到DOM代碼時其附加使用設g .html() ... JavaScript .innerHTML沒有。你可以在你的代碼上使用eval()函數來使它執行

+0

Ta ...我有一種感覺,這將是一個非常明顯的東西,但無法弄清楚它是什麼,我錯過了。 – 2012-03-20 11:17:20