注意事项和debug调试chrome浏览器--1

注意事项:登录时每次获取信息都会进入拦截器,权限的判断设置。

chorme的调试方法快捷键如下:

Console()

  • Ctrl + L : 清除控制台消息
  • Enter: 执行代码或者命令

Debugger(调试面板)

  • F8  or  Ctrl + \: 暂停/继续
  • F10  or  Ctrl + ': 单步执行
  • F11  or Ctrl +;: 单步进入

  • Shift + F11  or Ctrl + Shift+;: 单步退出
  • Ctrl +./Ctrl+, : 上一帧/下一帧(译为框架怪怪的)
  • Ctrl +Shift+E: 被选中代码在控制台中打印出console信息(非常实用)
  • Ctrl + Shift + A: 添加到debugger的watch里面,可以关注你选中内容的变化
  • Ctrl + B: 打断点/取消断点(很实用)


Timeline Panel(时间轴面板)

  • Ctrl + E:开始
  • Ctrl + S:保存时间轴数据
  • Ctrl + O:加载时间轴数据



一. 先来认识一下这些按钮


先来看这张图最上头的一行是一个功能菜单,每一个菜单都有它相应的功能和使用方法,依次从左往右来看 

1.箭头按钮:用于在页面选择一个元素来审查和查看它的相关信息,当我们在Elements这个按钮页面下点击某个Dom元素时,箭头按钮会变成选择状态


2.设备图标:点击它可以切换到不同的终端进行开发模式,移动端和pc端的一个切换,可以选择不同的移动终端设备,同时可以选择不同的尺寸比例,chrome浏览器的模拟移动设备和真实的设备相差不大,是非常好的选择


可选择的适配


3.Elements 功能标签页:用来查看,修改页面上的元素,包括DOM标签,以及css样式的查看,修改,还有相关盒模型的图形信息,下图我们可以看到当我鼠标选择id 为lg_tar的div元素时,右侧的css样式对应的会展示出此id 的样式信息,此时可以在右侧进行一个修改,修改即可在页面上生效, 灰色的element.style样式同样可以进行添加和书写,唯一的区别是,在这里添加的样式是添加到了该元素内部,实现方式即:该div元素的style属性,这个页面的功能很强大,在我们做了相关的页面后,修改样式是一块很重要的工作,细微的差距都需要调整,但是不可能说做到每修改一点即编译一遍代码,再刷新浏览器查看效果,这样很低效,一次性在浏览器中修改之后,再到代码中进行修改



  • 对应的样式


  • 盒模型信息

同时,当我们浏览网站看到某些特别炫酷的效果和难做的样式时候,打开这个功能,我们即可看到别人是如何实现的,学会它这知识就是你的了,仔细钻研也会有意想不到的收获


4.Console控制台:用于打印和输出相关的命令信息,其实console控制台除了我们熟知的报错,打印console.log信息外,还有很多相关的功能,下面简单介绍几个:

a: 一些对页面数据的指令操作,比如打断点正好执行到获取的数据上,由于数据都是层层嵌套的对象,这个时候查看里面的key/value不是很方便,即可用这个指令开查看,obj的json string 格式的key/value,我们对于数据里面有哪些字段和属性即可一目了然


其他功能

b: 除了console.log还有其他相关的指令可用


console也有相关的API

5.Sources js资源页面:这个页面内我们可以找到当然浏览器页面中的js 源文件,方便我们查看和调试,在我还没有走出校园时候,我经常看一些大站的js代码,那时候其实基本都看不懂,但是最起码可以看看人家的代码风格,人家的命名方式,所有的代码都是压缩之后的代码,我们可以点击下面的{}大括号按钮将代码转成可读格式

Sources Panel 的左侧分别是 Sources 和 Content scripts和Snippets


  • 对应的源代码



  • 格式化后的代码

关于打断点调试的内容,下面介绍,先来说一些,其他平时基本没人用但是很有用的小点,比如当我们想不起某个方法的具体使用时候,会打开控制台随意写一些测试代码,或者想测试一下刚刚写的方法是否会出现期待的样子,但是控制台一打回车本想换行但是却执行刚写的半截代码,所以推荐使用Sources下面的左侧的Sinppets代码片段按钮,这时候点击创建一个新的片段文件,写完测试代码后把鼠标放在新建文件上run,再结合控制台查看相关信息(新建了一个名叫:app.js的片段代码,在你的项目环境页面内,该片段可执行项目内的方法)



  • 自己书写的片段

Content scripts 是 Chrome 的一种扩展程序,它是按照扩展的ID来组织的,这些文件也是嵌入在页面中的资源,这类文件可以读写和操作我们的资源,需要调试这些扩展文件,则可以在这个目录下打开相关文件调试,但是几乎我们的项目还没有相关的扩展文件,所以啥也看不到,平时也不需要关心这块

无结果

6.Network 网络请求标签页:可以看到所有的资源请求,包括网络请求,图片资源,html,css,js文件等请求,可以根据需求筛选请求项,一般多用于网络请求的查看和分析,分析后端接口是否正确传输,获取的数据是否准确,请求头,请求参数的查看

  • 所有的资源

以上我选择了All,就会把该页面所有资源文件请求下来,如果只选择XHR 异步请求资源,则我们可以分析相关的请求信息


  • 请求的相关信息

打开一个Ajax异步请求,可以看到它的请求头信息,是一个POST请求,参数有哪些,还可以预览它的返回的结果数据,这些数据的使用和查看有利于我们很好的和后端工程师们联调数据,也方便我们前端更直观的分析数据


  • 预览请求的数据

7.Timeline标签页可以显示JS执行时间、页面元素渲染时间,不做过多介绍


8.Profiles标签页可以查看CPU执行时间与内存占用,不做过多介绍


9.Resources标签页会列出所有的资源,以及HTML5的Database和LocalStore等,你可以对存储的内容编辑和删除 不做过多介绍


10.Security标签页 可以告诉你这个网站的安全性,查看有效的证书等


11.Audits标签页 可以帮你分析页面性能,有助于优化前端页面,分析后得到的报告


  • 分析结果


二.Sources资源页面的断点调试

1.如何调试:

调试js代码,肯定是我们常用的功能,那么如何打断点,找到要调试的文件,然后在内容源代码左侧的代码标记行处点击即可打上一个断点

2.断点与 js代码修改

看下面这张图,我在一个名为toggleTab的方法下打了两个断点,当开始执行我们的点击切换tab行为后,代码会在执行的断点出停下来,并把相关的数据展示一部分,此时可以在已经执行过得代码处,把鼠标放上去,即可查看相关的具体数据信息,同时我们可以使用右侧的功能键进行调试,右侧最上面一排分别是:暂停/继续、单步执行(F10快捷键)、单步跳入此执行块(F11快捷键)、单步跳出此执行块、禁用/启用所有断点。下面是各种具体的功能区


  • 在代码中打断点


在当前的代码执行区域,在调试中如果发现需要修改的地方,也是可以立即修改的,修改后保存即可生效,这样就免去了再到代码中去书写,再刷新回看了


临时修改


3.快速进入调试的方法

当我们的代码执行到某个程序块方法处,这个方法上可能你并没有设置相关的断点,此时你可以F11进入此程序块,但是往往我们的项目都是经过很多源代码封装好的方法,有时候进入后,会走很多底层的封装方法,需要很多步骤才能真正进入这个函数块,此时将鼠标放在此函数上,会出现相关提示,会告诉你在该文件的哪一行代码处,点击即可直接看到这个函数,然后临时打上断点,按F10或者点击右上角的第二个按钮即可直接进入此函数的断点处


4.调试的功能区域

每一个功能区,都有它相关的左右,先来看一张图,它都有哪些功能

Call Stack调用栈:当断点执行到某一程序块处停下来后,右侧调试区的 Call Stack 会显示当前断点所处的方法调用栈,从上到下由最新调用处依次往下排列,Call Stack 列表的下方是Scope Variables列表可以查看此时局部变量和全局变量的值。图中可以看出,我们最先走了toggleTab这个方法,然后走到了一个更新对象的方法上,当前调用在哪里,箭头会帮你指向哪里,同时我们可以点击,调用栈列表上的任意一处,即可回头再去看看代码

但是若你想从新从某个调用方法出执行,可以右键Restart Frame, 断点就会跳到此处开头重新执行,Scope 中的变量值也会依据代码从新更改,这样就可以回退来从新调试,错过的调试也可以回过头来反复查看

Breakpoints关于断点:所有当前js的断点都会展示在这个区域,你可以点击按钮用来“去掉/加上”此处断点,也可以点击下方的代码表达式,调到相应的程序代码处,来查看

XHR Breakpoints

在XHR Breakpoints处,点击右侧的+号,可以添加请求的URL,一旦 XHR 调用触发时就会在 request.send() 的地方中断

DOM Breakpoints:

可以给你的DOM元素设置断点,有时候真的需要监听和查看某个元素的变化情况,赋值情况,但是我们并是不太关心哪一段代码对它做的修改,只想看看它的变化情况,那么可以给它来个监听事件,这个时候DOM Breakpoints中会如图

当要给DOM添加断点的时候,会出现选择项分别是如下三种修改1.子节点修改2.自身属性修改3.自身节点被删除。选中之后,Sources Panel 中右侧的 DOM Breakpoints 列表中就会出现该 DOM 断点。一旦执行到要对该 DOM 做相应修改时,代码就会在那里停下来

Event listener Breakpoints 

最后Event Listener 列表,这里列出了各种可能的事件类型。勾选对应的事件类型,当触发了该类型的事件的 JavaScript 代码时就会自动中断


三.Post man你值得拥有的网络请求神器

在我们的开发过程中,后端的接口都是由发起AJAX请求而获取到的相关数据,但是很多情况是我们的业务还没有做到那块时,后端的同学接口都已经准备好了,但是为了便于后期的工作,将接口请求的数据模拟访问,然后对接口联调很重要,也很方便,因为我们不可能把每个请求代码都写到文件里编译好了再去浏览器内查看,这时候可以安装一个post man网络请求插件,在谷歌应用商店下载,需要翻墙

该扩展程序使用非常简单,功能同时也非常强大,输入你的请求,选择好请求的method,需要请求参数的挨个填好,send之后,就可以看到返回的数据,这个小工具很利于我们的开发


前后台数据的交互。

function loadTree() {
$.post(basePath + "/login/getMenu", function(data) {
var menulist = [];
$.each(data, function(i, item) {
menulist.push({
id: item.id,
text: item.menu_name,
attributes: basePath + item.menu_url, 
parent_id: item.parent_id,
iconCls: item.icon
});
});

for(var i = 0; i < menulist.length; i++) {
var children = menulist[i].children || [];
for(var j = 0; j < menulist.length; j++) {
if(menulist[j].parent_id == menulist[i].id) {
children.push(menulist[j]);
}
}
menulist[i].children = children;
}

var treeData = [];
$.each(menulist, function(i, item) {
if(item.parent_id == 0) {
treeData.push(item);
}
});
$("#menuTree").tree({
data: treeData,
onBeforeSelect: treeBeforeSelect, 
onSelect: treeSelect
});
});

}


login=================getMenu遍历展示出左边和组件结合展示右边。列表展示出来了。

menulist,大多数关联listPage界面,一部分关联list界面,还有为空的界面,应该是存储时存入的界面。

其中parent——id为0的是一级目录,代码生成时会有规定,需要研究权限部分。

  1. 0:{id12text"小说采集"attributes"/tspace/17/listPage"parent_id9iconCls"glyphicon-cd", …}
  2. 1:{id2text"在线表单"attributes"/tspaceHead/list"parent_id1iconCls"glyphicon-cloud", …}
  3. 2:{id6text"角色管理"attributes"/tspace/8/listPage"parent_id5iconCls"glyphicon-user", …}
  4. 3:{id10text"客户管理"attributes"/tspace/15/listPage"parent_id9iconCls"glyphicon-th-list", …}
  5. 4:{id9text"内容管理"attributes"null"parent_id0iconCls"glyphicon-search", …}
  6. 5:{id11text"大盘数据"attributes"/tspace/16/listPage"parent_id9iconCls"glyphicon-flag", …}
  7. 6:{id7text"系统用户"attributes"/tspace/12/listPage"parent_id5iconCls"glyphicon-king", …}
  8. 7:{id15text"定时任务"attributes"/task/listPage"parent_id1iconCls"glyphicon-tasks", …}
  9. 8:{id14text"图片管理"attributes"/tspace/18/listPage"parent_id9iconCls"glyphicon-picture", …}
  10. 9:{id5text"用户管理"attributes"null"parent_id0iconCls"glyphicon-user", …}
  11. 10:{id3text"菜单管理"attributes"/menu/list"parent_id1iconCls"glyphicon-menu-hamburger", …}
  12. 11:{id1text"系统管理"attributes"null"parent_id0iconCls"glyphicon-cog", …}
  13. 12:{id4text"字典管理"attributes"/tspace/7/listPage"parent_id1iconCls"glyphicon-book", …}
  14. 13:{id13text"操作日志"attributes"/oplog/listPage"parent_id1iconCls"glyphicon-time", …}
  15. length:14
  16. __proto__:Array(0)
  17. $.post(basePath + "/login/getMenu", function(data) {
       var menulist = [];
       $.each(data, function(i, item) {
          menulist.push({
             id: item.id,
             text: item.menu_name,
             attributes: basePath + item.menu_url, 
             parent_id: item.parent_id,
             iconCls: item.icon
          });
       });

点击任意一个一级目录下的小目录:加载TspanceController方法的listPage。每个小模块处点击会有id传进去。

然后调用后台方法。

for(var i = 0; i < menulist.length; i++) {
      var children = menulist[i].children || [];
      for(var j = 0; j < menulist.length; j++) {
         if(menulist[j].parent_id == menulist[i].id) {
            children.push(menulist[j]);
         }
      }
      menulist[i].children = children;
   }
   
   var treeData = [];
   $.each(menulist, function(i, item) {
      if(item.parent_id == 0) {
         treeData.push(item);
      }
   });
   $("#menuTree").tree({
      data: treeData,
      onBeforeSelect: treeBeforeSelect, 
      onSelect: treeSelect
   });
});

  1. 0:{id9text"内容管理"attributes"null"parent_id0iconCls"glyphicon-search", …}
  2. 1:{id5text"用户管理"attributes"null"parent_id0iconCls"glyphicon-user", …}
  3. 2:{id1text"系统管理"attributes"null"parent_id0iconCls"glyphicon-cog", …}
  4. length:3
  5. __proto__:Array(0)
    1. concat:ƒ concat()
    2. constructor:ƒ Array()
    3. copyWithin:ƒ copyWithin()
    4. entries:ƒ entries()
    5. every:ƒ every()
    6. fill:ƒ fill()
    7. filter:ƒ filter()
    8. find:ƒ find()
    9. findIndex:ƒ findIndex()
    10. forEach:ƒ forEach()
    11. includes:ƒ includes()
    12. indexOf:ƒ indexOf()
    13. join:ƒ join()
    14. keys:ƒ keys()
    15. lastIndexOf:ƒ lastIndexOf()
    16. length:0
    17. map:ƒ map()
    18. pop:ƒ pop()
    19. push:ƒ push()
    20. reduce:ƒ reduce()
    21. reduceRight:ƒ reduceRight()
    22. reverse:ƒ reverse()
    23. shift:ƒ shift()
    24. slice:ƒ slice()
    25. some:ƒ some()
    26. sort:ƒ sort()
    27. splice:ƒ splice()
    28. toLocaleString:ƒ toLocaleString()
    29. toString:ƒ toString()
    30. unshift:ƒ unshift()
    31. values:ƒ values()
    32. Symbol(Symbol.iterator):ƒ values()
    33. Symbol(Symbol.unscopables):{copyWithintrueentriestruefilltruefindtruefindIndextrue, …}
    34. __proto__:Object


jQuery EasyUI 数据网格与树插件 – Tree 树

jQuery EasyUI 数据网格与树插件 -  Tree 树

通过 $.fn.tree.defaults 重写默认的 defaults。

树(tree)在网页中以树形结构显示分层数据。它向用户提供展开、折叠、拖拽、编辑和异步加载功能。

依赖

  • draggable
  • droppable

用法

树(tree)定义在 <ul> 元素中。该标记可定义叶节点和子节点。节点将是 ul 列表内的 <li> 元素。下面演示了将被用于制作嵌套在 ul 元素内的树节点的元素。

<ul id="tt" class="easyui-tree">
    <li>
		<span>Folder</span>
		<ul>
			<li>
				<span>Sub Folder 1</span>
				<ul>
					<li><span><a href="#">File 11</a></span></li>
					<li><span>File 12</span></li>
					<li><span>File 13</span></li>
				</ul>
			</li>
			<li><span>File 2</span></li>
			<li><span>File 3</span></li>
		</ul>
	</li>
    <li><span>File21</span></li>
</ul>

树(Tree)也可以在一个空的 <ul> 元素中定义,可使用 javascript 加载数据。

<ul id="tt"></ul>
$('#tt').tree({
    url:'tree_data.json'
});

使用 loadFilter 来处理来自 ASP.NET web 服务的 json 数据。

$('#tt').tree({
    url: ...,
    loadFilter: function(data){
		if (data.d){
			return data.d;
		} else {
			return data;
		}
    }
});

树的数据格式(Tree Data Format)

每个节点可以包括下列属性:

  • id:节点的 id,它对于加载远程数据很重要。
  • text:要显示的节点文本。
  • state:节点状态,'open' 或 'closed',默认是 'open'。当设置为 'closed' 时,该节点有子节点,并且将从远程站点加载它们。
  • checked:指示节点是否被选中。
  • attributes:给一个节点添加的自定义属性。
  • children:定义了一些子节点的节点数组。

实例:

[{
    "id":1,
    "text":"Folder1",
    "iconCls":"icon-save",
    "children":[{
		"text":"File1",
		"checked":true
    },{
		"text":"Books",
		"state":"open",
		"attributes":{
			"url":"/demo/book/abc",
			"price":100
		},
		"children":[{
			"text":"PhotoShop",
			"checked":true
		},{
			"id": 8,
			"text":"Sub Bookds",
			"state":"closed"
		}]
    }]
},{
    "text":"Languages",
    "state":"closed",
    "children":[{
		"text":"Java"
    },{
		"text":"C#"
    }]
}]

异步树

树支持内置的异步加载模式,因此用户可以创建一个空的树,然后指定一个动态返回 JSON 数据的服务器端,用于根据需求异步填充树。下面是一个实例:

<ul class="easyui-tree" data-options="url:'get_data.php'"></ul>

树是通过 URL 'get_data.php' 加载的。子节点依赖于父节点状态被加载。当展开一个关闭的节点时,如果该节点没有子节点加载,它将通过上面定义的 URL 向服务器发送节点的 id 值作为名为 'id' 的 http 请求参数,以便检索子节点。

请看从服务器返回的数据:

[{
    "id": 1,
    "text": "Node 1",
    "state": "closed",
    "children": [{
		"id": 11,
		"text": "Node 11"
    },{
		"id": 12,
		"text": "Node 12"
    }]
},{
    "id": 2,
    "text": "Node 2",
    "state": "closed"
}]

节点 1 和节点 2 是关闭的,当展开节点 1 时,将直接展示它的子节点。当展开节点 2 时,将向服务器发送 value(2) 以便检索子节点。

本教程中的 创建异步树 演示了如何编写服务器代码来根据需求返回树的数据。

事件

很多事件的回调函数需要 'node' 参数,它包括下列属性:

  • id:绑定到节点的标识值。
  • text:要显示的文本。
  • iconCls:用来显示图标的 css class。
  • checked:节点是否被选中。
  • state:节点状态,'open' 或 'closed'。
  • attributes:绑定到节点的自定义属性。
  • target:目标的 DOM 对象。

加载了控制菜单点击的事件-----请求路径:tspaceController中的

 
 
 
 
/**
 * 菜单事件
 */
function treeSelect(node) {
   addMainTab(node.text, node.attributes);
}



左边所有的菜单的点击事件最终都会调用同一个方法来控制框架的嵌入。
 
 

/**

 
 
 * 增加一个主窗口
 */
function addMainTab(text, url) {
   if(!mainTabs.tabs("exists", text)) {
      mainTabs.tabs('add',{
            title: text,
            content:'<iframe src="' + url + '" class="easyui-panel" data-options="fit:true,border:false" frameborder="0"></iframe>',
            closable:true
        });
    }else {
       mainTabs.tabs("select", text);
       //刷新
       mainTabs.tabs('getSelected').panel('panel').find('iframe').attr("src", url)
    }
}
还有有一个菜单点击打开收起的功能。
 
 
/**
 * 菜单事件
 */
function treeBeforeSelect(node) {
    if(node.children && node.children.length > 0) {
        if(node.state == "open") {
            $(this).tree("collapse", node.target);
        }else {
            $(this).tree("expand", node.target);
        }
        return false;
    } 
}


node = {id12text"小说采集"attributes"/tspace/17/listPage"parent_id9iconCls"glyphicon-cd", …}
116
    addMainTab(node.text, node.attributes);
117
}
118
119
/**
120
 * 增加一个主窗口
121
 */
122
function addMainTab(text, url) {
123
    if(!mainTabs.tabs("exists", text)) {
124
        mainTabs.tabs('add',{
125
            title: text,
126
            content:'<iframe src="' + url + '" class="easyui-panel" data-options="fit:true,border:false" frameborder="0"></iframe>',
127
            closable:true
128
        });
129
    }else {
130
        mainTabs.tabs("select", text);
131
        //刷新
132
        mainTabs.tabs('getSelected').panel('panel').find('iframe').attr("src", url)
133
    }
134
}
135
136
/**
137
 * 全屏
138
 */
139
function fullScreen() {
140
    if($("#fullScreen").find(".glyphicon-screenshot").length > 0) {
141
 

       $("#layout").layout('expand', 'west').layout('expand', 'north');
2 lines, 69 characters selected

猜你喜欢

转载自blog.csdn.net/weixin_36810906/article/details/80421109
今日推荐