做一个手机端页面是发现的奇怪的问题,函数调用的问题(回调)。

  一句话描述: 某一个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 - 奇怪的回调探索的更多相关文章

  1. js中的回调函数的理解和使用方法

    js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...

  2. 【转】第5篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+委托回调方法分析

    作者: 牛A与牛C之间 时间: 2013-11-19 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第5篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  3. node.js如何使用回调

    Node.js到处使用回调,尤其在有I/O(输入/输出)操作的地方. 下面是在一个Node.js中使用filesystem模块中从磁盘上读入文件内容示例一: var fs = require('fs' ...

  4. node.js中的回调

    同步和阻塞:这两个术语可以互换使用,指的是代码的执行会在函数返回之前停止.如果某个操作阻塞,那么脚本就无法继续,这意味着必须等待. 异步和非阻塞:这两个术语可以互换使用,指的是基于回调的.允许脚本并行 ...

  5. JS中的回调函数实例浅析

    本文实例讲述了JS中的回调函数.分享给大家供大家参考,具体如下: 在说回调函数之前,不妨先看一段代码,相信有点js基础的同学都能明白他的含义: ? 1 2 3 document.getElementB ...

  6. Node.js标准的回调函数

    Node.js标准的回调函数:第一个参数代表错误信息,第二个参数代表结果. function (err, data) 当正常读取时,err参数为null,data参数为读取到的String.当读取发生 ...

  7. [JS奇怪的世界]No.55 危險小叮嚀:陣列與for in

    前言 前面已經瞭解了使用內建函數建構子的某些危險地方,但其實陣列與for in,也是有一些危險的地方. 陣列與for in 在前面幾個章節有講過陣列就是物件,所以我們一樣可以使用 for in來做處理 ...

  8. 关于js的callback回调函数的理解

    回调函数的处理逻辑理解:所谓的回调函数处理逻辑,其实就是先将回调函数的代码 冻结(或者理解为闲置),接着将这个回调函数的代码放到回调函数管理器的队列里面. 待回调函数被触发调用的时候,对应的回调函数的 ...

  9. JS的异步回调函数

    hi :)几日不见,趁着周末和父母在广州走走逛逛,游山玩水,放松身心,第一天上班就被一个问题难住了,不废话,以下是关于JS函数回调方面的知识,今天的查阅看的也是一知半解,摘录下来日后慢慢琢磨! js中 ...

随机推荐

  1. 修改Linux默认启动级别或模式的方法

    冲动的惩罚: 海阔天空: 在linux系统的7种启动级别,默认为X-Window,类似于Windows的窗口模式. 如何修改或变更linux的默认启动级别或模式呢? 以root身份进入Linux,修改 ...

  2. 非Spring下的Quartz

    转自:Nick Huang.    http://www.cnblogs.com/nick-huang/ 阅读目录 > 参考的优秀资料 > 版本说明 > 简单的搭建 > 在We ...

  3. linux与php时间函数有关的错误解决

    最近在程序里写了不少获取时间或时间戳的函数date() strtotime()等,但是把程序拿到linux上运行却爆出这些函数的错误,具体原因是因为linux本身的时间设置以及php的时区问题. 先确 ...

  4. Jmeter性能测试入门(转)

    出处:http://www.cnblogs.com/by-dream/p/5611555.html Jmeter性能测试步骤 1. 添加线程组之后,先设置这两项: 2. 添加一个http请求 被测的u ...

  5. Haskell Platform (windows)

    一.下载地址:https://www.haskell.org/platform/windows.html Haskell Platform 整合了 Glasgow Haskell Compiler,W ...

  6. struts文件上传、文件下载

    文件上传 如果在表单中上传文件,表单的enctype属性为multipart/form-data struts默认上传文件大小为2M,如果需要修改,在配置文件中设置 <constant name ...

  7. 作业8 Alpha阶段项目总结

    我们的扫雷游戏已经基本完成. 游戏共分3个难度 每个难度的格数和雷的格数也有不同 具体的游戏会在展示时候让大家看到 小组成员分数: 史劭聪 20分 马浩然 20分

  8. firefox,跨域ajax 调用方法

    在A站点ajax 调用B站的页面(方法)时, 使用post,且dataType类型为jsonp 有时在IE会有No Transport的错误提示,请加 jQuery.support.cors = tr ...

  9. StoryBoard解惑

    可以把StoryBoard看做是一组viewController对应的xib,以及它们之间的转换方式的集合.在StoryBoard中不仅可以看到 每个ViewController的布局样式,也可以明确 ...

  10. GoldenGate针对OEM 13.1的版本发布

    OGG 针对OEM(Oracle Enterprise Manager) 13.1的插件已经可以从这里下载: http://www.oracle.com/technetwork/middleware/ ...