Javascript 如何立即强制执行.trigger(…)?

Javascript 如何立即强制执行.trigger(…)?,javascript,jquery,jquery-mobile,Javascript,Jquery,Jquery Mobile,我有一个按钮,可以进行一些繁重的计算,在计算步骤之间,我想刷新页面 JavaScript: .on('click', function() { // compute something jQuery('#page') .trigger('pageshow') ; // compute something jQuery('#page') .trigger('pageshow') ; // compute

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

JavaScript:

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

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

    // compute something

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

    // compute something
}
.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);
}
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);
遗憾的是,这不起作用,因为
pageshow
-事件是在
.on(单击)
完成后触发的

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

JavaScript-丑陋的解决方案:

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

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

    // compute something

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

    // compute something
}
.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);
}
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);
丑陋的解决方案会奏效,但实际上相当丑陋。还必须执行检查('click',…)-事件在触发时是否完全计算

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

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

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

    // compute something

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

    // compute something
}
.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);
}
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);

更漂亮,但仍然丑陋的解决方案基本上与丑陋的解决方案做相同的事情-它只是更容易阅读,因此我目前正在使用这个解决方案。

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

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

如果你能保证你的应用程序只能在现代浏览器上运行,另一个选择是把“繁重的计算”转移到一个网络工作者身上。更多信息请点击此处:

编辑1:

根据的“嵌套事件”一节,如果您使用本机浏览器功能对事件进行排队,则可能实现您想要的结果

另一个优雅的解决方案是利用事件的顺序处理。将“繁重计算”移动到事件处理程序。然后交替地推送“compute”和“pageshow”事件,以便交替地调用它们。 也就是说,我担心这会导致页面看起来没有响应,因为正常的DOM事件也会在之后排队

编辑2:


刚刚发现:可能会有帮助。

很抱歉,丑陋的解决方案是最好的。

它可以被美化,但底线是你需要把你的代码分成更小的块,以便有可能控制它们

window.setTimeout(jQuery('#page').trigger('pageshow'),1)有帮助吗?在settimeout中传递的代码将从代码流执行中删除。遗憾的是,它不会这样工作。我已经添加了一个丑陋的解决方案,使用.setTimeout(…)它将如何工作-但这只是一个丑陋的方式。谢谢你的回复-不幸的是,我已经知道你提到的所有事情,我不能选择定期页面刷新,也不能选择网络工作者。@SimonN。我的编辑是否为您带来了新的选项?您试图实现的内容与JavaScript的内部功能密切相关…再次感谢-dispatchEvent只能与createEvent结合使用,因为我不知道如何创建pageshow事件,所以我有点卡住了。创建自己的计算事件也不是一个选项,因为我仍然需要防止多次单击。最后,jQuery.queue(…)应该只用于视觉效果。这真是太可悲了——至少现在我知道没有“好”的解决方案。谢谢大家!