【发布时间】:2016-05-07 23:03:23
【问题描述】:
我希望有一个输入字段,可以在用户输入字母时建议股票代码,就像您在 Yahoo 或 Google Finance 上看到的那样。除非我启用 CORS,否则我不能只使用 JSON,在这种情况下它可以工作。这是我在研究我面临的问题时从 Stack Overflow(here 和 here)上发现的各种问题拼凑而成的代码。
$("input#stocklookup").autocomplete({
source: function(request, response){
$.ajax({
url: 'http://d.yimg.com/autoc.finance.yahoo.com/autoc?query='+request.term+'®ion=US&lang=en-US',
dataType: 'jsonp',
jsonpCallback: 'YAHOO.util.ScriptNodeDataSource.callbacks'
});
YAHOO = {
util: {
ScriptNodeDataSource: {
callbacks: function(data) {
console.log(data);
}
}
}
};
}
})
搜索“a”时,我会收到 400 错误,并且 URL 被列为
http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=a&region=US&lang=en-US&callback=YAHOO.util.ScriptNodeDataSource.callbacks&_=1462660878200
我认为最后的额外数字可能是导致 400 的原因,但我不知道为什么将它附加到 URL。如果您导航到上面的 URL,结果会在您的浏览器中正确显示。
在learn jQuery 文档中看到此页面后,我也尝试使用此代码块,但使用此代码时也出现 400 错误。
.$ajax({
url: 'http://d.yimg.com/autoc.finance.yahoo.com/autoc?region=US&lang=en-US',
jsonp: 'callback',
dataType: 'jsonp',
data: {
q: request.term,
format: 'json'
},
success: function(response){
console.log(response);
}
})
如果能帮助我找到正确的方向,我们将不胜感激。谢谢。
更新
$.ajax({
url: 'http://d.yimg.com/autoc.finance.yahoo.com/autoc?query='+request.term+'®ion=US&lang=en-US',
cache: true, //<--new
dataType: 'jsonp',
jsonpCallback: 'YAHOO.util.ScriptNodeDataSource.callbacks'
});
YAHOO = {
util: {
ScriptNodeDataSource: {
callbacks: function(data) {
console.log(data);
}
}
}
};
这适用于某些请求,但不适用于其他请求,有些仍然返回 400 状态。
【问题讨论】:
-
额外的东西可能被 jQuery 附加到末尾,只是为了防止浏览器缓存。您可以在 jQuery 的 ajax 调用中将其关闭,但 JSONP 请求/响应的缓存可能会搞砸。
-
仅供参考,如果您只是在浏览器中输入:
http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=a&region=US&lang=en-US&callback=YAHOO.util.ScriptNodeDataSource.callbacks&_=1462660878200,您将看到 JSONP 响应,因此我认为您的错误与 URL 的&_=1462660部分无关. -
谢谢!!我把 cache: true 放进去,它起作用了!缓存不是问题,个别股票代码不会经常变化。
-
呃,缓存对于股票行情来说可能是个大问题。我不知道你的应用是什么,但人们最不想要的是一天前的股票信息。
-
现在,奇怪的是,有些字母有效,有些则无效。 d.yimg.com/autoc.finance.yahoo.com/… 返回状态 200,d.yimg.com/autoc.finance.yahoo.com/… 返回状态 400。更新原始问题
标签: javascript json jsonp yahoo-api yahoo-finance