js对象回收机制的疑问

先上一个项目照吧:

clipboard.png
就是这三个图片上传的需求,我引用了一个插件photoClip.js。
下面是html:

clipboard.png
html图片裁剪弹框:

<div class="ckphoto" style="display: none;">
                <div class="ckcon">
                    <div class="ckhead">
                        <div class="ckback flex f_center"><img class="icon" src="../img/jiao01.png" /></div>
                        <div class="cktit">选择图片</div>
                    </div>
                    <div class="ckphbox">
                        <div class="ckimg" id="ckimg"></div>
                    </div>
                    <div class="ckdown">
                        <div class="list lits">
                            <div>选择图片</div>
                            <input type="file" class="ckpho" id="ckpho" />
                        </div>
                        <div class="list" id="clipbtn">裁剪</div>
                        <div class="list" id="closepho">取消</div>
                    </div>
                </div>
            </div>

然后是JS代码

function setImg(e) {
                var clipArea = null;
                var _type = e.target.attributes[2].nodeValue;
                $('.ckphoto').show();//裁剪弹窗
                if(_type == 1) {
                    var size = [160, 160];
                    var outputSize = [200, 200];
                } else if(_type == 2) {
                    var size = [299, 140];
                    var outputSize = [621, 300];
                } else if(_type == 3) {
                    var size = [299, 140];
                    var outputSize = [621, 300];
                } else {
                    var size = [278, 393];
                    var outputSize = [842, 1191];
                }
                clipArea = new bjj.PhotoClip("#ckimg", {
                    size: size,
                    outputSize: outputSize,
                    file: "#ckpho",
                    ok: "#clipbtn",
                    loadStart: function() {
                    },
                    loadComplete: function() {
                        console.log("照片读取完成");
                    },
                    clipFinish: function(dataURL) {
                        $('.ckphoto').hide();
                        if(_type == 1) {
                            $('.logo').attr('src', dataURL);//店铺logo
                        } else if(_type == 2) {
                            $('.mentou').attr('src', dataURL);//实景图1
                        } else if(_type == 3) {
                            $('.shijing').attr('src', dataURL);//实景图2
                        } else {
                            $('.zhizhao').attr('src', dataURL);//执照
                        }
                        clipArea = null;//这是后来加上的
                    }
                });
            }

其实整体流程还是比较清晰的。但是遇到一个问题:
我首先随便点击某一个上传图片,完成上传(如:先点击上传店铺logo-->完成裁剪-->本地预览成功),第一次没问题。

clipboard.png

然后我继续上传下一个选项的图片(如:点击上传实景照1-->完成裁剪-->本地预览成功),会发现该次上传的图片将上一次上传的图片给覆盖了...wtf。然后在控制台发现:

clipboard.png
根据断点,第一次上传后loadComplete进入,然后输出‘照片读取完成’一次(正常),第二次上传时,loadComplete进入了两次,然后输出‘照片读取完成’两次,也就是说clipArea这个对象其实是一共被创建了3次,栈内一共有三个clipArea对象...没办法我又在clipFinish的回调中手动清空clipArea对象,可是仍然没有作用。
有没有大神帮帮忙看下这是什么情况?如何解决这个坑啊

阅读 2k
2 个回答

没太细看 你应该缺个form.reset() 找找那个插件文档 关键字 重置

从字面上意思跟垃圾回收没什么关系。
是你的组件是绑定在"#ckimg"上的,并且是多次,照着逻辑你点第三个图片会打印3次。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题