为什么这些功能重复出现
Why are these functions recurring?
如果我执行下面函数的步骤1两次(每一次都会触发步骤2、3、6),那么我希望能够执行一次步骤4,而不会重复执行与我执行步骤1相同的次数(步骤4会触发步骤5和6)。
为什么步骤4(及其以下功能)重复执行步骤1(及其以下函数)的次数相同?
$(function(){
var selected = [], clickHandler;
var el = document.getElementById("user_search_tags");
el.addEventListener("click", returnSelected, false);
// step 1
$('#people_search_mobile').change(function() {
console.log(1);
$('li a', $('#suggestions')).bind('click.autocomplete', clickHandler);
});
// step 2
function clickHandler() {
console.log(2);
selected.push($(this).text());
returnSelected(selected);
queryMaker(selected);
}
// step 3
function returnSelected(selected) {
console.log(3);
tagRemover(selected);
}
// step 4
function tagRemover(selected) {
$('.search-tag').click(function(){
console.log(4);
$(this).hide();
spliceAndSearch($(this).text(), selected);
})
}
// step 5
function spliceAndSearch(removed, selected) {
console.log(5);
selected.splice(selected.indexOf(removed), 1);
queryMaker(selected);
}
// step 6
function queryMaker(selected) {
$('#uquery').val(selected);
$.get(this.action, $('#people_search_mobile').serialize(), null, 'script');
$('#uquery').val('').focus();
console.log(6);
return false;
}
});
以下是我的控制台日志摘要(步骤为数字):
12.3.6.1.2.3.6.4.5.6.4.5.6.3
谢谢。
解决方案
$(function(){
var selected = [];
var clickHandler;
$('#people_search_mobile').change(function() {
$('li a', $('#suggestions')).bind('click.autocomplete', clickHandler);
});
$('body').on('click', '.search-tag', tagRemover);
function tagRemover() {
$(this).hide();
console.log(selected);
selected.splice(selected.indexOf($(this).text()), 1);
queryMaker(selected);
}
function clickHandler() {
selected.push($(this).text());
returnSelected(selected);
queryMaker(selected);
}
function returnSelected(selected) {
var saySelected = function() { alert(selected); }
return saySelected;
}
function queryMaker(selected) {
$('#uquery').val(selected);
$.get(this.action, $('#people_search_mobile').serialize(), null, 'script');
$('#uquery').val('').focus();
return false;
}
});
clickhandler(2)调用returnselected(3)调用tagRemover(4)调用spliceAndSearch(5)调用queryMaker(6)
tagRemover只有在搜索标签匹配的情况下才会记录4,所以你的控制台日志有点欺骗性
您已经将步骤1(以及步骤4)绑定到一个"更改"函数,因此它们运行相同次数几乎是不可避免的。
步骤4实际上并没有执行日志记录、隐藏和拼接,而是将它们连接到.search-tag
元素的click
事件。
从这个角度来看,再次查看您的代码,并找出您应该以什么顺序运行这些代码。
您可以创建一个名为once
的全局变量,并将其设置为1。然后,在步骤3中围绕tagRemover(selected);
进行if
语句,检查是否为once == 1
。然后,在if语句内部设置once = 0
一次,使其不再执行。
相关文章:
- 为什么ng控制器不调用或工作或功能不工作
- 为什么获胜'我的自定义功能工作
- 为什么可以't我访问Chrome内置功能$
- 为什么是FB.注销用户功能不会重定向到我告诉它的 URL
- 为什么我的流星每个功能都不起作用
- 为什么同步睡眠功能没有被承诺内异步化
- 为什么Jquery点击功能需要2次点击
- 为什么这个功能打印“;未定义的未定义的“;作为联系人名称,添加“新对象”
- 为什么不是'我的修剪功能不起作用
- 为什么这个排序功能在 Safari 中不起作用
- 为什么我不能使用jQuery功能
- 为什么字符串类型返回功能
- 为什么Chrome在“严格模式”下使用块内的功能时仍然保持沉默
- 为什么本机浏览器排序功能的工作速度比快速排序慢
- 我在警报框中得到了功能代码,为什么会这样
- 为什么在使用箭头键时,打开更改功能不适用于我的范围滑块
- 为什么不是't点击按钮时执行的功能
- 我的数字检查器功能不起作用,为什么
- 功率功能.为什么在循环开始时将结果设置为1
- jQuery似乎有一个启用功能,但没有禁用功能.为什么