如何仅在事件按特定顺序发生时触发jquery事件处理程序
How to trigger jquery event handler only if events happened in a specific order?
我有以下情况。我在MarionetteJS中使用Bootstrap选项卡。每当触发选项卡单击事件时,我只想在为该选项卡触发show.bs.tab事件后调用我的处理程序。如果只触发shown.bs.tab事件,我不想触发我的处理过程,因为有时我会通过调用tab("ow")方法以编程方式显示特定的选项卡。
所以基本上只调用处理程序后的事件click->show.bs.tab
我让它工作的方式如下:
var clicked = false;
this.$el.on('click', 'a[data-toggle="tab"]', function(e) {
clicked = true;
});
this.$el.on('shown.bs.tab', 'a[data-toggle="tab"]', function(e) {
if (clicked === true) {
var moduleId = $(this).attr("data-module");
App.vent.trigger("resultTabClicked", {
module: moduleId
});
}
clicked = false;
});
这与优雅的解决方案相去甚远,有更好的方法来实现这一点吗?也许有承诺?
如果想要避免全局变量,可以将数据附加到元素本身。
this.$el.on('click', 'a[data-toggle="tab"]', function(e) {
$(this).data('clicked', true);
});
然后
if ($(this).data('clicked') === true) {
...
}
.data()是一个jQuery方法,但您可以附加任何您认为合适的状态
您可以将handler
附加到两个事件,然后使用event.type
和event.timeStamp
来跟踪事件发生的顺序。在公共处理程序中,timestamp
最高的事件发生在最后;这将有助于确定何时达到正确的顺序,从而激发所需的代码。请参阅下面的概念验证演示:
$(function() {
var times = {click:0,mouseenter:0,mouseleave:0};
$('div.mydiv').on('mouseenter mouseleave click', function(e) {
times[e.type] = e.timeStamp;
$('div.out').text( JSON.stringify( times ) );
});
});
div
{
padding: 20px;
margin: 10px;
border:1px solid #000;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="mydiv">hover or click HIRE</div>
<div class="out"></div>
相关文章:
- 用程序搜索JQuery数据表中的文本
- 页面加载之前的jQuery Ajax加载程序
- 使用jquery.load('pageName')方法时,未从应用程序缓存加载Html页
- 在web应用程序中的新搜索中重新加载搜索结果(不带jQuery)
- 滚动到Rails 4应用程序中的顶部jQuery
- 实现延迟的jquery更改事件处理程序
- 如何使jQuery的“bind”或“on”事件处理程序幂等
- Backbone listenTo不将jquery函数作为处理程序进行激发
- Jquery事件处理程序仅适用于匿名函数
- 应用程序在呈现Jquery Mobile之前显示无样式的Html
- 使用jquery删除输入框上的外部处理程序/库
- 如何在jQuery事件处理程序中存储和重用超时
- 访问离线jquery应用程序中的本地文件
- 我可以't使用jQuery更改工具提示引导程序的位置
- 为什么有些jQuery程序员使用像$.get、$.getJSON和$.when这样的jQuery函数来代替$.ajax
- jQuery,引导程序下拉列表问题
- jQuery$.ajax扩展程序XDomainRequest
- jQuery在页面加载时分配点击事件处理程序
- jQuery 事件处理程序堆叠
- jQuery程序不工作