1.由于工作需要,需要自己在一个dojo小部件中写一个垂直滚动条,但是发现在我拖动自定义的滑块进行滑动的时候,发现容易选中周围的一些文本,使得被选中的文本变为蓝色,很影响效果,后来发现在div上加上onselectstart="return false"即可,如果还有可能选中body中其他部分的文字,那么就在body上添加此语句即可,这样在鼠标左键按下拖拽的过程中不会选中文本。
2.dojo.toJson()与dojo.fromJson()在名字上容易给人歧义,其实dojo.toJson()应该改名为dojo.toJsonString()最好,就是将一个Json的Object对象转换为相应的字符串;dojo.fromJson()应该改名为dojo.fromJsonString()最好,就是讲一个字符串转换为Json的Object对象。可以通过dojo.toJson()和dojo.fromJson()实现对象之间的深拷贝,很实用的功能。
dojo.toJson({age:1});得到"{"age":1}"
dojo.fromJson(dojo.toJson({age:1}))输出如下信息:
Object
age: 1
__proto__: Object
3.用dojo.addOnUnload在页面关闭之前调用。
4.判断某个变量是不是数组的代码:
isArray:function(o) { return Object.prototype.toString.call(o) === '[object Array]'; }
详见:http://www.ibm.com/developerworks/cn/web/wa-aj-dojotool/
6.如果只设置背景的颜色,尽量不要直接使用background,最好用background-color,这样不会覆盖background-image等其他设置信息。
7.ArcGIS JS API实现具有缓存功能的书签:
window.localStorage.setItem("山东省",dojo.toJson(map.extent.toJson()));//将范围信息以字符串的形式保存到localStorage中 map.setExtent(new esri.geometry.Extent(dojo.fromJson(window.localStorage.getItem("山东省"))));//根据localStorage中保存的范围字符串信息生成Extent对象
new dojo.dnd.Moveable(this.domNode,{handle:this.head});
9.for in是用来遍历对象中的属性的,不要用来遍历数组。假设一个数组有三个元素,那么如果用for in进行遍历,会遍历四次,最后一次的元素是一个“constructor”对象,所以遍历数组不能用for in。
10.ctrl+alt+l在WebStorm中格式化js、html、css文件
11.<div style="background:url('../images/btn_menu.jpg')"></div>如果不设置div宽高,那么不可见
<img src="../images/btn_menu.jpg" />则没问题,不用设置宽高也可以
12.通过js代码控制innerHTML实现重dom节点刷新:
var html = dom.innerHTML; dom.innerHTML = ""; //dojo.empty(dom); dom.innerHTML = html;
13.必须设置了width后,margin-left:auto和margin-right:auto才能起到居中的作用。
14.用SVN进行代码管理,每个文件夹下都有一个隐藏的名为.svn的文件夹,有时候不能提交,可以先备份,然后把相应的.svn文件夹删除然后提交。给别人传东西的时候把目录下的隐藏的.svn文件夹删掉,否则会暴露出svn服务器的信息。
15.div高度不设置,那么设置margin-top、margin-bottom不起作用
16.用dojo.dnd.Moveable实现div拖动
new dojo.dnd.Moveable("drag", { handle: "drag_handle" });17.自己写了个dojo小部件BookMark,代码如下:
var bookMark = new gistech.widgets.bookMark.BookMark({map:map});
之后立即去获取bookMark.domNode的clientWidth和clintHeight都是0,后来将其domNode的设置为overflow:hidden,然后再获取,发现还是0,
后来发现必须将其插入到dojo.body()中才能获取可见数值。
19.clientHeight与height不一样,那么clientHeight = borderTop+paddingTop+height+paddingBottom+borderBottom,注意,不包括margin
20.dojo.style(setStudyArea.domNode, "position", "absolute");//注意是对domNode操作style,而不是对小部件直接操作style
21.在用dojo.style读取height、marginTop、paddingTop之类的和数字相关的style时,返回值是数字,不包括“px”;用dojo.style设置height、marginTop、paddingTop之类的和数字相关的style时,将“10px”这样作为参数进行传递,不能只是数字,需要包括“px”。
dojo.style(dojo.byId("slideBlockContainer"),"top") 10 dojo.style(dojo.byId("slideBlockContainer"),"top","30px") "30px"
dojo.style(this.contentBody,"height","auto"); "auto" dojo.style(this.contentBody,"height"); 521 this.contentBody.style.height "auto" this.contentBody.clientHeight 521如果当前设置的height为auto,那么用dojo.style方式取出的height为clientHeight,是一个具体数字,用dom.style.height取出的为auto,
23.<div class="slideBlockContainer" onclick="onMouseDown(event)"> 要有括号,括号里必须写event,如果没写参数或者参数写的不是event(比如写了evt),那么也无法传递事件参数。
24.想获取borderTop的宽度,用dojo.style(this.content,"borderTop")获取,结果得到"3px solid rgb(0, 58, 106)",然后分别用js原生方式和dojo.style方式去获取borderTopWidth的值,结果如下:
this.content.style.borderTopWidth "" dojo.style(LMC.content,"borderTopWidth") 3发现原生方式返回“”,而dojo.style能够返回正确的结果。
25.dojo小部件开发过程中,有时候需要动态创建一些复杂的dom节点,此时可以使用dojo.create("div",{innerHTML:"Some InerHTML",className:"someClass",style:{}}),但是如果要创建的dom节点非常复杂,那么dojo.create中innerHTML的字符串就很长,而且要弄成一行的形式,很长也很麻烦,也不便于后期修改。如果遇到这样的情况,可以将innerHTML的dom节点写到一个单独的html页面中,然后利用dojo.cache("模块名","模板文件名")的方式获取innerHTML,这样以后我们在修改的时候直接对那个模板中的html页面做修改就可以了。