js - 奇怪的回调探索
做一个手机端页面是发现的奇怪的问题,函数调用的问题(回调)。
一句话描述: 某一个dom元素绑定的事件函数在全局能trigger方法调用,但是在ajax成功回调函数里不能被trigger方法调用。
具体例子:
图中的tab栏,4个选项,每个选项都绑定了click事件,点击的时候会变蓝,其他事白色。

页面最开始是第一个选项蓝色。
<div class="tabModule">
<div class="tabItem active"><span>签到</span</div>
<div class="tabItem "><span>待办事项</span></div>
<div class="tabItem "><span>反馈信息</span></div>
<div class="tabItem"><span>签退</span></div>
</div>
我给每个div.tabItem元素绑定click事件,函数handleClick
$('.tabItem').on('click', handleClick);
function handleClick() {
$(this).addClass('active').siblings('.active').removeClass('active');
}
我在全局里面调用trigger 方法来触发第二个选项的click事件。
$('.tabItem:nth-child(2)').trigger('click')
结果显示正确

当我将这个表达式写进ajax成功回调时,这个表达式还是能成功执行了。
$.sendAjax(baseURL + url.signIn.signInSave,{actionId: '1-O7TGF' , jingdu: 121.385499, weidu: 31.269935, type: '签到'},function(){
setTimeout(function(){
$('.tabItem:nth-child(2)').trigger('click')
},200)
})
这是我封装的ajax,最后的方法是成功回调。
但是,当我在页面中添加个按钮并且给这个按钮增加一个方法,此方法中含有这个ajax函数。 这时ajax成功了但是没有执行 trigger表达式。


代码如下:
$('.punchBtnOut').on('click', function () {
$.sendAjax(baseURL + url.signIn.signInSave, {actionId: '1-O7TGF', jingdu: 121.385499, weidu: 31.269935, type: '签到'},
function () {
setTimeout(function () {
$('.tabItem:nth-child(2)').trigger('click')
}, 200)
})
});
加入一些测试来确定一下问题发生位置。
$('.tabItem').on('click', handleClick);
function handleClick() {
console.log('click被触发');
$(this).addClass('active').siblings('.active').removeClass('active');
}
$('.punchBtnOut').on('click', function () {
$.sendAjax(baseURL + url.signIn.signInSave, {actionId: '1-O7TGF', jingdu: 121.385499, weidu: 31.269935, type: '签到'},
function () {
console.log('成功回调被执行');
setTimeout(function () {
console.log('延时函数被执行');
$('.tabItem:nth-child(2)').trigger('click')
}, 200)
})
});
结果是

可以看到click函数 handleClick 没有被触发。
通过比较可以看出这个问题的关键处在了这个按钮的点击事件上面。
我们将中间的ajax和延时去掉,当点击按钮的时候直接触发 trigger方法
$('.punchBtnOut').on('click', function () {
console.log('点击执行');
$('.tabItem:nth-child(2)').trigger('click')
});
结果是 输出点击执行,tab栏没有发生变化。
真正的原因。我找到了一个一解决的办法。
handleClick.bind($('.tabItem:nth-child(2)')[0])
用bind方法来产生个新函数,在点击的时候调用
js - 奇怪的回调探索的更多相关文章
- js中的回调函数的理解和使用方法
js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...
- 【转】第5篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+委托回调方法分析
作者: 牛A与牛C之间 时间: 2013-11-19 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第5篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- node.js如何使用回调
Node.js到处使用回调,尤其在有I/O(输入/输出)操作的地方. 下面是在一个Node.js中使用filesystem模块中从磁盘上读入文件内容示例一: var fs = require('fs' ...
- node.js中的回调
同步和阻塞:这两个术语可以互换使用,指的是代码的执行会在函数返回之前停止.如果某个操作阻塞,那么脚本就无法继续,这意味着必须等待. 异步和非阻塞:这两个术语可以互换使用,指的是基于回调的.允许脚本并行 ...
- JS中的回调函数实例浅析
本文实例讲述了JS中的回调函数.分享给大家供大家参考,具体如下: 在说回调函数之前,不妨先看一段代码,相信有点js基础的同学都能明白他的含义: ? 1 2 3 document.getElementB ...
- Node.js标准的回调函数
Node.js标准的回调函数:第一个参数代表错误信息,第二个参数代表结果. function (err, data) 当正常读取时,err参数为null,data参数为读取到的String.当读取发生 ...
- [JS奇怪的世界]No.55 危險小叮嚀:陣列與for in
前言 前面已經瞭解了使用內建函數建構子的某些危險地方,但其實陣列與for in,也是有一些危險的地方. 陣列與for in 在前面幾個章節有講過陣列就是物件,所以我們一樣可以使用 for in來做處理 ...
- 关于js的callback回调函数的理解
回调函数的处理逻辑理解:所谓的回调函数处理逻辑,其实就是先将回调函数的代码 冻结(或者理解为闲置),接着将这个回调函数的代码放到回调函数管理器的队列里面. 待回调函数被触发调用的时候,对应的回调函数的 ...
- JS的异步回调函数
hi :)几日不见,趁着周末和父母在广州走走逛逛,游山玩水,放松身心,第一天上班就被一个问题难住了,不废话,以下是关于JS函数回调方面的知识,今天的查阅看的也是一知半解,摘录下来日后慢慢琢磨! js中 ...
随机推荐
- Bootstrap <基础二十八>列表组
列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...
- python学习09——字典(3)
今天写了一道python字典题目,用了上次字典(2)中的方法,代码如下: json = {', 'IP':'10.0.0.1'} def find_value(themap, word): if wo ...
- Android中Activity加入Fragment使用注意事项及常用技巧
Fragment中AlertDialog弹出窗口的使用 Fragment默认不具有Content的一些方法和属性,因此在Activity中可以使用的一些方法在Fragment中使用就需要一些小技巧了 ...
- 干货分享:MySQL之化险为夷的【钻石】抢购风暴
抢购钻石不稀奇,稀奇的是有钱赚不到,事情发生在2015年5月20日,大好的日子自然少不了商家的参与.即可为您还原现场,解决思路献给各位,请欣赏Show Time,everybody~ 1.优化起因及工 ...
- Python的入门要点
一.输入 1.键盘输入 在python 2.7中,不用input(),而用 raw_input()读入一行键盘输入,并转化为字符串. s = map(int ,raw_input().split()) ...
- golang调用EXE
我是win7+go1.7+liteide,调用calc.exe package main import ( "os/exec" ) func main() { datapath : ...
- php 的txt操作,加入类容
<?php $fr=fopen("./data/test.txt",'a'); //fopen(位置,打开方式) if(!$fr) { echo " error&q ...
- 【转帖】Python在大数据分析及机器学习中的兵器谱
Flask:Python系的轻量级Web框架. 1. 网页爬虫工具集 Scrapy 推荐大牛pluskid早年的一篇文章:<Scrapy 轻松定制网络爬虫> Beautiful Soup ...
- 【转】Linux查看机器负载
转自 http://blog.csdn.net/szchtx/article/details/38455385 感谢 负载(load)是Linux机器的一个重要指标,直观了反应了机器当前的状态.如果机 ...
- JavaScript中style, currentStyle和 getComputedStyle的异同
今天在做项目的时候,习惯性的用到了element.style.width,然而浏览器却报错,错误提示是style is undefined,这是我才意识到,内联样式表和外联样式表在js应用中也有很大的 ...