如何在jQuery中解析XML跨域?

前端之家收集整理的这篇文章主要介绍了如何在jQuery中解析XML跨域?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当从不同的服务器/域解析XML时,如何解决跨域问题?有人可以给我一个例子吗?该示例不必仅限于jQuery,因为JavaScript也将足够。

解决方法

为了完全理解为什么纯跨域XML不起作用,这有助于首先看看跨域JSON是如何促进的。

首先,我们来看看当你在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调用将其返回到客户端,那么我可以看到这一点很有用的情况可能是。

原文链接:https://www.f2er.com/jquery/182799.html

猜你在找的jQuery相关文章