前端-js在移动端接口调试--重写console.log

本文介绍了一种通过重写console.log()方法实现的移动端调试技术,可在无线端清晰展示接口返回数据,极大提升移动端开发调试效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.无线端返回对象的时候,在手机上很难看到完整的数据,而且没有记录很难直观的看到数据走向。
2.通过原生js重写console.log()方法使数据可以在任意终端更方便的展示出来,无线端调试神器。
具体方法代码如下:

(function(){

var selfScript = document.scripts[document.scripts.length - 1];
var href = window.location.href;

var logElem;
var logElemClassName = selfScript.getAttribute('data-class') || 'm-log';
var showlog = true;// selfScript.getAttribute('data-showlog') || false;
var match = href.match(/[?|&]showlog=([^&]+)/i);
if(match){
    showlog = match[1].toLowerCase() === 'true' || Number(match[1]) === 1;
}

/**
 * 重写console.log方法,便于在移动端查看log日志。
 */
var console = window.console || {};
var oldLog = console.log;
var slice = [].slice;

console.log = function(){
	
    var args = slice.call(arguments);
    oldLog && oldLog.apply(console, args);
    if(!showlog) return;

    var msg = '';
    for(var i = 0, obj, len = args.length; i < len; i++){
        obj = args[i];

        if(typeof obj !== 'string' && typeof obj !== 'number'){
            try{
                obj = JSON.stringify(obj);
            }catch(e){ };
        }

        if(typeof obj === 'string'){
            obj = obj.replace(/</g, '&lt;').replace(/>/g, '&gt;');
        }

        if(i == 0) msg = obj;
        else msg += ' ' + obj;
    }

	
    var elem = logElem || (logElem = createLogElem());
    elem.innerHTML += '> ' + msg + '<br/>';
    elem.scrollTop = elem.scrollHeight - elem.clientHeight;
};

window.addEventListener('error', function(error){
    var errorStr = error.error ? error.error.toString() : error.toString();
    console.log( errorStr+ ' ' + error.filename + ' ' + error.lineno);
});

function createLogElem(){
    var elem = document.createElement('div');
    elem.className = logElemClassName;
    var css = '.' + logElemClassName + '{position:fixed;top:0;left:0;width:100%;max-height:305px;-webkit-box-sizing:border-box;box-sizing:border-box;font:12px Courier New;background-color:rgba(0,0,0,0.2);word-wrap:break-word;word-break:break-all;overflow-y:scroll;padding:5px;z-index:100000}';
    css += '.' + logElemClassName + ':before{content:"锕€";position:fixed;top:0;right:0;height:20px;overflow:hidden;padding:8px 5px;-webkit-box-sizing:border-box;box-sizing:border-box;font:12px Arial;-webkit-transform-origin:50% 50%;}';
    css += '.' + logElemClassName + '.minimize{height:20px;}';
    css += '.' + logElemClassName + '.minimize:before{-webkit-transform:rotate(180deg);}';
    appendStyle(css);
    document.documentElement.appendChild(elem);

    //minimize
    elem.rect = elem.getBoundingClientRect();
    elem.minimize = false;
    elem.addEventListener('click', function(e){
        var x = e.pageX, y = e.pageY, rect = elem.rect;
        if(x >= rect.left + rect.width - 20 && 
           x <= rect.left + rect.width &&
           y >= rect.top && 
           y <= rect.top + 20){
            elem.minimize = !elem.minimize;
            elem.className = logElemClassName + (elem.minimize ? ' minimize' : '');
        }
    });

    return elem;
}

function appendStyle(css){
    var style = document.createElement('style');
    style.type = 'text/css';
    document.getElementsByTagName("head")[0].appendChild(style);
    style.appendChild(document.createTextNode(css));
}

})();

调用方法十分简单引入js即可
这里有一个小demo,模拟在移动端的效果,引入js后不仅在控制台生成打印,在页面最上方也会生成dom记录console的值:
在这里插入图片描述

结果如下图:
在这里插入图片描述
使用该方法就可以愉快的在无线端看到接口返回的数据了!

<think>好的,用户想了解前端调试的技术方法和实现方式。首先,我需要回忆一下相关的前端调试手段。记得可以通过检测开发者工具是否开启来实现,比如重写toString方法或者检查console.log的执行时间差异。另外,还有使用debugger语句来干扰调试,无限循环的debugger可能导致控制台卡死。还有检测窗口大小变化,因为打开开发者工具通常会改变窗口尺寸。还有利用代码混淆和定时检测,增加逆向的难度。需要确认这些方法的有效性和实现细节,同时也要考虑不同浏览器的兼容性问题。另外,用户提供的引用中有提到Edge开发者工具和移动端适配的内容,可能可以结合安全策略和隐私防护部分来补充回答。要注意回答的结构,分点说明每种方法的原理和实现,并提醒用户这些方法的局限性,比如无法完全阻止但能提高调试门槛。最后生成相关问题,比如如何绕过反调试或者具体的代码示例。</think>### 前端调试技术方法及实现技巧 前端调试技术主要用于增加代码分析难度,保护核心逻辑或敏感数据。以下是常见方法及实现原理: --- #### 一、开发者工具检测 1. **控制台检测** 通过覆写原生方法或检测控制台调用延迟: ```javascript const start = Date.now(); console.log(''); if (Date.now() - start > 50) { window.location.href = 'about:blank'; // 检测到调试时跳转 } ``` 原理:调试模式下`console.log`执行时间显著增加[^2]。 2. **Function.prototype.toString 覆写** 检测函数是否被篡改: ```javascript const originalToString = Function.prototype.toString; Function.prototype.toString = function() { if (this === console.log) { window.location.reload(); // 触发页面刷新 } return originalToString.call(this); }; ``` --- #### 二、调试器阻断 1. **无限 Debugger 循环** 使用`debugger`语句干扰调试流程: ```javascript setInterval(() => { try { debugger; } catch (e) { window.close(); // 尝试关闭页面 } }, 100); ``` 原理:触发调试器断点导致控制台卡顿。 2. **断点检测** 结合`Error`对象分析堆栈: ```javascript function detectDebugger() { const err = new Error(); if (err.stack.split('\n').length > 4) { alert('调试检测已触发!'); } } ``` --- #### 三、环境特征监测 1. **窗口尺寸检测** 开发者工具开启时窗口尺寸变化: ```javascript window.addEventListener('resize', () => { if (window.outerWidth - window.innerWidth > 200) { document.body.innerHTML = '禁止调试'; // 清空页面内容 } }); ``` 2. **用户代理检测** 识别浏览器开发者工具特征(部分浏览器有效): ```javascript if (navigator.userAgent.includes('Chrome DevTools')) { document.write('调试模式被禁止'); } ``` --- #### 四、代码混淆与动态防护 1. **代码混淆** 使用工具如`JavaScript Obfuscator`对代码进行混淆,增加可读性难度: ```javascript // 混淆前 function checkAuth() { /* 逻辑 */ } // 混淆后 const _0x1a2b=[/* 加密字符串数组 */];function _0x3fdc(){/* 混淆逻辑 */} ``` 2. **定时自检** 周期性校验关键函数完整性: ```javascript setInterval(() => { if (checkAuth.toString() !== 'function checkAuth(){...}') { location.reload(); } }, 3000); ``` --- #### 五、安全策略补充 1. **CSP 内容安全策略** 通过HTTP头限制脚本来源,降低注入攻击风险: ```http Content-Security-Policy: script-src 'self' ``` 可防止未经授权的脚本执行[^4]。 --- #### 注意事项 - **兼容性差异**:不同浏览器对反调试技术的检测结果可能不同 - **可绕过性**:所有前端调试手段均可通过专业工具绕过 - **用户体验**:避免过度防护导致正常用户使用受阻 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值