Skip to content

Latest commit

 

History

History
202 lines (165 loc) · 5.61 KB

错误信息.md

File metadata and controls

202 lines (165 loc) · 5.61 KB
1、JSON.stringigy报错:Converting circular structure to JSON;原因:对象中有循环引用

解决:

// 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
2、DataCloneError: Failed to execute 'put' on 'IDBObjectStore': An object could not be cloned

详细错误可能是:

1、对象里包含函数是不能存入db的(转字符串)

Uncaught (in promise) DOMException: Failed to execute 'put' on 'IDBObjectStore': function tttt() { console.log(1); } could not be cloned.

原因:对象里包含函数是不能存入indexedDB的

解决:

JSON.stringfy()

3、try catch 无法准确定位错误的位置

在调用某函数时,如果使用了try catch语句捕获该函数产生的异常,而如果这个函数内调用了其它函数,其它函数又掉了另外的函数,如果这些被调用的函数中任意一个抛出了异常,而异常所在的代码块没有异常捕获的操作,于是这个异常会被最外层的try catch语句捕获,而此时产生的异常已经远远超出了你最开始的预期,当它输出了你指定的错误提示后,你回来查找错误却发现难以找到该异常是哪段代码抛出的

解决:用try catch的话,就在可能出错的地方都用;否则尽量少用,只做代码上的兼容

4、Failed to execute 'querySelector' on 'Document': '#5414414' is not a valid selector

错误代码 :document.querySelector('#123456')

原因

解决方式(除开特殊符号,第一个字符必须是字母): 第一种: 将ID前面加字母,例如:document.querySelectorAll('#id123456')

第二种: 根据ID属性,例如:document.querySelectorAll("id=['123456']")

5、'set' on proxy: trap returned falsish for property 'isOpenDBCache'

原因:在严格模式下,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)

6、ReferenceError: arguments is not defined/没有arguments对象
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串了
ios 上input.focus()不生效
// 代码一
  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,上面是两种具体的业务实现方式

PullToRefersh无法触发上拉加载 filename: 坑王驾到/上拉加载无法触发.md