Can't execute code from a freed script

这几天一直在做用浏览器调用摄像头对身份证,车牌进行拍照的功能,利用webrtc调用摄像头,在页面上模拟一个相机,拍照然后调用百度AI的接口进行文字识别,提取有用的信息。
期间遇到了不少的问题吧,比如Chrome除了localhost访问外,必须要https才能获取到mediaDevices这个对象。Firefox又不知道什么毛病,在win10平板下一直获取不到摄像头的权限(但是能获取到mediaDevices对象,可能是win10没给Firefox权限吧),所以测试的时候,只有Edge浏览器可以用了,这玩意儿一开始页面两边就有很大的空白间隙,chrome和firefox都正常。我真的不知道如何评论这玩意儿。。。
回归主题:
问题是我有一个页面,这个页面有一个Vue对象,我给他返回给一个变量,叫vm(这个变量是用来在子页面中访问的,因为子页面就是相机,需要将拍照获得的信息给父页面的vue中的data赋值)
我用的是layer插件,弹出一个iframe窗口,iframe就是这个子页面,在iframe中进行拍照逻辑,调用后台接口,对父页面的vue进行赋值
就像这样
iframe窗口

 $.ajax({
   url: '${ctx}/pc/anjian/getCarByPhoto',
   type: 'POST',
   data: {image: param.image},
   success: (res) => {
       if (res.state === '500') {
           parent.layer.msg(res.message, {
               area: ['24%', '8%'],
               offset: ['46%', '38%'],
           });
           parent.layer.close(parent.layer.getFrameIndex(window.name));
       } else {
           parent.vm.setPhotoValue(res.result);	// 调用父页面Vue的setPhotoValue对Vue的data进行赋值
           parent.layer.close(parent.layer.getFrameIndex(window.name));
       }
   }
});

父页面Vue的方法

setPhotoValue(result) { // 给拍照车牌赋值
    this.car = result;	// 赋值
},

或者也可以不用方法的方式,直接用parent.vm.car = result也可以赋值。

但是这两种方式都有一个问题,那就是在ajax中,如果将ajax返回的数据res.result直接赋值给Vue的data属性,那么在页面切换的时候,控制台会报一个Can't execute code from a freed script错误。
比如我用的是动态组件,在页面切换时,下一个组件的页面直接跑到当前组件的页面的下方,两个子组件页面同时出现在同一个页面上,导致整个页面布局都乱了
原因就是我不能直接把ajax返回的res.result对象赋值给Vue属性car,因为car如果引用了res.result,在页面切换时,上一个页面已经被销毁,那么res.result这个变量实体也已经被销毁,而car却引用了它,导致出现了这个错误。我们不应该把res.result直接赋值给car,因为这是浅拷贝,只是将car的引用指向了res.result

用深拷贝的方式解决这个问题,或者重新创建一个对象,
我这里重新创建一个对象解决这个问题

setPhotoValue(result) { // 给拍照车牌赋值
    this.car = {
        chepaihao: result.chepai,
        cheliangleixing: result.cheliangleixing,
        fuzheren: result.fuzheren,
    };
},

深拷贝

setPhotoValue(result) { // 给拍照车牌赋值
	this.car = JSON.parse(JSON.stringify(result));	// 利用JSON的parse和stringify方法对一个对象深拷贝
},

你可能感兴趣的:(Can't execute code from a freed script)