.hasClass.在第二次. Click之前不注册函数调用.ajax异步
.hasClass on.click not registering for a function call until a second .click..ajax async?
一些复选框按钮(使用bootstrap)触发ajax get调用。单击,选中按钮的活跃度提供了一种过滤机制。
现在,为什么过滤只在。单击第二个单击事件(如果单击btn1,则ajax运行,带有/.one.two.three…只有当btn2随后被点击时,它才注册为/.two.three…只有当btn3随后被点击,它注册为/. 3…?http://jsfiddle.net/ENJH9/2/
或者,如果在refreshData()调用之前删除类on。单击,数据被正确地提供,但是视图没有反映removeClass!?http://jsfiddle.net/ENJH9/3/
所有按钮都以一个活动类(http://getbootstrap.com/javascript/#buttons):
)开始<div class="btn-group" data-toggle="buttons" id="theBtns">
<label class="btn btn1 active">
<input type="checkbox">one
</label>
<label class="btn btn2 active">
<input type="checkbox">two
</label>
<label class="btn btn3 active">
<input type="checkbox">three
</label>
<label class="btn btn4 active">
<input type="checkbox">four
</label>
</div>
下面是每个按钮的。click事件之后的。get调用:
function refreshData() {
console.log('started refreshData()')
URL = '';
var filtering = function() {
if($(".btn1").hasClass("active")) { URL += ".one"; }
if($(".btn2").hasClass("active")) { URL += ".two"; }
...
console.log('done filtering: ' + URL);
return URL;
};
$.when( filtering() ).done(function() {
console.log('now data refresh with %s filtering', URL)
$.ajax({
url:"http://localhost:4200/api/v1/data" + URL,
method:'get',
success: foundAllSuccess,
error: foundError
})
});
}
下面是带有removeClass注释的click事件(按钮仍然保持视觉活动,类仍然保持在检查器中,但服务器通过这种设置准确地过滤):
$( ".btn1" ).click(function() {
// if($(".btn1").hasClass("active")) {$(".btn1").removeClass("active"); console.log('hide btn1 data');}
// else {$(".btn1").addClass("active"); console.log('btn1 data active');}
refreshData();
}); // .btn1.click
首先,出现问题的主要原因是bootstrap和jQuery不能很好地结合在一起——至少在本例中不是这样。jQuery的click事件分派得如此之早,它发生在bootstrap切换为"active"之前。因此,refreshData()
在点击之前的按钮状态下工作,而不是在点击之后。这可以用timeout()
来克服,延迟refreshData()
的执行,直到bootstrap完成它的事情。
其次,您不需要切换active
,因为bootstrap会照顾这方面。
第三,通过更好地利用jQuery可以更有效地编写代码。
function refreshData(e) {
var URL = $(e.target).closest(".btn-group").find("label").map(function (i) {
if ($(this).hasClass("active")) {
return ['.one', '.two', '.three', '.four'][i];
} else {
return null;
}
}).get().join(''); //.map() returns an array, .join() concatenates the strings in the array into a single string.
alert('now ajax call with filtering :' + URL);
}
$("#theBtns .btn").on('click', function (e) {
setTimeout(function () {
refreshData(e);
}, 0);
});
注意,对于我们的目的来说,即使延迟为零也足够了,因为从setTimeout
执行的代码将在当前线程运行完成后尽早在单独的事件线程中运行。
可能有一种更"引导"的方式来达到同样的目的,但我不打算通过大量的引导文档来寻找。
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 在输入字段上有两个函数调用,一个在Blur上,一个不在Angular中
- 如何在Javascript函数调用中循环变量
- Javascript:应为赋值或函数调用,但实际看到的却是表达式
- 如何远程检查JavaScript应用程序的函数调用堆栈
- javascript函数调用不起作用
- 为什么这个函数调用会破坏程序并导致未定义的变量
- 如何通过函数调用设置图像的src
- 从全局函数调用Ember控制器上的方法
- 为什么Jquery$.ajax在函数调用中触发所有statusCode,即使调用成功
- JavaScript函数调用(arg1)(arg2)
- 打印链接时,将javascript函数调用到链接中
- 在函数调用中封装数据除了隐藏数据之外还有什么优点
- 无法从JavaScript中的函数调用对象属性
- 对中的函数调用进行排序是回调的唯一方法
- 函数调用方法有什么用
- Javascript:JSHint:应为赋值或函数调用,但实际看到的却是表达式
- HTML5(Bootstrap)通过函数调用运行动画
- Q promise:都是按注册顺序调用的回调函数
- .hasClass.在第二次. Click之前不注册函数调用.ajax异步