我有一个可以显示当前和预测信息的Web应用程序。但是,到目前为止,所有这些都是将纬度和经度硬编码到脚本中的,但是我想动态地做到这一点。换句话说,我希望该预测适用于任何人,无论他们身在何处,都适合他们的位置。
因此,要获取本地纬度和较长时间,我可以使用带有地理位置api的函数,并且效果很好。但是我在将其输入Yahoo weather函数时遇到了问题,因为可能为API调用获取数据的时间太晚了。
他们的页面上显示的基本javascript是(并且让我再说一遍,我一切都很好,只是不是动态地进行):
var url = 'https://weather-ydn-yql.media.yahoo.com/forecastrss';
var method = 'GET';
var app_id = 'your-app-id';
var consumer_key = 'your-consumer-key';
var consumer_secret = 'your-consumer-secret';
var concat = '&';
// This is the object that will be changed, as shown below
var query = {'location': 'sunnyvale,ca', 'format': 'json'};
//////
var oauth = {
'oauth_consumer_key': consumer_key,
'oauth_nonce': Math.random().toString(36).substring(2),
'oauth_signature_method': 'HMAC-SHA1',
'oauth_timestamp': parseInt(new Date().getTime() / 1000).toString(),
'oauth_version': '1.0'
};
var merged = {};
$.extend(merged, query, oauth);
var merged_arr = Object.keys(merged).sort().map(function(k) {
return [k + '=' + encodeURIComponent(merged[k])];
});
var signature_base_str = method
+ concat + encodeURIComponent(url)
+ concat + encodeURIComponent(merged_arr.join(concat));
var composite_key = encodeURIComponent(consumer_secret) + concat;
var hash = CryptoJS.HmacSHA1(signature_base_str, composite_key);
var signature = hash.toString(CryptoJS.enc.Base64);
oauth['oauth_signature'] = signature;
var auth_header = 'OAuth ' + Object.keys(oauth).map(function(k) {
return [k + '="' + oauth[k] + '"'];
}).join(',');
$.ajax({
url: url + '?' + $.param(query),
headers: {
'Authorization': auth_header,
'X-Yahoo-App-Id': app_id
},
method: 'GET',
success: function(data){
console.log(data);
}
});
我的javascript差不多,页面顶部有:
var lat = "";
var long = "";
window.onload = function(){
navigator.geolocation.getCurrentPosition(success, error);
function success(pos) {
lat = pos.coords.latitude;
long = pos.coords.longitude;
}
function error() {
console.log('There was an error');
}
};
console.log(lat + " : " + long);
// This just shows ":", so the globals are not updating in time
...而不是查询对象中的“位置”,我有:
var query = {
"lat": lat,
"lon": long,
"u": "c",
"format": "json"
};
因此,由于查询对象是在任何天气功能之外构建的,因此在需要此信息之前,我该使用哪种方法来更新我的全局数据(或形成整个查询对象)?
注意:在任何人决定点击“之前都被要求!”之前按钮,但没有。不适用于这种情况。