解决:
// Demo: Circular reference
var o = {};
o.o = o;
// Note: cache should not be re-used by repeated calls to JSON.stringify.
var cache = [];
JSON.stringify(o, function(key, value) {
if (typeof value === 'object' && value !== null) {
if (cache.indexOf(value) !== -1) {
// Circular reference found, discard key
return;
}
// Store value in our collection
cache.push(value);
}
return value;
});
cache = null; // Enable garbage collection
详细错误可能是:
1、对象里包含函数是不能存入db的(转字符串)
Uncaught (in promise) DOMException: Failed to execute 'put' on 'IDBObjectStore': function tttt() { console.log(1); } could not be cloned.
原因:对象里包含函数是不能存入indexedDB的
解决:
JSON.stringfy()
在调用某函数时,如果使用了try catch语句捕获该函数产生的异常,而如果这个函数内调用了其它函数,其它函数又掉了另外的函数,如果这些被调用的函数中任意一个抛出了异常,而异常所在的代码块没有异常捕获的操作,于是这个异常会被最外层的try catch语句捕获,而此时产生的异常已经远远超出了你最开始的预期,当它输出了你指定的错误提示后,你回来查找错误却发现难以找到该异常是哪段代码抛出的
解决:用try catch的话,就在可能出错的地方都用;否则尽量少用,只做代码上的兼容
错误代码 :document.querySelector('#123456')
原因
解决方式(除开特殊符号,第一个字符必须是字母): 第一种: 将ID前面加字母,例如:
document.querySelectorAll('#id123456')
第二种: 根据ID属性,例如:
document.querySelectorAll("id=['123456']")
原因:在严格模式下,proxy代理的set方法,不能return 布尔类型的false,否则会TypeError
解决:全部return true就好了
cb.rest.cache = (function (target) {
var logHandler = {
get: function (target, key) {
return target[key];
},
set: function (target, key, value) {
if (key === 'version' || key === 'isOpenDBCache') {
if (target[key] != value)
localStorage.setItem(key, value)
}
target[key] = value;
return true
}
}
return new Proxy(target, logHandler);
})(cb.rest.cache)
var tt =(a,b,c,d)=>{
for(let attr of arguments){
console.log(attr)
}
}
tt(1,2,3,4)
// VM369:2 Uncaught ReferenceError: arguments is not defined
// at tt (<anonymous>:2:18)
// at <anonymous>:1:1
var tt =function(a,b,c,d){
for(let attr of arguments){
console.log(attr)
}
}
tt(1,2,3,4)
//1
//2
//3
//4
****⬆️对比可知:arguments对象在箭头函数中不存在⬆️********
解决:
// 代替arguments
var tt =(...params)=>{
for(let attr of params){
console.log(attr)
}
}
探究原因:
var pp = function(a,b){
return (c,d,e)=>{
for(let attr of arguments){
console.log(attr)
}
}
}
pp(1,2)(3,4,5)
VM624: 1
VM624: 2
// 打印arguments出1、2;而不是我们预期传入的3、4、5。可知箭头函数里根本没有arguemtns这个对象,所以会随着作用域去上级查找,这就解决了函数嵌套时候由于嵌套的函数写法不一样,导致的感觉arguemnts串了
// 代码一
componentDidMount() {
setTimeout(() => {
const input = findDOMNode(this.refs.input);
input.focus();
input.setSelectionRange(0, input.value.length);
}, 0);
this.initShortcut();
}
// 代码二
showPop = () => {
if (!this.state.visible) {
let currentPanel = this.props.instanceName
window._panelInstanceList.forEach(panel => {
if (panel.instanceName && panel.instanceName != currentPanel)
panel.instance.state.visible && panel.instance.showOff()
})
}
setTimeout(() => { //核心
const input = this.refs.input;
if (input) input.focus();
}, 0);
this.setState({
visible: !this.state.visible
}, ()=>{
if (cb.utils.isIos()) { //ios兼容办法
const input = this.refs.input;
if (input) input.focus();
}
});
}
原因在于ios有所限制: 寻常代码里的focus不会生效,除了在某个UI事件(例如click, touchend等)的直接执行环境中调用focus
注意这个直接环境,它的意思是如果你在setTimeout, promise等异步方式中执行了focus,依然是无效的。
ios上述限制是出于安全机制的考虑
ios上只有用户交互触发的focus事件才会起效,而延时回调的focus是不会触发的
解决办法:在直接事件中去focus,上面是两种具体的业务实现方式