@R_403_323@
首先,我们来看看当你在jQuery中建立AJAX请求时会发生什么:
$.ajax({ url: '/user.PHP?userId=123',success: function(data) { alert(data); // alerts the response });
在上述示例中,AJAX请求是相对于域进行的。我们知道,如果我们尝试在路径之前添加一个不同的域,请求将失败并出现安全异常。
但是,这并不是说浏览器无法向另一个域发出请求。以下是您可能熟悉的示例:
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
根据我们在页面上如何导入JavaScript的知识,我们看到可以加载存在于另一个域上的资源!
JSONP是一个利用这一知识的概念。 JSONP代表“JSON填充”,它的成功取决于JavaScript对象可以使用字符串表示法,JavaScript脚本标签可以从外部域加载和运行内容。
在引擎盖下,jQuery的JSONP看起来像这样,虽然可能不是精确的:
// programmatically load a script tag on the page using the given url function loadRemoteData(url) { var script = document.createElement("script"); script.setAttribute("type","text/javascript"); script.setAttribute("src",url); document.getElementsByTagName("head")[0].appendChild(script); }
另外,在页面的某个地方,我们定义一个回调处理程序:
function processData(jsonResult) { alert(JSON.stringify(jsonResult)); //alert the JSON as a string }
在这里,我们提出要求:
// make a request for the data using the script tag remoting approach. loadRemoteData("http://example.com/users.PHP?userId=123&callback=processData");
为了正常工作,我们的PHP脚本必须以JSON格式返回数据,并且还必须以JavaScript函数名称的形式在字符串周围添加“padding”,我们可以作为参数传递(即“回调” )
因此,如果要在Firebug或Chrome NET选项卡中查看,服务器的响应可能如下所示:
processData( { "userId" : "123","name" : "James","email" : "example@example.com" } );
因为我们知道JavaScript内容一经下载即可运行,所以我们之前定义的processData函数立即被调用,并将JSON字符串作为参数传递。然后使用JSON.stringify将对象重新转换为字符串,然后提醒它。
既然它是一个对象,我也可以访问它的属性,像这样:
function processData(jsonResult) { alert(JSON.stringify(jsonResult)); //alert the JSON as a string // alert the name and email alert("User name is " + jsonResult.name + " and email is " + jsonResult.email); }
最后,我们来谈一谈主要问题:可以使用JSONP来获取XML,还是可以解析XML跨域?正如其他人所指出的那样,答案是一个响亮的NO,但是我们来看一下为什么用一个例子:
processData(<?xml version="1.0"><user><userid>12345</userid><name>James</name><email>example@example.com</email></user>);
现在,如果将原始XML传递到函数中会发生什么?它将破坏,因为JavaScript无法将XML转换为JSON。
但是,假设我们将XML引入引号:
processData("<?xml version="1.0"><user><userid>12345</userid><name>James</name><email>example@example.com</email></user>");
现在,在这个例子中,jsonResult变量实际上是一个字符串,我们可以使用它。使用一些JavaScript XML解析实用程序,我们可以将该字符串加载到XML DOM解析器中,并与其一起完成任务!
然而,它不是纯XML,它仍然是一个JavaScript响应。来自PHP服务器的响应类型仍然是text / javascript,而且我们仍然使用脚本标签来加载真正简单的JavaScript。
总而言之,您可以使用“XMLP”或填充填充的XML(我刚刚提出来,这不是真的!),但是如果您要经历实际修改响应以返回函数回调的所有麻烦包装器,您也可以将输出转换为JSON,让浏览器自动处理转换并自动处理不必使用XML解析器的麻烦。
但是,如果由于某种原因,以XML格式保存数据更容易,您可以修改响应并给它一个JavaScript包装器。
如果您将遗留应用程序中的XML数据存储在数据库中,并且使用脚本标记远程处理或JSONP调用将其返回到客户端,那么我可以看到这一点很有用的情况可能是。