为了账号安全,请及时绑定邮箱和手机立即绑定

闭包的问题中执行touchmove事件的问题

闭包的问题中执行touchmove事件的问题

wubin_work 2019-05-28 11:12:28
要求点击图片出现弹窗 弹窗出现的时候,根据图片高 > 屏幕高,来判断是否阻止底层滚动,现在问题是,当我第一次点击出现弹出层时候,图片高度可以获取到 判断也没问题 但是当我点击一个长图的时候,执行touchmove事件时候,图片高度出现了2种分别为第一次的弹窗图片240 跟最新的图片高度,我是在这里 执行完弹出层后执行回调函数getPopImgHeight, 我就不明白为什么再点击的时候回有上次的变量 ,而且 应该再出现弹出层的时候 不应该重新获取img的高度 吧上一个覆盖了吗?求大神帮忙解答下。。谢谢<div id="popup-box">    <div id="popclose"></div>    <div class="imgbox" id="imgbox">        <img src="">    </div>    <div class="h6box in"></div></div>var popBox = $('#popup-box'),    popImg = popBox.find('img'),    popText = popBox.find('.h6box');var screenH = $(window).height();function getPopImgHeight() {    var imgHeight = popImg.height();    console.log('原来的'+imgHeight);    $('#imgbox').on('touchstart', function() {        popText.attr('class', 'h6box out');    });    $('#imgbox').on('touchmove', function() {        console.log('imgHeight:' + imgHeight);        console.log(imgHeight < screenH);        if (imgHeight < screenH) { // 阻止滚动             console.log('1')             // return false;        } else { // 允许滚动             console.log('2')             // return true;        }    });}$('.baoImgQ').on('click', 'a', function() {    stopDefault();    var imgLen = $(this).find('img').length;    if (imgLen > 0) {        var imgSrc = getRealSrc($(this).attr('href'));        var hText = $(this).parent().next().next('h6').text();        console.log(imgSrc + ';' + hText);        addPopContent(imgSrc, hText);        popBox.fadeIn('fast', getPopImgHeight);    }});// 关闭时候重置$('#popclose').on('click', function() {    popBox.fadeOut('fast');    popImg.attr('src', '');    popText.text('').attr('class', 'h6box in').show();});function getPopImgHeight() {    var imgHeight = popImg.height();    console.log('原来的'+imgHeight);    $('#imgbox').on('touchstart', function() {        popText.attr('class', 'h6box out');    });    $('#imgbox').on('touchmove', function() {        console.log('imgHeight:' + imgHeight);        console.log(imgHeight < screenH);        if (imgHeight < screenH) { // 阻止滚动             console.log('1')             // return false;        } else { // 允许滚动             console.log('2')             // return true;        }    });}$('.baoImgQ').on('click', 'a', function() {    stopDefault();    var imgLen = $(this).find('img').length;    if (imgLen > 0) {        var imgSrc = getRealSrc($(this).attr('href'));        var hText = $(this).parent().next().next('h6').text();        console.log(imgSrc + ';' + hText);        addPopContent(imgSrc, hText);        popBox.fadeIn('fast', getPopImgHeight);    }});
查看完整描述

1 回答

已采纳
?
pardon110

TA贡献1038条经验 获得超227个赞

在js中闭包通常用来存储私有数据,它是普通函数的一种扩展。简单来说闭包函数引用了外层函数的局部就变量。正常情况下,函数调用完,函数内的临时局部变量在内存中的存储单元会被释放。但调用闭包不会,它会保留上次执行状态。从某种意义上来讲,闭包是有状态的函数。示例如下

fn = function(){
    var i = 0
    return function(){
        i++
        console.log(i)
    }
}
f = fn()
f() // 1
f() // 2
f() // 3

fn2 = function(){
    var i = 0
    console.log(i)
}
fn2(()   // 0
fn2()   // 0

换句话来说,你要注意js的函数嵌套,尤其是内层函数使用了外层函数中的局部变量的情况。

查看完整回答
反对 回复 2019-05-28
  • 1 回答
  • 0 关注
  • 640 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信