【问题标题】:Events don't queue properly事件没有正确排队
【发布时间】:2016-04-26 07:00:30
【问题描述】:

我有这个代码http://jsfiddle.net/ee1xuaqs/1/

function long_running(status_div) { // does something for 2-3 seconds

    var result = 0;
    // Use 1000/700/300 limits in Chrome, 
    //    300/100/100 in IE8, 1000/500/200 in FF
    alert('running');
    for (var i = 0; i < 1000; i++) {
        for (var j = 0; j < 700; j++) {
            for (var k = 0; k < 300; k++) {
                result = result + i + j + k;
            } // end inner
        } // end outer for
    }

}

$('#do_ok').on('click', function () {
    $('#status_ok').text('calculating....');
    window.setTimeout(function (){ long_running('#status_ok') }, 1000);
    $('#status_ok').text('calclation done');
});

连同此 HTML:

<table border=1>
    <tr><td><button id='do_ok'>Do long calc</button></td>
        <td><div id='status_ok'>Not Calculating yet.</div></td>
    </tr>
</table>

现在,当我点击按钮时,会显示“计算完成”(“正在计算...”可能会闪烁一两毫秒)。

据我所知,$('#do_ok').on 中的这三个命令中的每一个都会创建一个单独的事件,两个用于更新 DOM,一个用于 setTimeout,它在 1 秒后完成。对于 jQuery DOM 更新命令,DOM 会立即更新,但是,它们也会创建像往常一样处理的 DOM 重绘事件(这是根据 highly voted SO answer)。由于我得到 ​​3 个事件,它们应该以适当的顺序执行,首先是“正在计算..”更新屏幕,然后是 long_running,然后是 calculation done

那么,为什么在执行 long_running 之前我会“完成计算”?

【问题讨论】:

  • 你已经用setTimeout 行完成了最接近javascript“产生一个新线程”的事情。很快有人会提供更详细的科学信息,但这个问题大约有 100 个重复项。
  • @Jamiec 100 个重复?你能指出一个吗?我还没有看到任何关于为什么渲染事件优先于计时事件的问题。
  • 我看到“为什么 X 在 Y 之前发生”(其中 Y 是对 setTimeout 的调用)的次数是无法估量的。我现在要去找他们吗,可悲的是没有!

标签: javascript jquery dom jquery-events


【解决方案1】:

点击回调执行如下:

  1. $('#status_ok').text 设置为 'calculating....'
  2. setTimeout 将您作为参数传递的函数设置在一边,以便在超时后执行它。
  3. $('#status_ok').text 设置为 'calculation done'
  4. 一秒钟过去了,传递给setTimeout的函数就会被执行

$('#status_ok').text('calculation done') 应该在setTimeout 函数中才能正常工作。

【讨论】:

  • 这不是 jQuery 函数的工作方式。是的,DOM 已更新,但会向渲染器发送一个事件以显示更新后的 DOM。这不是一项操作。
  • jQuery 函数的工作方式与任何其他 JS 函数的工作方式完全相同。试试这个简单的例子:(function () { console.log('First'); window.setTimeout(function () { console.log('Second'); }, 1000); console.log('Third'); })(); 输出将是First, Third, Second
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多