例如,我在页面上有一些选项卡。我有一些一般的代码来处理选项卡,当用户点击它时,将选项卡设置为“活动选项卡”。
$('a.tab').click(function() { $(this).parent('div').find('a.tab').removeClass('activeTab'); $(this).addClass('activeTab'); });
对于一组特定的选项卡,我可能有一个处理程序:
// handler-1 $('div#myTabs a.tab').click(function() { do_something(); }); function do_something() { var type = $('div#myTabs a.activeTab').data('type'); do_something_else(type); }
do_something()可能会响应其他操作,除了点击选项卡,但无论如何被调用,它都想知道活动选项卡是否可以继续。
我的问题是,如果它被“// handler-1”下的代码调用,那么’activeTab’类可能还没有被重新设置,所以它为’type’检索的值仍然是从任何被选择的标签之前点击这一个。
我这样解决了:
// handler-1 $('div#myTabs a.tab').click(function() { set_timeout( function() { do_something(); },100); });
这看起来像是太多的污泥来满足我。如何知道定时器事件处理程序只有在所有其他处理程序轮到之后才会被调用?当然,我可以将“100”改为“1000”甚至“10000”,但是我也会更加确定性地交易表现(并且仍然没有确定性,因为在机器上的浏览器实例上甚至10秒可能还不够瘫痪足够)。
我已经看到几种可能的解决方案:
> How to order events bound with jquery
> Binding multiple events in jQuery
但这些都不足以满足我的需求。我不是想让一个处理程序首先运行。相反,我想要这样的东西:
function do_something() { $.when_all_other_events_have_been_handled(function() { do_something(); }); });
有这样的事情吗?
我看过$ .fn.when(arg).done(),但什么时候?在这种情况下,“arg”必须是一个延迟对象,执行任何已经在运行队列中的对象。一个Catch-22!
Sproutcore有一些像“engine.run()”(不记得确切的名称),只有当“引擎”中的所有其他事件被处理时才会返回,但是我在jQuery中找不到任何类似的东西。 (http://api.jquery.com/category/events/)。如果有人知道这样的事情,请让我知道!
谢谢! 原文链接:https://www.f2er.com/jquery/182523.html