4

我有一个按钮可以进行一些繁重的计算,并且在我想刷新页面的计算步骤之间。

JavaScript:

.on('click', function() {
    // compute something

    jQuery('#page')
        .trigger('pageshow')
    ;

    // compute something

    jQuery('#page')
        .trigger('pageshow')
    ;

    // compute something
}

遗憾的是,这不起作用,因为- 事件在完成pageshow后被触发.on(click)

有没有办法强制.trigger(...)立即执行?

JavaScript - 丑陋的解决方案:

.on('click', function() {
    // compute something

    window.setTimeout(function() {
        // compute something

        jQuery('#page')
            .trigger('pageshow')
        ;

        window.setTimeout(function() {
            // compute something

            jQuery('#page')
                .trigger('pageshow')
            ;
        }, 1);
    }, 1);
}

丑陋的解决方案会起作用,但真的很丑陋。还必须实施检查.on('click', ...)- 事件在被触发时是否被完全计算。

JavaScript - 更漂亮但仍然丑陋的解决方案:

var functionFirst = function() {
    // compute something

    jQuery('#page')
        .trigger('pageshow')
    ;

    window.setTimeout(functionSecond, 1);
};

var functionSecond = function() {
    // compute something

    jQuery('#page')
        .trigger('pageshow')
    ;

    window.setTimeout(functionThird, 1);
};

var functionThird = function() {
    // compute something

    jQuery('#idJqGame')
        .trigger('pageshow')
    ;
};

window.setTimeout(functionFirst, 1);

更漂亮但仍然丑陋的解决方案基本上与丑陋的解决方案做同样的事情 - 它更容易阅读,因此到目前为止我一直在使用这个。

4

2 回答 2

2

JavaScript 解释器是围绕“事件循环”构建的。由于这种设计以及解释器在单个线程中运行,所有事件都按顺序处理。

如果在您的应用程序设计中可能,请尝试定期调用页面刷新而不是事件。

如果您可以保证您的应用程序只能在现代浏览器上运行,另一种选择是将“繁重的计算”转移给网络工作者。更多信息在这里:https ://developer.mozilla.org/en/Using_web_workers

编辑1:

根据http://dev.opera.com/articles/view/timing-and-synchronization-in-javascript/的“嵌套事件”部分,只要您使用本机浏览器,就有可能实现您想要的将您的事件排队的功能

另一个优雅的解决方案可能是利用事件的顺序处理。将您的“繁重计算”移至事件处理程序。然后交替推送 'compute' 和 'pageshow' 事件,以便交替调用它们。这就是说,恐怕这会导致页面看起来没有响应,因为常规 DOM 事件也会.

编辑2:

刚刚发现这个:http ://api.jquery.com/queue/可能会有所帮助。

于 2012-07-13T17:33:08.243 回答
1

很抱歉,丑陋的解决方案是最好的解决方案。
它可以被美化,但底线是你需要将你的代码分成更小的块,以便有可能控制它们。

于 2012-07-15T17:15:55.873 回答