暂停Javascript ||冻结页面

Pause Javascript || Freeze page

本文关键字:冻结 暂停 Javascript      更新时间:2023-09-26

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

我玩了一个游戏,我用Javascript/jQuery通过Greasemonkey/Firefox定制。

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

我想我必须以某种方式停止一切,所有的javascript,完全冻结页面,直到我的ajax完成,但请记住,我不能控制/修改页面上的所有脚本。从我的经验来看……一切皆有可能,我错了吗?..谢谢你。

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

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;
        }
    }
});

我希望你能理解。

p。你可以在原始源代码中看到,游戏的暂停和恢复方法不是简单地执行为停止计时器,但它足以达到你需要的解决方案!

我不知道这是否是最好或最有效的方法但是你可以创建一个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;
});