Javascript 未捕获的语法错误:意外标记<;使用Jsonp
问题: 未捕获的语法错误:意外的标记问题在于行“dataType:'jsonp'”。通过这种方式设置,ajax调用期望结果是jsonp(在回调中包装为参数的json对象…),如果您正在进行跨域调用(由于CORS),这非常有用。您必须设置“数据类型:'xml'” 编辑 考虑到您必须执行CORS调用的复杂性,您必须更改api的输出,至少使Javascript 未捕获的语法错误:意外标记<;使用Jsonp,javascript,jquery,Javascript,Jquery,问题: 未捕获的语法错误:意外的标记问题在于行“dataType:'jsonp'”。通过这种方式设置,ajax调用期望结果是jsonp(在回调中包装为参数的json对象…),如果您正在进行跨域调用(由于CORS),这非常有用。您必须设置“数据类型:'xml'” 编辑 考虑到您必须执行CORS调用的复杂性,您必须更改api的输出,至少使 callbackName({value:'<your><xml>...</xml></your>'}) JSON
callbackName({value:'<your><xml>...</xml></your>'})
JSON和XML是任意嵌套的数据交换格式。获取一个(格式正确的)字符串,并根据格式规则将其转换为数据结构。他们的相似之处就在这里 因此,您不能将XML解析为JSON,它们有不同的规则将字符串(如HTTP请求返回的字符串)转换为数据结构。这就是为什么你会出错 用XML解析器(就像每个浏览器内置的解析器)而不是JSON解析器解析XML不会抛出错误 但您的实际问题是,它是一个跨域资源,而浏览器(有充分的理由)不允许您使用它。如果您需要一个跨域资源,但您无法控制它,并且它没有CORS头,那么您有几个选项:
JSONP是CORS之前发明的一种黑客,目的是绕过浏览器的安全模型。它是用来让那些了解风险、知道自己在做什么以及为什么要做的人使用的。它可能涉及在页面上执行任意第三方代码。不用说,这很糟糕。响应是XML,您试图将其解析为JSON。您希望它能起作用……为什么?我正在尝试解析xml而不是json当您将响应数据类型设置为
json
或jsonp
时,jquery将尝试为您解析它。这是失败的解析错误的原因,我希望现在是显而易见的。还要注意,jsonp本质上是不安全的。如果跨域资源没有CORS头,您可能只想通过您自己的域进行传输。我投票结束这个问题,因为“不清楚您在问什么”。如果你能把它编辑得连贯一致,我将取消投票。我认为您要问的是“我如何处理CORS ajax请求?”、“如果另一个域上的资源没有CORS头,我该怎么办?”,以及“我如何解析来自ajax调用的xml响应?”。请问一个简单明了的问题。有谁能建议在跨域请求中使用jsmy requirement cros“数据类型:'xml'在cros请求时停止的最佳方法吗?好的,那么您必须更改api的输出,至少做一些类似“callbackName({value:'…you xml…})的事情)解析字符串P.s.“callbackName”中的xml是页面中声明的函数或方法的名称,该函数或方法进行ajax调用,并将解析api中的json。。。例如函数callbackName(result){console.log(result.value);}你能给我举个新例子吗jsonp@RobertoBisello我给了你一个+1,但请注意jsonp本质上是不安全的,建议使用它是。。。有争议。@JaredSmith我同意,jsonp并不是真正安全的,但我不建议使用jsonp,我已经找到了解决afeef问题的方法,考虑到给定的上下文。。。老实说,我没有看到任何其他解决方案:(嗨,jared,我们是否需要第三方url(如果服务器不允许跨域true。)@afeef,那么您必须执行选项2,从服务器端获取数据并将其返回到浏览器,以便它来自您的域。
var urljson='cross-damin-url';
var yql = 'http://query.yahooapis.com/v1/public/yql?q=' +
encodeURIComponent('select * from xml where url="' + urljson + '"') +
'&format=xml&callback=?';
$.getJSON(yql, function (data) {
console.log(data.results[0]);
});
callbackName({value:'<your><xml>...</xml></your>'})
function callbackName(result) {
console.log($.parseXML(result.value));
}