写在前面
1, 开发者在发的时候进行了copy ,copy后没有进行更改。COPY的坑真的很大,要注意啊。
2, 对于变量的声明 没有搞清楚他的作用域,这个是开发者的水平的问题,需要加快学习,完善自己。
3,我们自己的变量,方法的命名,不仅仅要和JavaScript的 关键字躲避开,也要躲开我们用的各种js框架的插件的关键字等等。
4 ,关键的问题,开发者的开发的水平参差不齐,需求的不定性,管理跟不上。
革命尚未成功,同志仍需努力!
点击菜单A 出现如下效果图, 没有构造出来datagrid,当然这是因为找不到_tollbar 这个变量的问题,这个问题别着急,往下看
点B的效果图 如下,有工具栏,注意看title “这是B页面”
好了,然后我们再点回A 看看,效果如下如所示
<%--
Created by IntelliJ IDEA.
User: sunjiyun
Date: 2016/3/1
Time: 8:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
<link rel="stylesheet" type="text/css" href="../js/jslibs/jquery-easyui-1.4.4/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="../js/jslibs/jquery-easyui-1.4.4/themes/icon.css">
<%--<link rel="stylesheet" type="text/css" href="../demo.css">--%>
<script type="text/javascript" src="../js/jslibs/jquery-easyui-1.4.4/jquery.min.js"></script>
<script type="text/javascript" src="../js/jslibs/jquery-easyui-1.4.4/jquery.easyui.min.js"></script>
</head>
<body>
<h2>Basic Layout</h2>
<p>The layout contains north,south,west,east and center regions.</p>
<div style="margin:20px 0;"></div>
<div class="easyui-layout" style="width:700px;height:350px;">
<div data-options="region:'north'" style="height:50px"></div>
<div data-options="region:'south',split:true" style="height:50px;"></div>
<div data-options="region:'east',split:true" title="East" style="width:100px;"></div>
<div data-options="region:'west',split:true" title="West" style="width:100px;">
<ul id="menu">
<li id="A">菜单1-A</li>
<li id="B">菜单2-B</li>
</ul>
</div>
<div data-options="region:'center',title:'Main Title',iconCls:'icon-ok'">
<div class="easyui-panel" id="centerTab"
data-options="border:false,fit:true" style="background:#eee;display:block;">
</div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){
$("#menu li").click(function(){
var _id = $(this).attr("id");
$('#centerTab').panel({
href:getRootPath()+'/blogs/jsscope/'+_id+".jsp"
});
});
function getRootPath() {
//获取当前网址,如: http://localhost:8083/uimcardprj/share/meun.jsp
var curWwwPath = window.document.location.href;
//获取主机地址之后的目录,如: uimcardprj/share/meun.jsp
var pathName = window.document.location.pathname;
var pos = curWwwPath.indexOf(pathName);
//获取主机地址,如: http://localhost:8083
var localhostPaht = curWwwPath.substring(0, pos);
//获取带"/"的项目名,如:/uimcardprj
var projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1);
return (localhostPaht + projectName+"/");
}
})
</script>
</body>
</html>
<table class="easyui-datagrid" title="这是A页面" style="width:700px;height:250px"
data-options="singleSelect:true,collapsible:true,url:'datagrid_data1.json',method:'get',toolbar:_toolbar">
<thead>
<tr>
<th data-options="field:'itemid',width:80">Item ID</th>
<th data-options="field:'productid',width:100">Product</th>
<th data-options="field:'listprice',width:80,align:'right'">List Price</th>
<th data-options="field:'unitcost',width:80,align:'right'">Unit Cost</th>
<th data-options="field:'attr1',width:250">Attribute</th>
<th data-options="field:'status',width:60,align:'center'">Status</th>
</tr>
</thead>
</table>
<body>
<table class="easyui-datagrid" title="这是B页面" style="width:700px;height:250px"
data-options="rownumbers:true,singleSelect:true,url:'datagrid_data1.json',method:'get',toolbar:_toolbar,">
<thead>
<tr>
<th data-options="field:'itemid',width:80">Item ID</th>
<th data-options="field:'productid',width:100">Product</th>
<th data-options="field:'listprice',width:80,align:'right'">List Price</th>
<th data-options="field:'unitcost',width:80,align:'right'">Unit Cost</th>
<th data-options="field:'attr1',width:240">Attribute</th>
<th data-options="field:'status',width:60,align:'center'">Status</th>
</tr>
</thead>
</table>
<script >
var _toolbar = [{
text:'增加',
iconCls:'icon-add',
handler:function()
{ }
},{
text:'删除',
iconCls:'icon-remove',
handler:function()
{ }
},{
text:'修改',
iconCls:'icon-edit',
handler:function()
{ }
}];
</script>
</body>
<script >
</script> 中声明的 ,那么说这个 _toobar 的作用域 是多大呢, 咱们用debugger 来看一下, 我们在声明_toolbar的下面加上debugger 看看
在chrome 浏览器中 F12 打开控制台看
在debugger 窗口中我们看到 watch ,call back ,scope 等选项卡, 我们点开scope 选项卡,选项卡下面有global选项,(你可以用var 声明个其他的东西 看看会不会出来个local选项)
而global 后面对着的是window ,那么说global下面包含哪些东西呢,我们点开看看,global下面的东西就是Window下面的东西
点开global 之后看到里面有好多东西,那么多,有的我能看懂,有的我也看不懂,不过没关系,找咱们关心的东西 _toolbar 到底在不在这儿,向下翻,很不幸,我们真的在Window下找到了它
也就是说 _toobar的有效范围是Window 那么说这个Window到底指的是谁呢, 那我们继续向下找,找什么呢,
找Window.location.href 这个的值就是这个Window 的页面地址
很明显 这个window 是main.jsp 这个页面,也就是说 当_toolbar初始化的时候,他就在Window(main.jsp)中有效了。
A.jsp/B.jsp 作为main.jsp的一部分,在main.jsp中的js中声明的变量啊,函数啊,在A.jsp/B.jsp中是有效的,能够访问到的。
为什么 情景一 不出现工具栏而且datagrid出不来呢 ? 因为当你初始化Main.jsp以后 你直接点击菜单A 这时候 A中的js 就会查找声明的变量,他找啊找,发现在A.jsp中找不到,然后他就向上找 找mian.jsp找,因为你main.jsp包含着我(A.jsp),你不能不管啊,就给main.jsp要,找啊找啊,还是没找到,找不到了 ,哎!
最后找吐血了,没办法,你也没有,我只能给你报个错,不让你正常了! 只能看到上面的那个出不来的datagrid 的图片了。
这个时候点击B.jsp B.JSP中声明了_toolbar,当然没问题了 所以B 页面能够正常显示。 这个时候main.jsp 也很高兴啊,刚才A。jsp给我要_toobar,都要吐血了,我都没有没法给他,现在B.jsp页面 你给我了,太好了,这个时候Main.jsp非常高兴,那个嘚瑟啊
这个时候A回来了 点击A 。jsp ,A.jsp不高兴,但是既然点击我了,我就得给你工作,他没有_toolbar,还是给main.jsp要,这次main.jsp吧别人给他的_toobar偷偷地给了A 。A不温不火的走了,你给了我就好好给你干活,上次都不给我,
既然Main.jsp把_toolBar 给他了,他也没理由不好好工作了,所以这时候能够正常显示datagrid了,并且把工具栏带来了。
不知道 大概你明白 为什么了吗?
关于 作用域的 问题,网上有一大推的材料,我也解释不了。
下面说说这个问题出现的原因
1, 开发者在发的时候进行了copy ,copy后没有进行更改。COPY的坑真的很大,要注意啊。
2, 对于变量的声明 没有搞清楚他的作用域,这个是开发者的水平的问题,需要加快学习,完善自己。
3, 关于变量的命名的问题,为什么我们的页面在测试的时候没出现datagrid的出不来的现象呢, 因为我们的代码是这样的
因为<在options 中key 和value 都是一样的,也就是说 后面的这个toolbar 是本来开发者自己定义的。但是这里也是被叫做toolbar,由于js的特殊性,这个toolbar 和key 的toolbar 是一个东西呗。
也就是说我们自己的变量,方法的命名,不仅仅要和JavaScript的 关键字躲避开,也要躲开我们用的各种js框架的插件的关键字等等。
4 ,关键的问题,开发者的开发的水平参差不齐,需求的不定性,管理跟不上。
革命尚未成功,同志仍需努力!
预知后事如何,且听下回分解!