使用jQuery

时间:2016-01-28 17:37:27

标签: javascript jquery ajax

我有一个看起来像这样的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);

3 个答案:

答案 0 :(得分:1)

请务必将setInterval(functionToLoadFile, 5000);置于实际功能functionToLoadFile之外。

重新更新2:您实际上并没有使用从js / mycompliments.js&#39;中获取的赞美来更新赞美对象。新获取的赞美存储在loaded变量中,但您不会对该数据执行任何操作。在运行compliments函数之前,您需要使用新获取的数据更新compliments.updateCompliment()对象。

重新更新3:

目前您的代码存在许多问题,因此有几个原因导致代码无效。

  • 您已在compliments对象上定义了一个重载函数,当它被执行(也称为)时,将执行(也就是调用)updateCompliment函数。 updateCompliment未被调用的原因是您无法调用重新加载函数。 (顺便说一下,在这里定义一个重载函数是没有用的;只需直接调用updateCompliment函数。)
  • 您仍然没有使用您正在抓取的数据。如果您不对数据做任何事情,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();