Ionic项目Android4.4.4设备禁用console.log后出现cordova.js无log方法错误
解决Android 4.4.4设备上cordova.js找不到log方法的问题
这个问题我之前在维护老旧Ionic项目时也碰到过,根源在于Android 4.4.4搭载的WebView内核太过陈旧,对原生对象的处理逻辑和现代浏览器差异很大。你原来的代码直接把整个console对象替换成了自定义的空对象,虽然看似遍历了原console的所有方法并赋值为空函数,但老WebView的Object.keys()可能无法正确枚举原生console的所有可枚举属性,或者cordova.js依赖的是原生console对象的某些内部绑定特性,而不是你创建的普通对象。
修复方案:只覆盖需要禁用的日志方法,保留原生console对象
不要替换整个console,而是单独覆盖那些你想禁用的日志输出方法,这样既能达到禁用日志的目的,又不会破坏cordova.js依赖的console功能。修改后的代码如下:
// 先保存原始的console日志方法 var originalConsoleMethods = { log: console.log, info: console.info, warn: console.warn, error: console.error, debug: console.debug // 如果需要禁用debug日志可以加上 }; function debug(bool) { if (!bool) { // 只覆盖需要禁用的日志方法 console.log = function() {}; console.info = function() {}; console.warn = function() {}; console.error = function() {}; console.debug = function() {}; } else { // 恢复原始的日志方法 console.log = originalConsoleMethods.log; console.info = originalConsoleMethods.info; console.warn = originalConsoleMethods.warn; console.error = originalConsoleMethods.error; console.debug = originalConsoleMethods.debug; } } debug(false);
为什么这个方案有效?
- 没有替换整个
console对象,保留了原生console的所有其他属性和内部特性,cordova.js需要的任何console相关功能都能正常工作 - 显式指定要覆盖的方法,避免了老WebView中
Object.keys()枚举不全的兼容性问题 - 可以灵活控制要禁用的日志类型,不需要一刀切禁用所有console方法
如果之后发现还有其他需要禁用的console方法,直接在originalConsoleMethods里添加对应的属性,然后在debug函数里同步覆盖即可。
内容的提问来源于stack exchange,提问作者Moshi
相关产品推荐
相关产品推荐

