我有一个看起来像这样的file.js:
var mycompliments = {
interval: 2000,
fadeInterval: 4000,
morning: [
'Good morning, handsome!',
'Enjoy your day!',
'How was your sleep?'
],
afternoon: [
'etc'
],
evening: [
'chaning'
]
}
此数据由另一个功能使用并显示在前端。
如何触发重新加载此文件并每隔X秒执行一次该功能以更新前端的内容?
使用此数据的文件如下所示:
var compliments = {
complimentLocation: '.compliment',
currentCompliment: '',
complimentList: {
'morning': mycompliments.morning,
'afternoon': mycompliments.afternoon,
'evening': mycompliments.evening
},
updateInterval: mycompliments.interval || 30000,
fadeInterval: mycompliments.fadeInterval || 4000,
intervalId: null
};
compliments.updateCompliment = function () {
var _list = [];
var hour = moment().hour();
if (hour >= 3 && hour < 12) {
_list = compliments.complimentList['morning'].slice();
} else if (hour >= 12 && hour < 17) {
_list = compliments.complimentList['afternoon'].slice();
} else if (hour >= 17 || hour < 3) {
_list = compliments.complimentList['evening'].slice();
} else {
Object.keys(compliments.complimentList).forEach(function (_curr) {
_list = _list.concat(compliments.complimentList[_curr]).slice();
});
}
var _spliceIndex = _list.indexOf(compliments.currentCompliment);
if (_spliceIndex !== -1) {
_list.splice(_spliceIndex, 1);
}
var _randomIndex = Math.floor(Math.random() * _list.length);
compliments.currentCompliment = _list[_randomIndex];
$('.compliment').updateWithText(compliments.currentCompliment, compliments.fadeInterval);
}
compliments.init = function () {
this.updateCompliment();
this.intervalId = setInterval(function () {
this.updateCompliment();
}.bind(this), this.updateInterval)
}
我尝试过设置一个setinterval,但它没有用。
function functionToLoadFile(){
jQuery.get('js/mycompliments.js', function(data) {
var loaded = data;
console.log(loaded);
compliments.updateCompliment(loaded);
setTimeout(functionToLoadFile, 5000);
});
}
setTimeout(functionToLoadFile, 5000);
更新:
现在控制台显示该文件每5秒重新加载一次,但它没有更新到前端。我认为没有正确传递给updateCompliment函数?
更新2:
控制台记录下来:
var mycompliments = {
interval: 2000,
fadeInterval: 4000,
morning: [
'Good morning, handsome!',
'Enjoy your day!',
'How was your sleep?'
],
afternoon: [
'etc'
],
evening: [
'wowowow'
]
}
更新3
我设法每5秒更新compliments
,但我似乎无法触发compliments.updateCompliment();从功能内部开始!
function functionToLoadFile(){
jQuery.get('js/mycompliments.js', function(data) {
var compliments = {
complimentLocation: '.compliment',
currentCompliment: '',
complimentList: {
'morning': mycompliments.morning,
'afternoon': mycompliments.afternoon,
'evening': mycompliments.evening
},
updateInterval: mycompliments.interval || 30000,
fadeInterval: mycompliments.fadeInterval || 4000,
intervalId: null
};
console.log(compliments);
setTimeout(functionToLoadFile, 5000);
compliments.reload = function () {
compliments.updateCompliment(compliments);
}
});
}
setTimeout(functionToLoadFile, 5000);
答案 0 :(得分:1)
请务必将setInterval(functionToLoadFile, 5000);
置于实际功能functionToLoadFile
之外。
重新更新2:您实际上并没有使用从js / mycompliments.js&#39;中获取的赞美来更新赞美对象。新获取的赞美存储在loaded
变量中,但您不会对该数据执行任何操作。在运行compliments
函数之前,您需要使用新获取的数据更新compliments.updateCompliment()
对象。
重新更新3:
目前您的代码存在许多问题,因此有几个原因导致代码无效。
jQuery.get('js/mycompliments.js', function(data) {...})
毫无意义。spliceIndex
变量,因此如果您打算使用它,请使用它或只删除该代码。slice()
阵列。我不认为我可以进一步帮助你。此问题可能超出您当前的Javascript技能水平。我不是说放弃,但我认为你有更多的学习,我无法覆盖堆栈溢出问题的单一答案。
答案 1 :(得分:1)
而不是setInterval
,请尝试使用setTimeout
。对请求使用setInterval
通常是一个坏主意,因为请求可能会超时并导致一堆其他请求堵塞队列。但请务必在失败回调中包含setTimeout
。
答案 2 :(得分:0)
您可以尝试这样的事情:
function load_script() {
$.getScript('js/mycompliments.js', function() {
time = setTimeout(function() {
load_script();
}, 30 * 1000);
});
};
load_script();