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中 ...
随机推荐
- daydayup2 codeforces143D
这题很考察分析 题意:让你构造n*m的矩阵,使得不存在两个点的距离的平方为5 1若n=1 ,答案为m 2若m=1,答案为n 3若n=2 则这样 110011001100.. 110011001100 ...
- Android扫盲教程大全经典教程全分享
Android扫盲教程大全经典教程全分享,相当于android的简单用户手册下载路径 Android扫盲教程大全经典教程全分享.rar
- Codeforces Round #313 (Div. 1)
官方英文题解:http://codeforces.com/blog/entry/19237 Problem A: 题目大意: 给出内角和均为120°的六边形的六条边长(均为正整数),求最多能划分成多少 ...
- Delphi: 有关Form处理 :需要调用的时候进行调用。
if not Assigned(frmAppServer) then frmAppServer := TfrmAppServer.Create(Application); frmAppServer.S ...
- android-自定义控件之液位指示器
由于安卓应用很广泛,在工业中也常有一些应用,比如可以用安卓来去工业中的一些数据进行实现的监测,显示,同时可以做一些自动化控制,当然在这里,我不是做这些自动化控制方面的研究,只是做一个控件,液位指示,其 ...
- hihoCoder#1121
刚开始学习C语言,准备在做hiho的题目的过程中来学习,在此进行记录,如果代码中有错误或者不当的地方还请指正. 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我 ...
- Error Domain=ASIHTTPRequestErrorDomain Code=8 "Failed to move file from"xxx/xxx"to"xxx/xxx"
今天真的好高兴呀 我解决了一个折磨了我一周的问题,真的是激动地要哭出来了,为了这个问题,我嘴也烂了,头发抓了一地啊.虽然解决方法,最后还是展现出了“百度”的伟大,但是我还是很开心,在这里我展示一下我的 ...
- [DPDK][转]DPDK编程开发(4)—lcore
1.知识百科 返回值 操作函数 函数功能 RTE_DECLARE_PER_LCORE (unsigned, _lcore_id) RTE_DECLARE_PER_LCORE (rte_cpuset_t ...
- B2C电子商务基础系统架构解析(转载)
系统的开发与演化,前台严格follow消费者的购买流程,后台则盯牢订单流转,牢牢抓住这两条主线,才能高屋建瓴的看清B2C的逻辑链和数据流,更深刻的规划功能模块,从而更有效支撑实际业务的流转. 前台 前 ...
- 如何布局包含Image和Title的UIButton
UIButton中的titleEdgeInsets和imageEdgeInsets可以管理button中image和title的布局.如果对其理解不够深入,用纯数字进行布局管理,经过不断的调试,还是能 ...