zoukankan      html  css  js  c++  java
  • 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方法来产生个新函数,在点击的时候调用

        

  • 相关阅读:
    转角色权限系统的一些概念
    error message cs0012
    关于Action返回结果类型的事儿(下)
    MVC中权限的知识点及具体实现代码
    iis7 发布mvc3 遇到的HTTP错误 403.14Forbidden Web 服务器被配置为不列出此目录的内容及Login on failed for "IIS APPPOOL\ASP.NET v4.0"问题
    关于获取时间段的整理片段
    ASP.NET MVC – 关于Action返回结果类型的事儿(上)
    Lucene 查询权重排序因子解释(备查)
    Lucene代替SQL Server NewGuid获取随机结果
    如何在Web数据挖掘中保证用户访问速度的一点实践(SQLite+Quartz)
  • 原文地址:https://www.cnblogs.com/pipu-qiao/p/5945864.html
Copyright © 2011-2022 走看看