【受够了系列】如何在手机端调试脚本程序?

前言

很多时候大家可能会写手机页面,这时候的脚本调试就成为一个很大的问题了。。那么各位是怎么调试的?
一般来说,pc端的调试工作会简单很多,但是有时候你需要用到手机的特性,譬如,重力感应,譬如,多点触碰,这时候你要用真机来试,第二,不同手机可能有不同兼容问题,这时候还是要真机测试。所以啊,使用真机调试web脚本是必须要克服的。

想法

在手机端仿照chrome或者firefox的调试器,添加一个额外的控制台开关,专门用于输出各种调试信息及抓取错误。因为手机端很多时候没办法自由控制url地址【例如,微信】,所以采用url作为彩蛋来开启控制台的做法不可取【当然pc端可以】,但是手机支持各种手势,于是定制一个自定义手势作为彩蛋也是可以的。

设计

一般流程
这里写图片描述

具体流程
这里写图片描述

控制台本体功能
这里写图片描述

彩蛋相关功能

这里写图片描述

核心代码

样式


.wcmd-info-button{
    position: fixed;
    bottom: 5px;
    right: 20px;
    display: none;
    width: 32px;
    height: 32px;

    background: url("images/Info_64.png") no-repeat center center;
    background-size: 32px 32px;
    opacity: 0;
    -webkit-transition: opacity 2s;
    -moz-transition: opacity 2s;
    -ms-transition: opacity 2s;
    -o-transition: opacity 2s;
    transition: opacity 2s;
}
/**提醒层样式*/
.wcmd-info-layer{
    position: fixed;
    display: none;
    bottom: 2px;
    left: 0;
    width: 100%;
    line-height: 18px;
    background: rgba(178,178,178,0.55);
    opacity: 0;
    -webkit-transition: opacity 1s, -webkit-transform 1s;
    -moz-transition: opacity 1s,-moz-transform 1s;
    -ms-transition: opacity 1s,-ms-transform 1s;
    -o-transition: opacity 1s,-o-transform 1s;
    transition: opacity 1s,transform 1s;
}
.wcmd-info-layer .wcmd-notice{
    background: url("images/info_active_48.png") no-repeat left center;
    background-size: 48px 48px;

    padding-left: 50px;
    color: rgba(255,255,255,0.8);
    font-weight: bold;
    letter-spacing: 1px;
    line-height: 18px;

}
.wcmd-info-layer .wcmd-info-logo{
    background: url("images/info_active_48.png") no-repeat left center;
    background-size: 32px 32px;
    width: 32px;
    height: 100%;
    float: left;
}
.wcmd-info-layer .wcmd-close-notice{
    background: url("images/del_close_32.png") center center no-repeat;
    border: 0;
    display: block;
    width: 32px;
    height: 32px;
    position: absolute;
    right: 10px;
    top: 8px;
}

.wcmd-info-layer .wcmd-notice-content{
    white-space:normal;
}

/**点击文字以后的着重样式***/

.wcmd-info-layer .wcmd-selected-words{
    background-color: #669933;
    border-radius: 50%;
    -moz-border-radius: 50%;
    -webkit-border-radius: 50%;
    animation:wcmd-words-animate 4s infinite;
    padding: 3px;
    -webkit-animation:wcmd-words-animate 4s infinite; /* Safari 和 Chrome */
    text-decoration: none;
    color:white;
}
.wcmd-info-layer .wcmd-notice-content a{
    text-decoration: none;
    letter-spacing: 2px;
    color:white;
}
@keyframes wcmd-words-animate {
    from{
        opacity: 1;
    }
    25%{
        opacity: 0.5;
    }
    50%{
        opacity: 1;
    }
    75%{
        opacity: 0.5;
    }
    to{
        opacity: 1;
    }
}
@-webkit-keyframes wcmd-words-animate {
    from{
        opacity: 1;
    }
    25%{
        opacity: 0.5;
    }
    50%{
        opacity: 1;
    }
    75%{
        opacity: 0.5;
    }
    to{
        opacity: 1;
    }
}
/***接下来就是togglebutton了。***/
.wcmd-toggle-button{
    position: fixed;

    width: 32px;
    height: 32px;
    background: url("images/Terminal_cmd_64.png") center center no-repeat;
    background-size: 32px 32px;

    left: 25px;
    top: 250px;
    display: none;
    opcacity:0;
    -webkit-transition: opacity 1s, -webkit-transform 1s;
    -moz-transition: opacity 1s,-moz-transform 1s;
    -ms-transition: opacity 1s,-ms-transform 1s;
    -o-transition: opacity 1s,-o-transform 1s;
    transition: opacity 1s,transform 1s;
}
.wcmd-console{
    width:100%;
    position: fixed;
    left: 0;
    bottom: 0;
    display: none;
    opcacity:0;
    -webkit-transition: opacity 1s, -webkit-transform 1s;
    -moz-transition: opacity 1s,-moz-transform 1s;
    -ms-transition: opacity 1s,-ms-transform 1s;
    -o-transition: opacity 1s,-o-transform 1s;
    transition: opacity 1s,transform 1s;
    border-radius: 5px ;
    -moz-border-radius: 5px;
    -webkit-border-radius: 5px ;
    border:3px solid #dedede;
    background: #ffffff;

}
.wcmd-console .wcmd-top-console-title{
    width: 100%;
    height: 32px;
    line-height: 32px;
    text-align: center;
    background: rgba(16,98,56,0.4);
    font-size: 18px;
    letter-spacing: 2px;
    font-weight: bold;
    color: black;
    clear: both;
}
.wcmd-console .wcmd-pre-commands{
    float: left;
    width: 40%;
    height: 250px;
    overflow-x: hidden;
    overflow-y: scroll;
}
.wcmd-console .wcmd-log{
    float: right;
    width: 58%;
    height: 250px;
    overflow-x: hidden;
    overflow-y: scroll;
}
.wcmd-console .wcmd-toolbar{
    clear: both;
    width: 100%;
    line-height: 48px;
    height: 48px;
    text-align: center;
    overflow-x: scroll;
    overflow-y: hidden;
}
.wcmd-console .wcmd-toolbar a{
    text-decoration: none;
    color:black;
}
.wcmd-console .wcmd-toolbar .wcmd-icon-button{
    background-size: 24px 24px;
    padding-left: 28px;
    line-height: 24px;
    display: inline-block;
    height: 24px;
    font-size: 12px;
}
.wcmd-console .wcmd-toolbar .wcmd-min-window{
    background: url("images/min-window-64.png") left center no-repeat;
    background-size: 24px 24px;
}
.wcmd-console .wcmd-toolbar .wcmd-close-window{
    background: url("images/close-window-32.png") left center no-repeat;
    background-size: 24px 24px;
}
.wcmd-console .wcmd-toolbar .wcmd-restore-window{
    background: url("images/restore-window-32.png") left center no-repeat;
    background-size: 24px 24px;
}
.wcmd-console .wcmd-toolbar .wcmd-max-window{
    background: url("images/max-window-32.png") left center no-repeat;
    background-size: 24px 24px;
}
.wcmd-console .wcmd-toolbar .wcmd-refresh-window{
    background: url("images/refresh_30.png") left center no-repeat;
    background-size: 24px 24px;
}

.wcmd-console .wcmd-toolbar .wcmd-enlarge-window{
    background: url("images/enlargeh_arrow_32.png") left center no-repeat;
    background-size: 24px 24px;
}
.wcmd-console .wcmd-toolbar .wcmd-shrink-window{
    background: url("images/shrinkh_arrow_32.png") left center no-repeat;
    background-size: 24px 24px;
}
.wcmd-console .wcmd-toolbar .wcmd-clear-window{
    background: url("images/eraser_32.png") left center no-repeat;
    background-size: 24px 24px;
}
.wcmd-console .wcmd-log-tips{
    padding-left: 20px;
    line-height: 16px;
    font-size:12px;
    min-height: 16px;
}
.wcmd-console .wcmd-success-tips{
    background: url("images/button_check_32.png") left top no-repeat;
    background-size: 16px 16px;
    color: #39a81f;
}
.wcmd-console .wcmd-info-tips{
    background: url("images/button_info_32.png") left top no-repeat;
    background-size: 16px 16px;
    color: #0d457e;
}
.wcmd-console .wcmd-warning-tips{
    background: url("images/sign_warning_32.png") left top no-repeat;
    background-size: 16px 16px;
    color: #97812b;
}
.wcmd-console .wcmd-error-tips{
    background: url("images/sign_error_32.png") left top no-repeat;
    background-size: 16px 16px;
    color: #ff260b;
}
.wcmd-console .wcmd-custom-tips{
    background: url("images/sign_sys_32.png") left top no-repeat;
    background-size: 16px 16px;
    color: #333;
}

/***下面开始对预设命令的排版***/
.wcmd-console .wcmd-pre-commands .wcmd-command-item{
    background: url("images/command_line_32.png") 3px 5px no-repeat;
    background-size: 16px 16px;

    line-height: 16px;
    font-size: 12px;
    padding: 5px 5px;
    padding-left: 21px;
}
.wcmd-console .wcmd-pre-commands .wcmd-command-item a{
    text-decoration: none;
    color: black;
}
.wcmd-console .wcmd-pre-commands .wcmd-command-item .wcmd-cmd-name{
    padding: 0px 3px;
}
/**运行按钮样式。**/
.wcmd-console .wcmd-pre-commands .wcmd-command-item .wcmd-run-button {
    background-color: #7fbf4d;
    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #7fbf4d), color-stop(100%, #63a62f));
    background-image: -webkit-linear-gradient(top, #7fbf4d, #63a62f);
    background-image: -moz-linear-gradient(top, #7fbf4d, #63a62f);
    background-image: -ms-linear-gradient(top, #7fbf4d, #63a62f);
    background-image: -o-linear-gradient(top, #7fbf4d, #63a62f);
    background-image: linear-gradient(top, #7fbf4d, #63a62f);
    border: 1px solid #63a62f;
    border-bottom: 1px solid #5b992b;
    border-radius: 3px;
    -webkit-box-shadow: inset 0 1px 0 0 #96ca6d;
    box-shadow: inset 0 1px 0 0 #96ca6d;
    color: #fff;
    font: bold 11px/1 "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif;
    padding: 2px 5px 2px 5px;
    text-align: center;
    text-shadow: 0 -1px 0 #4c9021;

}
.wcmd-console .wcmd-pre-commands .wcmd-command-item .wcmd-run-button:hover {
    background-color: #76b347;
    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #76b347), color-stop(100%, #5e9e2e));
    background-image: -webkit-linear-gradient(top, #76b347, #5e9e2e);
    background-image: -moz-linear-gradient(top, #76b347, #5e9e2e);
    background-image: -ms-linear-gradient(top, #76b347, #5e9e2e);
    background-image: -o-linear-gradient(top, #76b347, #5e9e2e);
    background-image: linear-gradient(top, #76b347, #5e9e2e);
    -webkit-box-shadow: inset 0 1px 0 0 #8dbf67;
    box-shadow: inset 0 1px 0 0 #8dbf67;
    cursor: pointer; }
.wcmd-console .wcmd-pre-commands .wcmd-command-item .wcmd-run-button:active {
    border: 1px solid #5b992b;
    border-bottom: 1px solid #538c27;
    -webkit-box-shadow: inset 0 0 8px 4px #548c29, 0 1px 0 0 #eeeeee;
    box-shadow: inset 0 0 8px 4px #548c29, 0 1px 0 0 #eeeeee; }

脚本

;var WebConsoleTpl={
    infoButton:[]
    ,notice:[]
    ,toggleButton:[]
    ,console:[]
};

WebConsoleTpl.infoButton.push("<a href=\"javascript:void(0);\" ui=\"web-console-info-btn\" class=\"wcmd-info-button\"></a>");
WebConsoleTpl.notice.push("<div ui=\"wcmd-notice\" class=\"wcmd-info-layer\"><div class=\"wcmd-notice\"><div ui=\"wcmd-notice-content\" class=\"wcmd-notice-content\">温馨小提示:长时间猛烈摇摆手机可能缩短设备的寿命。</div><a href=\"javascript:void(0);\" ui=\"btn-confirm-pwd\">我知道了</a></div><a href=\"javascript:void(0);\" ui=\"close-notice\" class=\"wcmd-close-notice\"></a> </div>");
WebConsoleTpl.toggleButton.push("<a href=\"javascript:void(0);\" ui=\"wcmd-toggle-button\" class=\"wcmd-toggle-button\"></a>");
WebConsoleTpl.console.push("<div ui=\"wcmd-console\" class=\"wcmd-console\">");
WebConsoleTpl.console.push("  <div class=\"wcmd-top-console-title\">移动端脚本调试器</div>");
WebConsoleTpl.console.push("  <div class=\"wcmd-pre-commands\" ui=\"wcmd-win-commands\">");
WebConsoleTpl.console.push("    <div class=\"wcmd-command-item\">");
WebConsoleTpl.console.push("      <span class=\"wcmd-cmd-name\" ui=\"wcmd-cmd-name\">命令-测试用</span><a href=\"javascript:WebConsole.log('hello world.','success');\" class=\"wcmd-run-button\" ui=\"wcmd-cmd-run\">执行</a>");
WebConsoleTpl.console.push("    </div>");
WebConsoleTpl.console.push("  </div>");
WebConsoleTpl.console.push("  <div class=\"wcmd-log\" ui=\"wcmd-win-logs\">");
WebConsoleTpl.console.push("  </div>");
WebConsoleTpl.console.push("  <div class=\"wcmd-toolbar\">");
WebConsoleTpl.console.push("    <a href=\"javascript:void(0)\" class=\"wcmd-icon-button wcmd-enlarge-window\" ui=\"wcmd-toggle-commands\">扩展</a>");
WebConsoleTpl.console.push("    <a href=\"javascript:void(0)\" class=\"wcmd-icon-button wcmd-restore-window\" ui=\"wcmd-restore-button\">还原</a>");
WebConsoleTpl.console.push("    <a href=\"javascript:void(0)\" class=\"wcmd-icon-button wcmd-max-window\" ui=\"wcmd-max-button\">最大化</a>");
WebConsoleTpl.console.push("    <a href=\"javascript:void(0)\" class=\"wcmd-icon-button wcmd-clear-window\" ui=\"wcmd-clear-window\">清空</a>");
WebConsoleTpl.console.push("    <a href=\"javascript:void(0)\" class=\"wcmd-icon-button wcmd-close-window\" ui=\"wcmd-close-button\">关闭</a>");
WebConsoleTpl.console.push("    <a href=\"javascript:void(0)\" class=\"wcmd-icon-button wcmd-refresh-window\" ui=\"wcmd-refresh-button\">刷新</a>");
WebConsoleTpl.console.push("  </div>");
WebConsoleTpl.console.push("</div>");

var WebConsole={
    settings:{
        tips:"温馨小提示:长时间猛烈摇摆手机可能缩短设备的寿命。"
        ,password:"猛烈摇摆"
        ,maxRecord:200 //控制台最多显示记录条数--100条。
    }
    ,appData:{
        logRecords:0 //打印的记录条数。
        ,currentLogIndex:1 //当前打印的记录条数,从1开始。
        ,hasInit:false //是否已经初始化。

    }
    ,_exceptionQueue:[]
    ,_logQueue:[]
    ,_commandQueue:[]
    ,uiData:{

        ui_info_button:""
        ,ui_notice:""
        ,ui_close_notice:""
        ,ui_confirm_pwd:""
        ,ui_notice_content:""
        ,ui_toggle_button:""
        ,ui_console:""
        ,ui_refresh_button:""
        ,ui_min_button:""
        ,ui_max_button:""
        ,ui_restore_button:""
        ,ui_clear_button:""
        ,ui_toggle_commands:""

        ,ui_win_commands:""
        ,ui_win_logs:""
    }
    //--当在没办法的情况下,譬如,dom都没有渲染出来要打印异常信息,那么用这个。
    ,_putIntoExceptionQueue:function(msg,scriptURI,lineNumber){
        var me=this;
        me._exceptionQueue.push({
            message:msg,
            script:scriptURI,
            line:lineNumber
        });
    }
    ,_putIntoLogQueue:function(msg,msgType,styleObj){

        var me=this;
        me._logQueue.push({
            msg:msg,
            msgType:msgType,
            styleObj:styleObj
        });

    }
    ,_putIntoCommandQueue:function(commandName,method,context){
        var me=this;
        me._commandQueue.push({
            name:commandName,
            method:method,
            context:context

        });
    }
    ,__init:function(_opts){
        var me=this;
        $.extend(me.settings,_opts);
        me.__initUI();
        me.__initEvents();
        me.appData.hasInit=true;

        me._handleOthers();

    }
    //--
    ,_handleOthers:function(){
        var me=this;
        if(me._exceptionQueue.length>0){
            for(var i=0;i<me._exceptionQueue.length;i++){
                var _minfo=me._exceptionQueue[i];
                me.printException(_minfo.message,_minfo.script,_minfo.line);
            }
        }
        for(var i=0;i<me._logQueue.length;i++){
            var info=me._logQueue[i];
            me.log(info.msg,info.msgType,info.styleObj);
        }
        for(var i=0;i<me._commandQueue.length;i++){
            var info=me._commandQueue[i];
            me.registerCommand(info.name,info.method,info.context);
        }
    }
    ,setSettings:function(__opts){
        var me=this;
        $.extend(me.settings,__opts);
    }
    ,__initUI:function(){
        var me=this;
        //var _html=WebConsoleTpl.join("");
        //var _rootElement=$(_html);
        //me.uiData.root=_rootElement;


        me.uiData.ui_info_button=$(WebConsoleTpl.infoButton.join(""));
        $(document.body).append(me.uiData.ui_info_button);
            //me.uiData.root.find("[ui='web-console-info-btn']");
        me.uiData.ui_notice=$(WebConsoleTpl.notice.join(""));
        $(document.body).append(me.uiData.ui_notice);
        //me.uiData.root.find('[ui="wcmd-notice"]');
        me.uiData.ui_close_notice=me.uiData.ui_notice.find('[ui="close-notice"]');
        me.uiData.ui_confirm_pwd=me.uiData.ui_notice.find('[ui="btn-confirm-pwd"]');
        me.uiData.ui_notice_content=me.uiData.ui_notice.find('[ui="wcmd-notice-content"]');


        me.uiData.ui_toggle_button=$(WebConsoleTpl.toggleButton.join(""));
        $(document.body).append(me.uiData.ui_toggle_button);
            //me.uiData.root.find('[ui="wcmd-toggle-button"]');


        me.uiData.ui_console=$(WebConsoleTpl.console.join(""));
            //me.uiData.root.find('[ui="wcmd-console"]');
        $(document.body).append(me.uiData.ui_console);
        me.uiData.ui_min_button=me.uiData.ui_console.find('[ui="wcmd-min-button"]');
        me.uiData.ui_close_button=me.uiData.ui_console.find('[ui="wcmd-close-button"]');
        me.uiData.ui_restore_button=me.uiData.ui_console.find('[ui="wcmd-restore-button"]');
        me.uiData.ui_max_button=me.uiData.ui_console.find('[ui="wcmd-max-button"]');
        me.uiData.ui_refresh_button=me.uiData.ui_console.find('[ui="wcmd-refresh-button"]');
        me.uiData.ui_win_commands=me.uiData.ui_console.find('[ui="wcmd-win-commands"]');
        me.uiData.ui_win_logs=me.uiData.ui_console.find('[ui="wcmd-win-logs"]');
        me.uiData.ui_toggle_commands=me.uiData.ui_console.find('[ui="wcmd-toggle-commands"]');
        me.uiData.ui_clear_button=me.uiData.ui_console.find('[ui="wcmd-clear-window"]');

        //--初始化密码包含字段。
        me.__initTips();
    }
    //--初始化密码提示字段。
    ,__initTips:function(){
        var me=this;
        me.uiData.ui_notice_content.empty();

        for(var i=0;i<me.settings.tips.length;i++ ){
            var word_item=me.settings.tips[i];
            me.uiData.ui_notice_content.append('<a href="javascript:void(0);" ui="word-chooser">'+word_item+'</a>');
        }
    }
    ,__initEvents:function(){
        var me=this;
        var _click_info=false;
        me.uiData.ui_info_button.click(function(){
            if(_click_info==true){
                return;
            }
            _click_info=true;
            me.hideNoticeButton(function(){
                _click_info=false;
            });
            me.showNotice();
        });
        me.uiData.ui_close_notice.click(function(){
            me.hideNotice();
        });
        me.uiData.ui_confirm_pwd.click(function(){
            var str_pwd=me.__getPwd();

            if(str_pwd.length!=me.settings.password.length||me.settings.password.length<=0){

                me.hideNotice();
                return false;//没有答案不允许进入控制台。
            }
            else if(str_pwd==me.settings.password){
                //--密码正确了。
                me.hideNotice(function(){

                });
                me.showToggleButton();
            }

        });
        me.uiData.ui_notice_content.find('[ui="word-chooser"]').click(function(){
            var _attr_selected=$(this).attr("selected");
            if(_attr_selected=="true"||_attr_selected){
                $(this).removeClass("wcmd-selected-words").removeAttr("selected");
            }
            else{
                $(this).addClass("wcmd-selected-words").attr("selected","true");
            }
        });

        //--让控制台开关按钮可以随便移动。
        me.uiData.ui_toggle_button[0].addEventListener("touchstart",function(event){


        },false);

        me.uiData.ui_toggle_button[0].addEventListener("touchmove",function(event){

            event.preventDefault();
            event.stopPropagation();
            var e = event ? event : window.event;
            var beginX=event.changedTouches[0].pageX;
            var beginY=event.changedTouches[0].pageY;
            var nowX = beginX, nowY = beginY;
            nowX=nowX-15;
            nowY=nowY-15;

            me.uiData.ui_toggle_button.css({
                "left":nowX+"px"
                ,"top":nowY+"px"
            });

        },false);


        me.uiData.ui_toggle_button[0].addEventListener("touchend",function(event){


        },false);

        me.uiData.ui_toggle_button.click(function(){
            me.showConsole();
            me.hideToggleButtonRightNow(function(){

            });
        });
        //--
        me.uiData.ui_refresh_button.click(function(){
            location.reload();
        });
        me.uiData.ui_min_button.click(function(){
            me.hideConsole(function(){
                me.showToggleButton();
            });
        });
        me.uiData.ui_close_button.click(function(){
            me.hideConsoleRightNow();
            me.showToggleButton();
        });
        me.uiData.ui_restore_button.click(function(){
            me.uiData.ui_win_commands.css({
                height:"250px"
            });
            me.uiData.ui_win_logs.css({
                height:"250px"
            });
        });
        me.uiData.ui_max_button.click(function(){
            var _win_height=$(window).height();
            var _h=_win_height-90;
            me.uiData.ui_win_commands.css({
                height:_h+"px"
            });
            me.uiData.ui_win_logs.css({
                height:_h+"px"
            });
        });
        me.uiData.ui_toggle_commands.click(function(){
            if($(this).hasClass("wcmd-enlarge-window")){
                //$(this).text("收缩");
                $(this).removeClass("wcmd-enlarge-window").addClass("wcmd-shrink-window").text("收缩");
                me.uiData.ui_win_commands.hide();
                me.uiData.ui_win_logs.css("width","100%");
            }
            else if($(this).hasClass("wcmd-shrink-window")){
                //$(this).text("收缩");
                $(this).removeClass("wcmd-shrink-window").addClass("wcmd-enlarge-window").text("扩展");

                me.uiData.ui_win_logs.css("width","58%");
                me.uiData.ui_win_commands.show();
            }
        });
        me.uiData.ui_clear_button.click(function(){
            me.clear();
        });
    }
    //--获取当前用户选中答案。
    ,__getPwd:function(){
        var me=this;
        var _els=me.uiData.ui_notice_content.find('[ui="word-chooser"][selected]');
        var _str=[];
        for(var i=0;i<_els.length;i++){
            _str.push($(_els[i]).text());
        }
        return _str.join("");
    }


    //--下面是对外接口。
    ,showNoticeButton:function(callback){
        var me=this;
        me.uiData.ui_info_button.css("display","block");

        setTimeout(function(){
            me.uiData.ui_info_button.css("opacity","1");
            if(callback){
                setTimeout(function(){
                    callback();
                },2100);
            }
        },100);
    }
    ,hideNoticeButton:function(callback){
        var me=this;
        me.uiData.ui_info_button.css("opacity","0");
        setTimeout(function(){
            me.uiData.ui_info_button.css("display","none");
            if(callback){
                callback();
            }
        },2100);
    }
    //--直接隐藏按钮。
    ,hideNoticeButtonRightNow:function(){
        var me=this;
        me.uiData.ui_info_button.css("display","none").css("opacity","0");
    }
    //--显示notice
    ,showNotice:function(callback){
        var me=this;
        me.uiData.ui_notice.css("display","block");
        setTimeout(function(){
            me.uiData.ui_notice.css("opacity","1");
            if(callback){
                setTimeout(function(){
                    callback();
                },2100);
            }
        },20);
    }
    //--隐藏notice
    ,hideNotice:function(callback){
        var me=this;
        me.uiData.ui_notice.css("opacity","0");

        setTimeout(function(){
            me.uiData.ui_notice.css("display","none");
            if(callback){
                callback();
            }
        },2100);
    }
    //--这是正式的通知按钮动画。
    ,noticeButtonAnimation:function(showTime){
        var me=this;
        me.showNoticeButton(function(){
            setTimeout(function(){
                me.hideNoticeButton();
            },showTime);
        });
    }

    ,showToggleButton:function(callback){
        var me=this;
        me.uiData.ui_toggle_button.css("display","block");

        setTimeout(function(){
            me.uiData.ui_toggle_button.css("opacity","1");
            if(callback){
                setTimeout(function(){
                    callback();
                },1100);
            }
        },100);
    }
    ,hideToggleButton:function(callback){
        var me=this;
        me.uiData.ui_toggle_button.css("opacity","0");
        setTimeout(function(){
            me.uiData.ui_toggle_button.css("display","none");
            if(callback){
                callback();
            }
        },1100);
    }
    ,hideToggleButtonRightNow:function(){
        var me=this;
        me.uiData.ui_toggle_button.css("opacity","0").css("display","none");
    }
    //--显示控制台。
    ,showConsole:function(callback){
        var me=this;
        me.uiData.ui_console.css("display","block");
        setTimeout(function(){
            me.uiData.ui_console.css("opacity","1");
            if(callback){
                setTimeout(function(){
                    callback();
                },1100);
            }
        },20);
    }
    ,hideConsole:function(callback){
        var me=this;
        me.uiData.ui_console.css("opacity","0");
        setTimeout(function(){
            me.uiData.ui_console.css("display","none");
            if(callback){
                callback();
            }
        },1100);
    }
    ,hideConsoleRightNow:function(){
        var me=this;
        me.uiData.ui_console.css("opacity","0").css("display","none");
    }
    /***在控制台打印消息。
     * @param message 需要打印的消息。
     * @param msgType 消息类型,默认为 info。总共有:info,success,error,warning
     * ***/
    ,_appendConsoleItem:function(msg,msgType,styleObj){
        //--计算目前已经有多少条信息了。
        var me=this;
        //--判断是否需要删除某些元素。
        var _next_count=me.appData.logRecords+1;

        if(_next_count>me.settings.maxRecord){
            //$("ul li:lt(3)") 列出 index 小于 3 的元素
            me.uiData.ui_win_logs.find('[ui="wcmd-log-item"]:lt('+(_next_count-me.appData.logRecords)+')').remove();
        }
        var _msgClass="wcmd-info-tips";
        if(msgType){
            switch(msgType) {
                case "info":
                    break;
                case "success":
                    _msgClass = "wcmd-success-tips";
                    break;
                case "error":
                    _msgClass = "wcmd-error-tips";
                    break;
                case "warning":
                    _msgClass = "wcmd-warning-tips";
                    break;
                case "custom":
                    _msgClass="wcmd-custom-tips";
                default:
                    _msgClass = "wcmd-info-tips";
                    break;
            }
        }
        var _appendDIV='<div ui="wcmd-log-item" class="wcmd-log-tips '+_msgClass+'" ><p ui="wcmd-log-item-content"></p></div>';
        var _div_el=$(_appendDIV);
        if(styleObj){
            _div_el.find('[ui="wcmd-log-item-content"]').css(styleObj);
        }
        var _realmsg="";
        if(typeof(msg)=="string"&&msg.length>1000){
            _realmsg=msg.substr("0,999")+"....内容太长,省略";
            _div_el.find('[ui="wcmd-log-item-content"]').html(_realmsg);
        }
        else{_div_el.find('[ui="wcmd-log-item-content"]').html(msg);}
        me.uiData.ui_win_logs.append(_div_el);

        me.appData.logRecords++;
        return _div_el;
    }
    //--其他对外接口。

    /******
     * 最常用的几个接口。
     * *******/


    /***在控制台打印消息。
     * @param message 需要打印的消息。
     * @param msgType 消息类型,默认为 info。总共有:info,success,error,warning
     * ***/
    ,log:function(message,msgType){

        //--计算目前已经有多少条信息了。
        var me=this;
        if(me.appData.hasInit){
            me._appendConsoleItem(message,msgType);
        }
        else{
            me._putIntoLogQueue(message,msgType);
        }

    }
    /**
     * 在控制台打印信息,
     * @param message 打印的信息。
     * @styleObj 自定义样式 譬如:{color:"red","font-weight":"bold"}这种。
     * ***/
    ,customLog:function(message,styleObj){
        //--计算目前已经有多少条信息了。
        var me=this;
        //--判断是否需要删除某些元素。


        if(me.appData.hasInit){
            me._appendConsoleItem(message,"custom",styleObj);
        }
        else{
            me._putIntoLogQueue(message,"custom",styleObj);
        }
    }
    /***
     * 打印脚本出错信息。
     * @param exceptionObj 脚本错误时候捕获的对象。当然假如传入string那么只能打印string了。
     * ****/
    ,printException:function( errorMessage, scriptURI, lineNumber){
        var me=this;

        if(me.appData.hasInit){
            var _div_msg=$("<div></div>").text(errorMessage);
            var _div_uri=$("<div></div>").text(scriptURI);
            var _div_lineNumber=$("<div></div>").text("脚本行号:"+lineNumber);
            var result_div=$("<div></div>");
            result_div.append(_div_msg).append(_div_uri).append(_div_lineNumber);
            me._appendConsoleItem(result_div,"error");
        }
        else{
            me._putIntoExceptionQueue(errorMessage,scriptURI,lineNumber);
        }
    }
    //--注册相关命令。
    ,registerCommand:function(cmdName,cmdMethod,context){
        var me=this;
        if(me.appData.hasInit==false){
            me._putIntoCommandQueue(cmdName,cmdMethod,context);
            return;
        }
        var _element=$('<div class="wcmd-command-item"><span class="wcmd-cmd-name" ui="wcmd-cmd-name"></span><a href="javascript:void(0);" class="wcmd-run-button" ui="wcmd-cmd-run">执行</a></div>');
        _element.find('[ui="wcmd-cmd-name"]').text(cmdName);
        _element.find('[ui="wcmd-cmd-run"]').click(function(){
            if(cmdMethod){
                cmdMethod();
            }
        });
        me.uiData.ui_win_commands.append(_element);
    }
    ,clear:function(){
        var me=this;
        me.appData.logRecords=0;
        me.uiData.ui_win_logs.empty();
    }
};
window.onerror =function(errorMessage, scriptURI, lineNumber) {
    var erorMsg={
        message: errorMessage,
        script: scriptURI,
        line: lineNumber
    };
    WebConsole.printException(errorMessage,scriptURI,lineNumber);
};
$(function() {
    var _shakeNum = 0;
    WebConsole.__init({});
    var myShakeEvent = new Shake({
        threshold: 15
    });

    myShakeEvent.start();

    window.addEventListener('shake', function () {
        _shakeNum++;
        if (_shakeNum == 3 || _shakeNum == 5 || _shakeNum == 7 || _shakeNum == 9) {
            WebConsole.noticeButtonAnimation(2500);
        }
        else if (_shakeNum > 7) {

        }
    }, false);
});

html代码

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2015/9/22
  Time: 11:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title></title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
  <meta name="format-detection" content="telephone=no">
  <script src="/static/lib/jquery-1.11.0.min.js"></script>
  <script src="/static/lib/jquery-migrate-1.2.1.js"></script>
  <script src="/static/lib/shake.js"></script>

  <link rel="stylesheet" type="text/css" href="style.css">
  <script type="text/javascript" src="WebConsole.js"></script>

</head>
<body>


<script type="text/javascript">



    /*
    WebConsole.registerCommand("测试1",function(){
      alert("测试一");
    },null);
    WebConsole.registerCommand("测试2",function(){
      alert("测试2");
    },null);

    */

//WebConsole.log("nihaoma?","error");
  console.log(WebConsole.appData.hasInit);
  try{
    console.log("操作时间:"+new Date());
    WebConsole.log("nihaoma?","error");
    WebConsole.registerCommand("测试1",function(){
      alert("测试一");
    },null);
    WebConsole.registerCommand("测试2",function(){
      alert("测试2");
    },null);
  }
  catch (ex){
    console.error(ex);
  }
</script>
</body>
</html>

相关界面

这里写图片描述

这里写图片描述

输入密码
这里写图片描述

点击我知道了,然后出现了控制台的开关按钮。

这里写图片描述

下面是控制台的面貌
这里写图片描述

点击最大化

这里写图片描述

demo下载

这里下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值