那么......在你发表评论之后,这改变了一切。
你不能让它在任何 javascript 运行时自动显示,因为没有真正的钩子。.trigger()
但是,您可以通过使用和使用您自己的自定义事件来利用 jquery 自.bind()
定义事件。
function myFunctionThatDoesSomething() {
$('body').trigger('Custom.BeginWork');
// Do Something ...
$('body').trigger('Custom.EndWork');
}
尽管长时间运行的操作可能应该异步完成,因此它们不会阻塞事件:
$("#Something").click(function() {
$('body').trigger('Custom.BeginWork');
setTimeout(function() { DoWorkFunction(/* you can pass params here if you need */); }, 0);
// Causes it to be executed in the background 0ms from now
});
function DoWorkFunction() {
// Stuff...
$('body').trigger('Custom.EndWork');
}
然后注册一个.bind()
事件,就像.ajaxStart()
和.ajaxStop()
$('#Working').bind('Custom.StartWork', function() {
$(this).show();
});
$('#Working').bind('Custom.EndWork', function() {
$(this).hide();
});
这是一个有效的 jsFiddle 示例。
更新:
在您的 jsFiddle 中,您已经完成了 double setTimeout
。这里:
setTimeout(function() {
// Call Operation Here
try { setTimeout(function () { LongRunningOperation(10000); }, 1000);
}
finally
{
$("body").trigger('Custom.End');
}
}, 50); // 50ms delay because some browsers *cough*IE*cough* are slow at rendering dom changes
这转化为:
因此,Custom.End
事件在安排长时间运行的函数运行后被触发,而不是在它完成时触发。setTimeout
是异步和非阻塞的。