二次封装arcgis的timeslider
arcgis的timeslider是对dojo slider二次封装,
项目需要,所有Map用统一样式的slider,所以写了一个common的dojo class,统一调用生成slider,作为对timeslider再次封装,感觉挺好用。
这个slider不一定要在Map里使用,还可以在其他地方调用。只是要包含arcgis的js包,
先上JavaScript class的code:
- /**
- * yilei create for IES timeslider
- *
- */
- //dojo.provide("mapSlider.MyTimeslider");
- dojo.declare("mapSlider.MyTimeSlider",null,{
- map: null,
- startDate:null,
- endDate:null,
- divId:"myTimeSlider",
- timeUnit:"esriTimeUnitsHours",
- labelImg:"",
- // Can set the Array of custom Label, if not set will display the labels
- labels:[],
- labelFooterDateFormat: "dd MMM yyyy HH:mm",
- labelTopDateFormat: "dd MMM yyyy HH:mm",
- timeExtent:null,
- //width:500,
- timeSliderCssClass: "timeSlider",
- topLabelCssClass:"sliderTopLabel",
- // -1, Unlimited, otherwise specific values
- noOfLabels: 3,
- timesliderType:"temp",
- sliderId:"tempId",
- showTopLabel: true,
- showPlayPauseBtn:true,
- showPreviousNextBtn:true,
- timeSlider:null,
- onsliderChange:function(timeExtentObj){},
- defaultIndex:0,
- _self:null,
- _unitTimeArray:{
- "esriTimeUnitsYears":0,
- "esriTimeUnitsMonths":0,
- "esriTimeUnitsWeeks":0,
- "esriTimeUnitsDays":1000 * 3600 * 24,
- "esriTimeUnitsHours":1000 * 3600,
- "esriTimeUnitsMinutes":1000 * 60,
- "esriTimeUnitsSeconds":1000,
- "esriTimeUnitsMilliseconds":0
- },
- /**********constructor function for init*************/
- constructor:function(params){
- dojo.mixin(this, params);
- _self=this;
- this.timeExtent=new esri.TimeExtent();
- //_self._startDate=params.startDate;
- //_self._endDate=params.endDate;
- //_self._divName=params.divName;
- //_self._timeUnit=params.timeUnit;
- this.sliderId=getUniqueId(this.timesliderType);
- //params.timeUnit?_self._timeUnit=params.timeUnit:"";
- //params.width?_self._width=params.width:"";
- },
- createSlider:function(){
- try
- {
- // Destroy the div and then create
- //dojo.query("[id^="+this.timesliderType+"]")[0].destroy();
- // Create new Div and add to divSlidersContainer
- var tsDiv = dojo.create("div", null, dojo.byId(this.divId));
- //alert(this._width);
- this.timeSlider = new esri.dijit.TimeSlider({
- //style: "width: "+this.width+"px;",
- class:this.timeSliderCssClass,
- id: this.sliderId,
- options: {
- excludeDataAtLeadingThumb: true
- }
- },tsDiv);
- this.timeExtent.startTime = this.startDate;
- this.timeExtent.endTime = this.endDate;
- if (this.labels.length == 0) {
- this.labels.push(this.startDate.Format(this.labelFooterDateFormat));
- var balLabels = this.noOfLabels-1;
- var diff = this.endDate.getTime() - this.startDate.getTime();
- var increment = diff/balLabels;
- var firstTime = this.startDate.getTime();
- for (var i=1; i<this.noOfLabels-1; i++) {
- firstTime = firstTime + increment;
- this.labels.push((new Date(firstTime)).Format(this.labelFooterDateFormat));
- }
- this.labels.push(this.endDate.Format(this.labelFooterDateFormat));
- }
- this.timeSlider.setLabels(this.labels);
- this.timeSlider.setThumbCount(1);
- this.timeSlider.setThumbIndexes([this.defaultIndex]);
- this.timeSlider.setLoop(false);
- this.timeSlider.singleThumbAsTimeInstant(true);
- this.timeSlider.createTimeStopsByTimeInterval(this.timeExtent,1,this.timeUnit);
- if(!this.showPlayPauseBtn)this.timeSlider.playPauseBtn.destroy();
- if(!this.showPreviousNextBtn){this.timeSlider.previousBtn.destroy();this.timeSlider.nextBtn.destroy();}
- this.timeSlider.startup();
- //alert(this.endDate.Format(this.labelFooterDateFormat));
- var defaultBegainTime=this.timeSlider.getCurrentTimeExtent().startTime.Format(this.labelTopDateFormat);
- if (this.showTopLabel == true) {
- dojo.create("span", {id: this.sliderId+"_sp_topLabel",class:this.topLabelCssClass, innerHTML: defaultBegainTime}, dojo.query(".dijitSliderMoveable")[0]);
- }
- dojo.connect(this.timeSlider, "onTimeExtentChange",function(evt){
- //console.dir(evt);
- if (_self.showTopLabel == true) {
- var topLabelDisplay= evt.startTime.Format(_self.labelTopDateFormat);
- //alert(topLabelDisplay);
- dojo.byId(_self.sliderId+"_sp_topLabel").innerHTML = topLabelDisplay;
- }
- _self.onsliderChange(evt);
- });
- return this.timeSlider;
- }
- catch(e){console.dir(e);return null;}
- },
- _testsub:function(){
- console.dir(_self);
- alert(this.topLabelCssClass);
- }
- });
把上面的code存到一个文件名为MyTimeslider.js的文件中
使用slider只需要调用这个class
- <script src="MyTimeslider.js"></script>
divId是网页中要展示slider的位置上的<div> 的ID.
下面给出做test的HTML。
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
- <title>Hurricane Explorer</title>
- <link rel="stylesheet" href="http://js.arcgis.com/3.13/dijit/themes/claro/claro.css">
- <link rel="stylesheet" href="http://js.arcgis.com/3.13/esri/css/esri.css">
- <style>
- html, body { height: 100%; width: 100%; margin: 0; padding: 0; }
- body {
- background-color:#EFEFDE;
- overflow:hidden;
- font-family: "Trebuchet MS";
- }
- .pane {
- border: solid 1px #9CAA9C;
- margin: 5px;
- padding: 5px;
- }
- #header {
- background-color:#EFEFDE;
- color:#9CAA9C;
- font-size:16pt;
- text-align:left;
- font-weight:bold;
- padding-top:10px; padding-bottom:10px; padding-left:10px; padding-right: 10px;
- margin-top:0px; margin-bottom:0px;
- }
- #banner {
- height:40px; width:100%;
- }
- .dijitRuleMark {
- height: 0px;
- }
- .dijitRuleLabelH {
- background: url('./dropDownArrow_grey.png') 50% 0% no-repeat;
- height: 50px;
- padding-top: 15px;
- white-space: nowrap;
- }
- .sliderTopLabel2 {
- position: absolute;
- top: -22px;
- color: red;
- font: 11px Arial bold;
- white-space: nowrap;
- }
- .timeSlider
- {
- width:1000px;
- padding-top:30px;
- }
- </style>
- <script>var dojoConfig = { parseOnLoad: true };</script>
- <script src="http://js.arcgis.com/3.13/"></script>
- <script src="dateTimeFormat.js"></script>
- <script>
- dojo.require("esri.dijit.TimeSlider");
- </script>
- <script src="MyTimeslider.js"></script>
- <script>
- function getUniqueId (prefix) {
- var uniqueId = (new Date()).getTime();
- return (prefix || 'id') + (uniqueId++);
- }
- function init() {
- var t=new mapSlider.MyTimeSlider({
- startDate:new Date(2013, 0, 1 ,00,00,00),
- endDate:new Date(2013, 0, 4,00,00,00),
- divId:"timeSliderDiv",
- timeUnit:"esriTimeUnitsHours",
- topLabelCssClass:"sliderTopLabel2",
- timeSliderCssClass:"timeSlider",
- //width:1000,
- noOfLabels:4,
- timesliderType:"yileitest_",
- onsliderChange:function(obj){console.dir(obj);},
- showPlayPauseBtn:true,
- showPreviousNextBtn:true,
- labelTopDateFormat:"HH:mm",
- defaultIndex:48,
- showTopLabel:true
- });
- t.createSlider();
- }
- dojo.ready(init);
- </script>
- <body class="claro">
- <div id="timeSliderDiv"></div>
- </body>
- </html>
css中的一个图片文件dropDownArrow_grey.png是slider中向下箭头的图片,可以换成你喜欢的图片。
- 其中还有用到一个名为dateTimeFormat.js的文件,该文件是extend一个option给JavaScript的date object,增加了一个Format的option,
有了它,我们的slider的date format就简单很多了,
下面给出dateTimeFormat.js的code::
- /****************date format******************/
- Date.prototype.Format = function(mask) {
- var d = this;
- var zeroize = function (value, length) {
- if (!length) length = 2;
- value = String(value);
- for (var i = 0, zeros = ''; i < (length - value.length); i++) {
- zeros += '0';
- }
- return zeros + value;
- };
- return mask.replace(/"[^"]*"|'[^']*'|\b(?:d{1,4}|M{1,4}|yy(?:yy)?|([hHmstT])\1?|[lLZ])\b/g, function($0) {
- switch($0) {
- case 'd': return d.getDate();
- case 'dd': return zeroize(d.getDate());
- case 'ddd': return ['Sun','Mon','Tue','Wed','Thr','Fri','Sat'][d.getDay()];
- case 'dddd': return ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'][d.getDay()];
- case 'M': return d.getMonth() + 1;
- case 'MM': return zeroize(d.getMonth() + 1);
- case 'MMM': return ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'][d.getMonth()];
- case 'MMMM': return ['January','February','March','April','May','June','July','August','September','October','November','December'][d.getMonth()];
- case 'yy': return String(d.getFullYear()).substr(2);
- case 'yyyy': return d.getFullYear();
- case 'h': return d.getHours() % 12 || 12;
- case 'hh': return zeroize(d.getHours() % 12 || 12);
- case 'H': return d.getHours();
- case 'HH': return zeroize(d.getHours());
- case 'm': return d.getMinutes();
- case 'mm': return zeroize(d.getMinutes());
- case 's': return d.getSeconds();
- case 'ss': return zeroize(d.getSeconds());
- case 'l': return zeroize(d.getMilliseconds(), 3);
- case 'L': var m = d.getMilliseconds();
- if (m > 99) m = Math.round(m / 10);
- return zeroize(m);
- case 'tt': return d.getHours() < 12 ? 'am' : 'pm';
- case 'TT': return d.getHours() < 12 ? 'AM' : 'PM';
- case 'Z': return d.toUTCString().match(/[A-Z]+$/);
- // Return quoted strings with the surrounding quotes removed
- default: return $0.substr(1, $0.length - 2);
- }
- });
- };
把四个文件准备好,就可以进行测试了

二次封装arcgis的timeslider的更多相关文章
- 二次封装dojo slider
上次的二次封装timeslider,挺有意思,又来封装一个dojo的,样式还是用arcgis的.实现更多功能,包括HorizontalSlider和VerticalSlider, 刻度的显示隐藏,标签 ...
- 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...
- iOS项目相关@AFN&SDWeb的二次封装
一,AFNetworking跟SDWebImge是功能强大且常用的第三方,然而在实际应用中需要封装用来复用今天就跟大家分享一下AFN&SDWeb的二次封装 1. HttpClient.h及.m ...
- Quick Cocos (2.2.5plus)CoinFlip解析(MenuScene display AdBar二次封装)
转载自:http://cn.cocos2d-x.org/tutorial/show?id=1621 从Samples中找到CoinFlip文件夹,复制其中的 res 和 script 文件夹覆盖新建工 ...
- 对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache
虽然jquery的较新的api已经很好用了, 但是在实际工作还是有做二次封装的必要,好处有:1,二次封装后的API更加简洁,更符合个人的使用习惯:2,可以对ajax操作做一些统一处理,比如追加随机数或 ...
- Android 应用程序集成Google 登录及二次封装
谷歌登录API: https://developers.google.com/identity/sign-in/android/ 1.注册并且登录google网站 https://accounts. ...
- Android 应用程序集成FaceBook 登录及二次封装
1.首先在Facebook 开发者平台注册一个账号 https://developers.facebook.com/ 开发者后台 https://developers.facebook.com/ap ...
- 对jquery的ajax进行二次封装
第一种方法: $(function(){ /** * ajax封装 * url 发送请求的地址 * data 发送到服务器的数据,数组存储,如:{"username": " ...
- AFNetworking二次封装的那些事
AFNetworking可是iOS网络开发的神器,大大简便了操作.不过网络可是重中之重,不能只会用AFNetworking.我觉得网络开发首先要懂基本的理论,例如tcp/ip,http协议,之后要了解 ...
随机推荐
- LeetCode 144. Binary Tree Preorder Traversal 动态演示
先序遍历的非递归办法,还是要用到一个stack class Solution { public: vector<int> preorderTraversal(TreeNode* root) ...
- Vue CLI UI:Vue开发者必不可少的工具
突然发现一个Vue cli 比较好用的工具,一个可视化图形界面方便你去创建.更新和管理Vue项目.这里分享2个作者写得比较好的文章 https://codeseeding.com/portal.php ...
- git不能先commit后再pull
本文首发hilsion的博客 今天遇到一个在使用git上的一个误区.具体的问题现象是: 我commit后再pull而不能在本地合并的情况,结果导致我的commit直接把同事的修改覆盖了.因为相对于我此 ...
- 复制书稿 (dp+贪心)
[题目描述] 现在要把m本有顺序的书分给k个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一.第三和第四本书给同一个人抄写 ...
- hdu1394 Minimum Inversion Number (线段树求逆序数&&思维)
题目传送门 Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- spring(四):spring中给bean的属性赋值
spring中给bean的属性赋值 xml文件properties标签设置 <bean id="student" class="com.enjoy.study.ca ...
- 快速部署业务类为webapi服务
接着前一篇博文,将接口快速打包固定请求格式,不需要修改代码,可以自动完成接口调用,实际上就是生成了一个接口的代理类. 那么仅仅是接口请求代理,没有服务端怎么行?所以需要将实现接口的类部署为webapi ...
- easyui datagrid数据网格
EasyUI是一组基于jQuery的UI插件集合,它的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面.它的许多控件让我们不必写很复杂的javascript,从而极大地提高了开发效率. ...
- MySQL 授权用户 ; 存储过程的DEFINER; 命令分隔符DELIMITER
最近项目中遇到有人使用DEFINER这样的关键字,找了半天没有怎么理解这个意思.以为是限制谁使用这个存储过程,后来测试发现并不是这样. 搜索网上发现很多说法都不正确.看到一篇博客,做了如下介绍,才有所 ...
- Java代码乱象!
文章转载自公众号 阿里巴巴中间件 , 作者 陈昌毅 导读 查尔斯·狄更斯在<双城记>中写道:“这是一个最好的时代,也是一个最坏的时代.” 移动互联网的快速发展,出现了许多新机遇,很多创业 ...