暂停Javascript ||冻结页面

时间:2014-08-02 19:36:00

标签: javascript jquery ajax dom greasemonkey

我想知道我的"问题"是否有一些解决办法。

我玩游戏,我通过Greasemonkey / Firefox使用Javascript / jQuery进行自定义。

有很多脚本可以修改DOM和一些输入值。在我的自定义脚本中,我使用ajax调用,大约需要15-20秒才能完成,但到那时页面已被修改,所以我来到这里。

我想我必须以某种方式停止一切,所有javascripts,完全冻结页面,直到我的ajax完成,但请记住,我无法控制/修改页面上的所有脚本。 根据我的经验......一切皆有可能,我现在错了吗? .. 谢谢。

2 个答案:

答案 0 :(得分:1)

抱歉,即使已经过了一段时间,但你发布的情况引起了我的注意力超出了我的想象。 所以我检查了很多可能性,最后我建议如下:

var _setTimeout;
var _clearTimeout;
var _setInterval;
var _clearInterval;
var _pauseOn;

_setTimeout    = window.setTimeout;
_clearTimeout  = window.clearTimeout;
_setInterval   = window.setInterval;
_clearInterval = window.clearInterval;
_pauseOn       = false;

window.setTimeout = function(code, delay) {
    return _setTimeout(function () {
        if (_pauseOn == true) {
            return;
        }
        code();
    }, delay);
};
window.clearTimeout = function(intervalId) {
    if (_pauseOn == true) {
        return;
    }
    _clearTimeout(intervalId);
};
window.setInterval = function(code, delay) {
    return _setInterval(function () {
        if (_pauseOn == true) {
            return;
        }
        code();
    }, delay);
};
window.clearInterval = function(intervalId) {
    if (_pauseOn == true) {
        return;
    }
    _clearInterval(intervalId);
};

function pauseTimer() {
    _pauseOn = true;
}

function resumeTimer() {
    _pauseOn = false;
}

/*
 * To test:
 * shift + p --> pause game
 * shift + r --> resume game
 */
$(window).keypress(function(event) {
    if (event.shiftKey) {
        switch (String.fromCharCode(event.which).toLowerCase()) {
            case 'p':
                event.preventDefault();
                pauseTimer();
                break;
            case 'r':
                event.preventDefault();
                resumeTimer();
                break;
        }
    }
});

我希望这可能是一种贬义。

聚苯乙烯。 使用tetris.js查看和测试(版权所有(c)2006 Franck Marcia)您可以在原始源代码中看到游戏的暂停和恢复方法不是简单地实现为停止计时器,但它足以让达到您需要的解决方案!

答案 1 :(得分:0)

我不知道它是最好还是最有效的方式,但你可以创建一个window.pauseAll变量并将其设置为false:

window.pauseAll=false;

然后在调用ajax时将其设置为true:

window.pauseAll=true;
$.ajax({...});

然后为每个事件检查pauseAll是否为真,如果不是则执行脚本,否则不要

$('#element').click(function(){
    if(!window.pauseAll){
        //do the stuff you want
    }
});

然后在ajax调用完成后,再次将其设置为false

$.ajax().done(function(){
   window.pauseAll=false;
});