300+Jquery,CSS,MooTools和JS的导航菜单

引用
如果你是网站前端开发人员,那么对你来说,也许做一个漂亮导航菜单会很得心应手。但今天我要为大家总结各种导航菜单的资源,以便让大家的网站前端开发的工作更方便更快速,只要选择现成的例子就可以应用于自己的网站了。我收集的这些资源,从非常简单的HTML和CSS导航菜单,到非常复杂和高级的JQuery、JavaScript和MooTools技术,这都可以让你轻松实现褪色、滑动、拖动等效果。

http://article.yeeyan.org/view/47543/19224 from_com 并对其中一种效果进行了整理:已作为附件上传。

客户端编程--JavaScript(2)

for-in 循环
       用来遍历一个对象的所有用户定义的属性或者一个数组的的所有元素.
预定义函数
  eval(String) 用于在不引用任何特定对象的情况下广告牌代码字符串.
  isNaN(测试值) 用于难参数是否为数字,不是数字返回true,是返回false.

JavaScript   中的对象分为四种
       1. 用户自定义对象.
    2.内置对象:与数据类型相关的(String Number Boolean) 允许创建用户自定义对象和复合数据类型的对象(Objice和Array)  用于简化日常工作的Date Month RegExp
       3.浏览器对象
    4.文档对象  访问文档对象的方法是通过window.document属性

实例属性:在JavaScript中动态地给对象添加属性.
     var myString = new String(“Helo,JavaScript”);
                    myString.simpleExample = true;
还可以动态地添加对象方法.

每一个对象都有一个prototype属性 叫原型.
        Robot.prototype.hasJetpack = false;
        Robot.prototype.doAction = function() {alert(“!!1”);};

Class属性(静态属性)
    Robot.isMetallic = true;

JavaScript 中的继承是通过原型来实现的.
    先定义构造器 再把原型指向父类的实例.
    function UltraRobot(){}
    UltraRobot.prototype = new Robot();

JavaScript的内置对象:
1.Array对象
    删除数组元素 delete myArray[1];  *删除并不改变数组维数只是将值设为undefined.
    方法:join()  把一个数组中所有的数据以一个字符串的形式表达出来.
    reverse()    数组中的元素整个反转 即最后一个元素转到下标为0的位置
                pop()   删除数组中的最后一个元素并返回.
                push()  压个元素到数组的最后一个.
                concat()  合并两个数组
                slice(start, [end] 获得数组中的一个部分元素 下标从start 到end.
                valueOf() 返回对象的原始值.
2.String对象
             charAt(num)
             charCodeAt(num) 返回参数num指定索引位置处字符的值
             Cancat(String) 将string添加到末尾
3.Math对象
4.Date对象
             getDate, getDay, gethours, getMinutes, getMonth, getSeconds, getTime, getTimeZoneOffset(获致时区偏移信息)getYear  setDate ……..setYear    toGMTString     toLocaleString   ToString  Parse  UTC(返回毫秒)
5.Event对象
6.RegExp对象
7.Number对象
8.Function对象
             Arguments 表示函数参数的数组
      Caller表示调用当前正在执行的函数
             Prototype为对象添加新的属性和方法
             Apply() 用于将一个对象中的方法应用到另外一个对象
             Call(this) 允许调用另外一个对象的的方法
9.Global对象

香港携手四川助地震伤员“站起来”

新华社记者孙浩:汶川大地震发生后,香港社会发起了可以说是有史以来规模最大的募捐行动。与此同时,在过去的一年中,还有不少香港人将自己的专业知识、技能、经验、精神投入到灾后重建工作中。他们的目标只有一个,就是在这样的关键时刻,为灾区同胞出把力,拉把手。就像歌曲《承诺》唱的那样,我要你重获原来的生活。

<script type=”text/javascript” language=”JavaScript” src=”http://xslt.alexa.com/site_stats/js/t/a url=rss.xinhuanet.com”></script>

男人:睡觉你应该知道的事

时间:2007-09-14 16:24:04 来源: 39健康网 阅读次数:
<script src=”http://daoyi.online.sh.cn/online/count.php id=19784″ type=”text/javascript”></script>
 


    毫不夸张地说,睡眠是健康的巨大源泉。男子怎样才能睡得好呢?首先,要养成按时入睡和起床的良好习惯,遵循睡眠与觉醒相交替的客观规律。这样,就能稳定睡 眠,避免引起大脑皮层细胞的过度疲劳。大家知道,严格的作息制度不仅是创造性劳动的保证,而且对于象睡眠和觉醒这类生理过程来说意义也是很大的。严格遵守 作息时间能使我们的睡眠和觉醒过程——甚至有可能象条件反射那样——来得更自然,进行得更为深刻。

    另外,睡前不要进行紧张的脑力劳动,避免剧烈的运动或体力劳动。取而代之的应该是在户外散步,尽量减少主观上的刺激。性格易于兴奋的男人,睡前不宜进行激动人心的讲话,不宜看动人心弦的书刊,不宜观看使人久久不能忘怀的电影或戏剧。晚饭不要过晚,也不应吃得过饱。
应该吃些容易消化的清淡食物,注意多食蔬菜和一定比例的杂粮,保持大便通畅。调料不宜用得过重。晚上不宜吸烟、不宜饮用浓茶或咖啡等刺激性饮料,也不要喝过多的饮料或流汁。烟、茶和咖啡等会刺激大脑,使大脑不易进入抑制状态。

    而饮服过多流汁会导致小便次数增加,不利于再次入睡。众所周知,睡前刷牙,洗脸是必要的。但还要养成用温水洗脚的习惯,这能促进下肢血液循环,有利于很快 入眠。有条件时,可以用温水擦身或热水洗浴。睡前要脱去外衣,内衣要适时换洗,有条件的话,可以穿用宽松的外衣,被褥要保持干净,要经常晾晒,以保持干燥 和杀灭细菌。

    男子睡前“三宜三忌”一个男人的一生中,有三分之一多的时间是在睡眠中度过的。正常良好的睡眠,可调节生理机能,维持神经系统的平衡,是生命中重要的一 环。睡眠不良、不足,翌日会使男人头昏脑胀、全身无力。由此可见,睡眠与健康、工作和学习的关系甚为密切。要想晚间获得良好的睡眠,注意睡前三宜三忌非常 重要。

    三宜是:一、睡前散步。《紫岩隐书·养生》有论:“入睡时行,绕室千步,始就枕。……盖则神劳,劳则思息,动极而求静。”二、睡前足浴,“睡前烫脚,胜服 安眠药”。睡前用温水洗脚15-20分钟,使脚部血管扩张,促进血液循环,使人易入睡乡。三、睡前刷牙。《金丹全书》云:“凡一日饮食之毒,积于齿漱,此 善于养齿者。”

    “三忌”是:一忌饱食,晚餐七八成饱即可。睡前不要吃东西,以免加重胃肠负担。二忌娱乐过度。睡前不宜看场面激烈的影视剧和球赛,勿谈怀旧伤感或令人恐惧 的事情。三忌饮浓茶与咖啡。以免因尿频与精神兴奋影响睡眠。此外,要注意夜间环境舒适,卧室整洁,空气流通,以有益于健康。

工作流系统之三十五自由流的实现

工作流系统在给业务流程建模的时候,按照流程引擎的设计,将业务流程定义出来。这个业务流程的每个流程实例,就按照流程建模时定义好的线路流转。

 

自由流是指流程实例在运行时,不按照预先定义好的线路流转,而是自由的跳转,由流程实例的操作人员来选择下一个到达的节点。通常这种都是不正常的流转,和回退流一样,破坏了流程的正常定义。但是自由流又很有“特色”,符合一定的业务需求。例如,当一份申请单提交审核后,需要部门经理,总经理,都审核过,才能流转到业务部门来处理,但总经理出差在外,申请单又急需处理,部门经理在线下已经征得总经理的同意后,就可以选择跳过总经理的审核,直接送到业务部门。

 

通常自由流是指向前的跳转,回退流是回退到曾经运行过的轨迹。向前跳转会略过一些节点,不运行,直接到达新的节点。回退流是回到原来的轨迹,再重新执行,对应重做(撤回)的功能。自由流对应忽略某些步骤,直接达到后面的步骤。因此在实现上,自由流和回退流的实现是有区别的。

 

顺序流的自由流的实现


 

当运行到填写步骤时,由于某种原因,直接略过审核步骤,跳转到查看步骤。或者填写人想作废掉这次的填写,直接就跳到结束步骤,结束本流程(当然需要填写人有自由跳转的权限)。

实现过程:关闭当前步骤(当前任务)--》转入历史步骤(历史任务)--》指定跳转到的步骤为当前步骤--》生成新步骤的任务

条件路由
实现过程:和顺序流一样,当自由跳转时,关闭当前步骤任务,生成跳转到的节点的步骤和任务。

循环路由:和顺序流处理过程一样。

 

 

分支路由:
分支路由在eworkflow中分为静态分支和动态分支,但是发生自由跳转时,静态分支和动态分支的处理过程是一样的。分支路由的自由跳转,就比顺序流要复杂很多。

 

单层的分支:

 

 

主干---分支
当由主干节点跳转到分支节点上时,这种跳转是没有意义的。因为分支节点产生并行的分支,几个分支后的线路是同时并行的。当自由跳转到一个分支的节点上后,另外的分支不能产生,流程会变的没有意义。
因此当发生 主干 跳转 到分支的情况时候,eworkflow是直接关闭当前节点,生成分支上的节点。但是这样流程可能会变得没有意义,主要看流程建模时候的模型。

 

主干---主干
当由主干节点跳转到主干节点,这种是正常的自由流,实现过程;关闭当前主干步骤(任务)--》转入历史步骤(历史任务)--》跳转到指定的主干步骤--》生成新的主干步骤任务。

 

 

多层的分支:
由于分支节点和聚合节点可以嵌套,因此就有多层的分支节点,分支主干,分支的分支 之间的跳转问题。总的原则是,分支主干跳转到分支主干,其它的分支不受影响。在实现的时候,需要递归的查找出各个分支的所有下级分支。

 

 

主干--主干
最外层的主干节点上的跳转,这种是正常的自由流,实现过程:关闭当前主干步骤(任务)--》转入历史步骤(任务)--》生成最外层的主干步骤--》生成新的主干步骤任务。

分支主干--分支主干
分支主干跳转到本分支的主干,是正常的自由流,关闭本分支主干,生成本分支主干的新节点,其它分支均不受影响。
实现过程:关闭本分支主干步骤(任务)--》转入历史步骤(任务)--》生成本分支跳转到的节点的步骤(任务) 其它分支均不受影响。

 

分支主干--分支的分支
分支主干跳转到本分支的分支,这种是没有意义的,和主干跳入分支是一样的,不是正常的自由流。

 

分支主干--主干
分支主干跳入最外层的主干,是正常的自由流,实现过程:结束所有分支的步骤(任务)--》转入历史步骤(任务)--》生成最外层跳转到的节点的步骤(任务)

 

分支的分支--分支主干
分支的分支跳转到分支主干,这种是正常的自由流,结束本分支下的所有子分支(包含嵌套的多级分支)生成分支主干的步骤任务,其它分支主干不受影响。
实现过程:递归查找出所有分支主干的下级分支节点--》结束查找到的所有分支当前步骤(任务)--》生成新的分支主干步骤(任务) 其它分支主干的当前步骤任务均不变化。

分支的分支--主干
分支的分支跳转到最外层的主干,这种是正常的自由流,结束所有分支,包含嵌套的分支的分支等等。生成最外层的主干步骤。
实现过程:结束所有的当前步骤(任务)--》生成新的最外层的主干步骤(任务)

 

其它 还会有 分支1的分支--分支2的分支:这种的跳转显然是没有意义的。

 

 

<script type=”text/javascript”></script>

  • 大小: 17.7 KB
  • 大小: 17.2 KB
  • 大小: 40.3 KB

HashMap的JavaScript简洁实现

今天在工作中碰到一个问题,需要在JavaScript使用类似Java的HashMap的数据类型,可惜JavaScript自身不提供这种数据类型,于是想自己实现一个。

在Google上搜到一个老外论坛(http://www.hftonline.com/forum/showthread.php t=12882)上的实现方式,感觉非常简洁明了,于是按照他的思路,扩充了一下,加了两个自己想要的方法,用着蛮爽。

var hashMap = {
    Set : function(key,value){this[key] = value},
    Get : function(key){return this[key]},
    Contains : function(key){return this.Get(key) == null false:true},
    Remove : function(key){delete this[key]}
}

使用方法示例:

hashMap.Set("name","John Smith");
hashMap.Set("age",24);
hashMap.Get("name");//John Smith
hashMap.Contains("title");//false
hashMap.Contains("name");//true
hashMap.Remove("age");

够简洁吧。而且比用数组方式实现更好的地方在于,不会出现数组越界错误。

JS常用代码片段截取(四)

13.点击的class != “dropdown” 时,隐藏id=“selectBoxOptions_”的组件
$(document).click(function(event){
if( $(event.target).attr(“class”) != “dropdown” ){
$(“#selectBoxOptions_”).hide();
}
});

14.使用过的插件
JQuery
jCarousel —— 内容滚动插件
validate
raphael
scrollabel

15.ID冲突
项目比较大,每个人都有各个模块的工作,在界面上难免会有ID冲突的事情发生。
在使用JQuery的时候有ID冲突就出现JQUERY “(elem.value || “”).replace is not a function”
但是直接用document.getElementById(XX)默认为全文扫描中第一个扫描到的。

16.Date Format
Date.prototype.format = function(format){
var o = {
“M+” : this.getMonth()+1,
“d+” : this.getDate(),
“h+” : this.getHours(),
“m+” : this.getMinutes(),
“s+” : this.getSeconds(),
“q+” : Math.floor((this.getMonth()+3)/3),
“S” : this.getMilliseconds()
}
if(/(y+)/.test(format)){
format = format.replace(RegExp.$1, (this.getFullYear()+””).substr(4 – RegExp.$1.length));
}
for(var k in o){
if(new RegExp(“(” + k + “)”).test(format)){
format = format.replace(RegExp.$1, RegExp.$1.length == 1   o[k] : (“00” + o[k]).substr((“” + o[k]).length));
}
}
return format;
}

var date = new Date();
var result = ‘date.format(“yyyy-MM-dd hh:mm:ss S”): ‘ + date.format(“yyyy-MM-dd hh:mm:ss S”);
result += ‘\ndate.format(“yy MM dd”): ‘ + date.format(“yy MM dd”);
result += ‘\ndate.format(“hh:mm”): ‘ + date.format(“hh:mm”);
alert(result);

ArcGISAPIforSilverlight开发入门(4):用户与地理信息之间的桥梁–GraphicsLayer

我们与地图交互的过程时刻在进行着:一个拉框放大操作,或者对地图内容的查询等。这些交互过程中的输入输出,通常都是反映在独立于地图数据一个“层”上。比如拉框放大,我们能看见鼠标所画的一个矩形;又比如对兴趣点的查询,结果通常是将符合条件的兴趣点的形状高亮显示在那个独立的“层”中,通过它既可以反映用户的输入,又可以展现地图的输出。这个“层”就是GraphicsLayer。

        其实ADF开发中也有GraphicsLayer的概念,同样在其他两个客户端API(JavaScript/Flex)中也能找到GraphicsLayer的身影,它们都是一样一样的。

        本节我们主要看如何在GraphicsLayer中展现内容。当然第一个工作就是添加ESRI.ArcGIS.dll的引用,引入esri的xml命名空间;接下来在Map中添加一个GraphicsLayer图层:

<esri:Map x:Name="Map1">
<esri:Map.Layers>
<!-- 其他图层 -->
<esri:GraphicsLayer ID="GLayer" />
</esri:Map.Layers>
</esri:Map>

要使GraphicsLayer中的内容处于最顶端(不被其他图层内容覆盖),就要将它放在Map标签里的最下头,像上面那样。从命名我们不难看出,GraphicLayer里面放的就是Graphic的集合了。Graphic(ESRI.ArcGIS.Graphic)是GraphicsLayer中的基本元素,它包括了Geometry(在ESRI.ArcGIS.Geometry命名空间中),Symbol(在ESRI.ArcGIS.Symbol命名空间中),Attributes等属性。所有显示在地图中的矢量元素都有一个Geometry,里面包含了若干地理坐标,用于显示地图上地物的形状,它是Point,Polyline,Polygon等的总称,在这里代表了Graphic的形状。Symbol代表了Graphic的外观,它是一系列符号的总称,我们通常跟SimpleMarkerSymbol,SimpleLineSymbol和SimpleFillSymbol等打交道,它们分别对应了上面3种不同的Geometry(Point,Polyline,Polygon)。

        要让一个Graphic显示出来,总共分3步:

1、定义Graphic:

在xaml中

<esri:Graphic>
</esri:Graphic>

复制代码

在code-behind中

Graphic g= new Graphic()

2、设置Graphic的Geometry和Symbol属性:

在xaml中

<esri:Graphic>
<esri:Graphic.Symbol>
<esriSymbols:SimpleMarkerSymbol Color="Blue" Size="12" Style="Square" />
</esri:Graphic.Symbol>
<esriGeometry:MapPoint X="108" Y="30" />
</esri:Graphic>

复制代码

在code-behind中

Graphic g = new Graphic()
{
Geometry = new MapPoint(108, 30),
Symbol = new SimpleMarkerSymbol()
{
Color = new SolidColorBrush(Colors.Blue),
Size = 12,
Style = SimpleMarkerSymbol.SimpleMarkerStyle.Square
}
};

3、把定义好的Graphic添加到GraphicsLayer里:

在xaml中

<esri:GraphicsLayer ID="GLayer">
<esri:GraphicsLayer.Graphics>
<esri:Graphic>
<esri:Graphic.Symbol>
<esriSymbols:SimpleMarkerSymbol Color="Blue" Size="12" Style="Square" />
</esri:Graphic.Symbol>
<esriGeometry:MapPoint X="108" Y="30" />
</esri:Graphic>
</esri:GraphicsLayer.Graphics>
</esri:GraphicsLayer>

复制代码

在code-behind中

Graphic g = new Graphic()
{
Geometry = new MapPoint(108, 30),
Symbol = new SimpleMarkerSymbol()
{
Color = new SolidColorBrush(Colors.Blue),
Size = 12,
Style = SimpleMarkerSymbol.SimpleMarkerStyle.Square
}
};
GraphicsLayer glayer = Map1.Layers["GLayer"] as GraphicsLayer;
glayer.Graphics.Add(g);

复制代码

看一下效果:

        图中还有其他的图形,无非是改变了Graphic的Geometry和Symbol属性。图上的那只灰熊是一段动画文件,利用Silverlight的特性,能够定义出表现力丰富的各种符号。

        尽管能够完全在xaml中来完成工作,但还是建议将可视化元素的定义放在xaml中,将实现的逻辑部分放在code-behind中。看一下添加图中那些Graphic的代码:

<Grid.Resources>
<esriSymbols:SimpleMarkerSymbol x:Name="RedMarkerSymbol" Color="Red" Size="12" Style="Circle" />
<!-- 可惜目前Silverlight只支持Jpeg和PNG格式的图像,所以PictureMarkerSymbol无法显示GIF格式的图像,否则会报ImagingError的错误 -->
<esriSymbolsictureMarkerSymbol x:Name="PinPictureMarkerSymbol" Source="imgs/pin.png" OffsetX="10" OffsetY="10" />
<esriSymbols:SimpleLineSymbol x:Name="RedLineSymbol" Color="Red" Width="4" Style="Solid" />
<esriSymbols:CartographicLineSymbol x:Name="CartoLineSymbol" Color="Red" Width="10" DashCap="Triangle" LineJoin="Round" DashArray="6,2" />
<esriSymbols:SimpleFillSymbol x:Name="RedFillSymbol" Fill="#66FF0000" BorderBrush="Red" BorderThickness="2" />
</Grid.Resources>

<MediaElement x:Name="BearVideo" />

复制代码

private void AddGraphics()
{
GraphicsLayer glayer = Map1.Layers["GLayer"] as GraphicsLayer;
Graphic[] graphics = new Graphic[8];
graphics[0] = new Graphic()
{
Geometry = new MapPoint(108, 34),
Symbol = RedMarkerSymbol
};

graphics[1] = new Graphic()
{
Geometry = new MapPoint(108, 30),
Symbol = new SimpleMarkerSymbol()
{
Color = new SolidColorBrush(Colors.Blue),
Size = 12,
Style = SimpleMarkerSymbol.SimpleMarkerStyle.Square
}
};

graphics[2] = new Graphic()
{
Geometry = new MapPoint(108, 25),
Symbol = PinPictureMarkerSymbol
};

graphics[3] = new Graphic()
{
Geometry = new MapPoint(108, 20),
Symbol = new TextSymbol()
{
FontFamily = new FontFamily("微软雅黑, 宋体"),
FontSize = 14,
Foreground = new SolidColorBrush(Colors.Black),
Text = "这是text symbol"
}
};

graphics[4] = new Graphic();
graphics[4].Symbol = RedLineSymbol;
ESRI.ArcGIS.Geometry.PointCollection pc = new ESRI.ArcGIS.Geometry.PointCollection()
{
new MapPoint(95,10),
new MapPoint(110,-15),
new MapPoint(130,10)
};
ESRI.ArcGIS.Geometry.Polyline pl = new ESRI.ArcGIS.Geometry.Polyline();
pl.Paths.Add(pc);
graphics[4].Geometry = pl;

graphics[5] = new Graphic();
graphics[5].Symbol = CartoLineSymbol;
ESRI.ArcGIS.Geometry.PointCollection pc1 = new ESRI.ArcGIS.Geometry.PointCollection()
{
new MapPoint(95,0),
new MapPoint(110,-25),
new MapPoint(130,0)
};
ESRI.ArcGIS.Geometry.Polyline pl1 = new ESRI.ArcGIS.Geometry.Polyline();
pl1.Paths.Add(pc1);
graphics[5].Geometry = pl1;

graphics[6] = new Graphic()
{
Symbol = RedFillSymbol
};
ESRI.ArcGIS.Geometry.PointCollection pc2 = new ESRI.ArcGIS.Geometry.PointCollection()
{
new MapPoint(110,-30),
new MapPoint(130,-30),
new MapPoint(130,-45),
new MapPoint(120,-55),
new MapPoint(110,-45),
new MapPoint(110,-30)
};
ESRI.ArcGIS.Geometry.Polygon pg = new ESRI.ArcGIS.Geometry.Polygon();
pg.Rings.Add(pc2);
graphics[6].Geometry=pg;

graphics[7] = new Graphic();
//MediaElement的Name属性只能在xaml中定义(见帮助),所以决定了MediaElement不能完全在cs代码中定义
BearVideo.Source = new Uri("http://serverapps.esri.com/media/bear.wmv", UriKind.RelativeOrAbsolute);
BearVideo.IsHitTestVisible=false;
BearVideo.IsMuted=true;
BearVideo.AutoPlay=true;
BearVideo.Opacity=0;
ESRI.ArcGIS.Geometry.Polygon pg2 = new ESRI.ArcGIS.Geometry.Polygon();
ESRI.ArcGIS.Geometry.PointCollection pc3 = new ESRI.ArcGIS.Geometry.PointCollection()
{
new MapPoint(10,-20),
new MapPoint(32,7),
new MapPoint(62,-35),
new MapPoint(11,-36),
new MapPoint(10,-20)
};
pg2.Rings.Add(pc3);
graphics[7].Geometry=pg2;
graphics[7].Symbol = new SimpleFillSymbol()
{
Fill = new VideoBrush()
{
SourceName = BearVideo.Name,
Opacity = 0.6,
Stretch = Stretch.UniformToFill
}
};


foreach (Graphic g in graphics)
{
glayer.Graphics.Add(g);
g.MouseLeftButtonDown+=new MouseButtonEventHandler(graphic_MouseLeftButtonDown);
}
}

private void graphic_MouseLeftButtonDown(object o,MouseButtonEventArgs e)
{
Graphic g=o as Graphic;
MessageBox.Show(string.Format("Geometry:{0}\nSymbol:{1}",g.Geometry.GetType().ToString(),g.Symbol.GetType().ToString()));
}

复制代码

可以看到,完全能够在一个Graphic上定义一些事件,来达到程序的目的。大家可以试着把上面的内容在xaml中改写一遍。看到这里肯定会产生一个疑问:难道每个Geometry的定义都这么困难吗?其实SilverlightAPI已经给我们提供了ESRI.ArcGIS.Draw(继承自xaml中的Canvas)类,它能非常方便的捕捉到用户的鼠标操作,从而获取各种Geometry来供程序使用。

        可以把Draw理解成一块画板,调用Draw的Active()方法,就可以开始在画板上面绘画,程序会自动记录鼠标画出的每个Geometry,调用DeActive()方法,停止绘画。Active()有一个DrawMode参数,它决定了我们即将在这个画板上画出的内容类型:Point,Polyline,Polygon等。在画的过程中我们可以看到地图上可以实时反映出我们绘画的内容,而这些则利用了Draw的预定义Symbol:DefaultMarkerSymbol,DefaultLineSymbol,DefaultPolygonSymbol等。对应关系如下:

        每当完成一个图形的绘制,就会触发Draw.OnDrawComplete事件,利用事件参数就可以获得Geometry,之后可以创建一个Graphic,设置一个Symbol(一般使用Draw的预定义Symbol),把画好的这个Graphic添加到一个GraphicsLayer中。

        点击这里,查看一个比较完整的Graphics的例子。

最后来看一下这个例子的部分代码:

<Grid.Resources>
<esriSymbols:SimpleMarkerSymbol x:Name="DefaultMarkerSymbol" Color="Red" Size="12" Style="Circle" />
<esriSymbols:CartographicLineSymbol x:Name="DefaultLineSymbol" Color="Red" Width="4" />
<esriSymbols:SimpleFillSymbol x:Name="DefaultFillSymbol" Fill="#33FF0000" BorderBrush="Red" BorderThickness="2" />
<esriSymbols:SimpleFillSymbol x:Name="DefaultPolygonSymbol" Fill="#33FF0000" BorderBrush="Red" BorderThickness="2" />
</Grid.Resources>

<esriraw x:Name="Draw1"
DefaultRectangleSymbol="{StaticResource DefaultFillSymbol}"
DefaultMarkerSymbol="{StaticResource DefaultMarkerSymbol}"
DefaultLineSymbol="{StaticResource DefaultLineSymbol}"
DefaultPolygonSymbol="{StaticResource DefaultPolygonSymbol}"
Loaded="Draw1_Loaded"
OnDrawComplete="Draw1_OnDrawComplete" />

<Canvas VerticalAlignment="Top" HorizontalAlignment="Left" Margin="20,20,0,0" Width="430" Height="110">
<Rectangle RadiusX="10" RadiusY="10" Width="430" Height="110" Fill="#98000000" Stroke="#FF6495ED" />
<Rectangle Fill="#FFFFFFFF" Stroke="DarkGray" RadiusX="5" RadiusY="5" Canvas.Left="10" Canvas.Top="10" Width="410" Height="90" />

<StackPanel Orientation="Vertical" Canvas.Top="5" Canvas.Left="20">
<esriWidgets:Toolbar x:Name="ToolBar1" MaxItemHeight="80" MaxItemWidth="80" Width="380" Height="80"
ToolbarIndexChanged="ToolBar1_ToolbarIndexChanged"
ToolbarItemClicked="ToolBar1_ToolbarItemClicked">
<esriWidgets:Toolbar.Items>
<esriWidgets:ToolbarItemCollection>
<esriWidgets:ToolbarItem Text="添加点">
<esriWidgets:ToolbarItem.Content>
<Image Source="imgs/DrawPoint.png" Stretch="UniformToFill" Margin="5" />
</esriWidgets:ToolbarItem.Content>
</esriWidgets:ToolbarItem>
<esriWidgets:ToolbarItem Text="添加折线">
<esriWidgets:ToolbarItem.Content>
<Image Source="imgs/DrawPolyline.png" Stretch="UniformToFill" Margin="5" />
</esriWidgets:ToolbarItem.Content>
</esriWidgets:ToolbarItem>
<esriWidgets:ToolbarItem Text="添加多边形">
<esriWidgets:ToolbarItem.Content>
<Image Source="imgs/DrawPolygon.png" Stretch="UniformToFill" Margin="5" />
</esriWidgets:ToolbarItem.Content>
</esriWidgets:ToolbarItem>
<esriWidgets:ToolbarItem Text="添加矩形">
<esriWidgets:ToolbarItem.Content>
<Image Source="imgs/DrawRectangle.png" Stretch="UniformToFill" Margin="5" />
</esriWidgets:ToolbarItem.Content>
</esriWidgets:ToolbarItem>
<esriWidgets:ToolbarItem Text="添加曲线">
<esriWidgets:ToolbarItem.Content>
<Image Source="imgs/DrawFreehand.png" Stretch="UniformToFill" Margin="5" />
</esriWidgets:ToolbarItem.Content>
</esriWidgets:ToolbarItem>
<esriWidgets:ToolbarItem Text="停止添加动作">
<esriWidgets:ToolbarItem.Content>
<Image Source="imgs/StopDraw.png" Stretch="UniformToFill" Margin="5" />
</esriWidgets:ToolbarItem.Content>
</esriWidgets:ToolbarItem>
<esriWidgets:ToolbarItem Text="清空绘制的图形">
<esriWidgets:ToolbarItem.Content>
<Image Source="imgs/eraser.png" Stretch="UniformToFill" Margin="5" />
</esriWidgets:ToolbarItem.Content>
</esriWidgets:ToolbarItem>
</esriWidgets:ToolbarItemCollection>
</esriWidgets:Toolbar.Items>
</esriWidgets:Toolbar>
<TextBlock x:Name="StatusTextBlock" Text="" FontWeight="Bold" HorizontalAlignment="Center"/>
</StackPanel>
</Canvas>

复制代码

private void Draw1_Loaded(object sender, RoutedEventArgs e)
{
Draw1.Map = Map1;
}

private void Draw1_OnDrawComplete(object sender, ESRI.ArcGIS.DrawEventArgs args)
{
ESRI.ArcGIS.GraphicsLayer graphicsLayer = Map1.Layers["GLayer2"] as ESRI.ArcGIS.GraphicsLayer;
ESRI.ArcGIS.Graphic graphic = new ESRI.ArcGIS.Graphic()
{
Geometry = args.Geometry,
Symbol = _activeSymbol,
};
graphicsLayer.Graphics.Add(graphic);
}

private void ToolBar1_ToolbarIndexChanged(object sender, ESRI.ArcGIS.Widgets.SelectedToolbarItemArgs e)
{
StatusTextBlock.Text = e.Item.Text;
}

private void ToolBar1_ToolbarItemClicked(object sender, ESRI.ArcGIS.Widgets.SelectedToolbarItemArgs e)
{
Draw1.Deactivate();
switch (e.Index)
{
case 0: // Point
Draw1.Activate(ESRI.ArcGIS.DrawMode.Point);
_activeSymbol = strobeSymbol;
break;
case 1: // Polyline
Draw1.Activate(ESRI.ArcGIS.DrawMode.Polyline);
_activeSymbol = DefaultLineSymbol;
break;
case 2: // Polygon
Draw1.Activate(ESRI.ArcGIS.DrawMode.Polygon);
_activeSymbol = DefaultPolygonSymbol;
break;
case 3: // Rectangle
Draw1.Activate(ESRI.ArcGIS.DrawMode.Rectangle);
_activeSymbol = DefaultFillSymbol;
break;
case 4: // Freehand
Draw1.Activate(ESRI.ArcGIS.DrawMode.Freehand);
_activeSymbol = waveLineSymbol;
break;
case 5: // Stop Graphics
break;
case 6: // Clear Graphics
ESRI.ArcGIS.GraphicsLayer graphicsLayer = Map1.Layers["GLayer2"] as ESRI.ArcGIS.GraphicsLayer;
graphicsLayer.ClearGraphics();
break;

}
}

复制代码

大家可以注意一下例子中添加的点符号和曲线符号。只要有足够的想象力,完全可以利用Silverlight定制出非常炫的符号效果来。

        好了,下一节我们来了解如何使用这些画出的图形与地图数据交互。

javascript:浮动div,可拖拽div,遮罩层(div和iframe实现)

在网页中,经常需要标题里提到的几种效果,实现比较简单,这里总结一下(IE测试通过),以备日后再用。
预备知识:网页中的高和宽


//获取浏览器的宽和高(多种浏览器)
functiongetNavWidthandHeightInfo()
{
vars=“”;
s
+=网页可见区域宽:+document.body.clientWidth;
s
+=网页可见区域高:+document.body.clientHeight;
s
+=网页可见区域宽:+document.body.offsetWidth+(包括边线和滚动条的宽);
s
+=网页可见区域高:+document.body.offsetHeight+(包括边线的宽);
s
+=网页正文全文宽:+document.body.scrollWidth;
s
+=网页正文全文高:+document.body.scrollHeight;
s
+=网页被卷去的高(ff):+document.body.scrollTop;
s
+=网页被卷去的高(ie):+document.documentElement.scrollTop;
s
+=网页被卷去的左:+document.body.scrollLeft;
s
+=网页正文部分上:+window.screenTop;
s
+=网页正文部分左:+window.screenLeft;
s
+=屏幕分辨率的高:+window.screen.height;
s
+=屏幕分辨率的宽:+window.screen.width;
s
+=屏幕可用工作区高度:+window.screen.availHeight;
s
+=屏幕可用工作区宽度:+window.screen.availWidth;
s
+=你的屏幕设置是:+window.screen.colorDepth+位彩色;
s
+=你的屏幕设置:+window.screen.deviceXDPI+像素/英寸;
s += “当前窗口的内部宽度:”+ window.innerWidth;
s += “当前窗口的内部高度:”+ window.innerHeight;
//alert(s);
}
getNavWidthandHeightInfo();

另外,网页中的元素常见定位需要用到的概念一并总结一下:


HTML中的元素定位:

scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离
scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离

scrollWidth:获取对象的滚动宽度
scrollHeight:获取对象的滚动高度

offsetLeft:获取对象相对于版面或由offsetParent属性指定的父坐标的计算左侧位置
offsetTop:获取对象相对于版面或由offsetParent属性指定的父坐标的计算顶端位置
offsetHeight:获取对象相对于版面或由父坐标offsetParent属性指定的父坐标的高度

event.clientX相对文档的水平座标
event.clientY相对文档的垂直座标

event.offsetX相对容器的水平坐标
event.offsetY相对容器的垂直坐标

document.documentElement.scrollTop垂直方向滚动的值

event.clientX+document.documentElement.scrollTop相对文档的水平座标+垂直方向滚动的量

(注意:CSS中的margin属性,与clientWidth、offsetWidth、clientHeight、offsetHeight均无关)

来看一下笔者写的关于定位和关于宽和高的js函数:


/*关于位置(前面两种常用)*/

//1.取鼠标的位置(Coordinate坐标x和y)兼容IE,FF和其他主流浏览器(onmouseover=”getMouseCoordinate(event)”)
functiongetMouseCoordinate(ev){
vare=ev ev:(window.event window.event:null);
if(e.pageX||e.pageY){
alert(
x:+e.pageX+–y:+e.pageY);
}
else{
alert(
x:+event.x+–y:+event.y);
}
}

//2.通过控件获取控件在页面的位置(oControl是控件)
functiongetControlCoordinateByControl(oControl){
varleftPos=oControl.offsetLeft;
vartopPos=oControl.offsetTop;
varheight=oControl.offsetHeight;
while(oControl=oControl.offsetParent){
leftPos
+=oControl.offsetLeft;
topPos
+=oControl.offsetTop;
}
alert(
x:+leftPos+–y:+topPos);
}

//3.通过控件自身取得控件的宽和高,返回width和height
functiongetControlWidthAndHeightByControl(oControl){
//varwidth=oControl.style.width;
//varheight=oControl.style.height;
varwidth=oControl.offsetWidth;
varheight=oControl.offsetHeight;
alert(
width:+width+–height:+height);
}

PS:关于dom的一些高和宽,下面这张图有助于我们理解的更清楚:

好了,您猜我一定又会说,“Code is cheap.”,没错,看代码先:全文链接:

javascript:浮动div,可拖拽div,遮罩层(div和iframe实现)