Maps Javascript


Posted in Javascript onJanuary 22, 2007

<html>
  <head>
     <title>Ajaxian Maps</title>
  <style type="text/css">
     h1{
     font:20pt sans-serif;
  }
  #outerDiv{
     height:600px;
     width:800px;
     border:1px solid black;
     position:relative;
     overflow:hidden;
  }
  #innerDiv{
     position:relative;
     left:0px;
     top:0px;
  }
  #toggleZoomDiv{
     position:absolute;
     top:10px;
     left:10px;
     z-index:1
     width:72px;
     height:30px;
  }
  #togglePushPinDiv{
     position:absolute;
     top:10px;
     left:87px;
     z-index:1;
     width:72px;
     height:30px
  }
  </style>
  <script language="javascript" src="resource/js/browserdetect_lite.js" type="text/javascript"></script>
  <script language="javascript" src="resource/js/opacity.js" type="text/javascript"></script>
  <script type="text/javascript" language="javascript">
     //常数
  var viewportWidth=800;
  var viewportHeight=600;
  var tileSize=100;
  var zoom=0;
  var zoomSizes=[["2000px","1400px"],["1500px","1050px"]];
  //用来控制地图div的移动
  var dragging=false;
  var top;
  var left;
  var dragStartTop;
  var dragStartLeft;

     function init(){
     //让inner div足够大,以正确显示出地图
     setInnerDivSize(zoomSizes[zoom][0],zoomSizes[zoom][1]);
     //为拖曳操作绑定鼠标监听器
     var outerDiv=document.getElementById("outerDiv");
     outerDiv.onmousedown=startMove;
     outerDiv.onmousemove=processMove;
     outerDiv.onmouseup=stopMove;
     //在IE中支持拖曳所必须
     outerDiv.ondragstart=function()
     { return false;}
     //解决在IE中触发器div的透明度问题
     new OpacityObject('toggleZoomDiv','resource/images/zoom').setBackground();
     new OpacityObject('togglePushPinDiv','resource/images/pushpin').setBackground();
     checkTiles();
  }

  function startMove(event){
  //针对IE必需
     if(!event)event=window.event;
     dragStartLeft=event.clientX;
     dragStartTop=event.clientY;
     var innerDiv=document.getElementById("innerDiv");
     innerDiv.style.cursor="-moz-grab";

     top=stripPx(innerDiv.style.top);
     left=stripPx(innerDiv.style.left);

     dragging=true;
     return false;
  }

  function processMove(event){
     if(!event)event=window.event; //for IE
     var innerDiv=document.getElementById("innerDiv");
     if(dragging){
       innerDiv.style.top=parseFloat(top)+(event.clientY-dragStartTop);
    innerDiv.style.left=parseFloat(left)+(event.clientX-dragStartLeft);
     }
     checkTiles();
  }

  function checkTiles(){
     //检查在inner div中将显示哪个标题
     var visibleTiles=getVisibleTiles();
     //当把每个小地图快添加到inner div中时,要先检查其是否已经添加
     var innerDiv=document.getElementById("innerDiv");
     var visibleTilesMap={};
     for (i=0;i<visibleTiles.length ;i++)
     {
        var tileArray=visibleTiles[i];
     var tileName="x"+tileArray[0]+"y"+tileArray[1]+"z"+zoom;
     visibleTilesMap[tileName]=true;
     var img=document.getElementById(tileName);
     if(!img){
        img=document.createElement("img");
     img.src="resource/tiles/"+tileName+".jpg";
     img.style.position="absolute";
     img.style.left=(tileArray[0]*tileSize)+"px";
     img.style.top=(tileArray[1]*tileSize)+"px";
     img.style.zIndex=0;
     img.setAttribute("id",tileName);
     innerDiv.appendChild(img);
     }
     }
     var imgs=innerDiv.getElementByTagName("img");
     for(i=0;i<imgs.length;i++){
        var id=imgs[i].getAttribute("id");
     if(!visibleTilesMap[id]){
        innerDiv.removeChild(imgs[i]);
     i--;//compensate for live nodeslist
     }
     }
     }

  function getVisibleTiles(){
     var innerDiv=document.getElementById("innerDiv");
     var mapX=stripPx(innerDiv.style.left);
     var mapY=stripPx(innerDiv.style.top);
     var startX=Math.abs(Math.floor(mapX/tileSize))-1;
     var startY=Math.abs(Math.floor(mapY/tileSize))-1;
     var tilesX=Math.ceil(viewportWidth/tileSize)+1;
     var tilesY=Math.ceil(viewportHeight/tileSize)+1;
     var visibleTileArray=[];
     var counter=0;
     for(x=startX;x<(tilesX+startX);x++){
        for(y=startY;y<(tilesY+startY);y++){
        visibleTileArray[counter++]=[x,y];
     }
     }
           return visibleTileArray;
  }

  function stopMove(){
     var innerDiv=document.getElementById("innerDiv");
     innerDiv.style.cursor="";
     dragging=false;
  }

  function stripPx(value){
     if(value=="")return 0;
     return parseFloat(value.substring(0,value.length-2));
  }

  function setInnerDivSize(width,height){
     var innerDiv=document.getElementById("innerDiv");
     innerDiv.style.width=width;
     innerDiv.style.height=height;
  }

  function toggleZoom(){
     zoom=(zoom==0)?1:0;
     var innerDiv=document.getElementById("innerDiv");
     var imgs=innerDiv.getElementsByTagName("img");
     while(imgs.length>0)innerDiv.removeChild(imgs[0]);
     setInnerDivSize(zoomSizes[zoom][0],zoomSizes[zoom][1]);
     if(document.getElementById("pushPin"))togglePushPin();
     checkTiles();
  }

  function togglePushPin(){
     var pinImage=document.getElementById("pushPin");
     if(pinImage){
        pinImage.parentNode.removeChild(pinImage);
     var dialog=document.getElementById("pinDialog");
     dialog.parentNode.removeChild(dialog);
     return;
     }

     var innerDiv=document.getElementById("innerDiv");
     pinImage=document.createElement("div");
     pinImage.style.position="absolute";
     pinImage.style.left=(zoom==0)?"850px":"630px";
     pinImage.style.top=(zoom==0)?"570px":"420px";
     pinImage.style.width="37px";
     pinImage.style.height="34px";
     pinImage.zIndex=1;
     pinImage.setAttribute("id","pushPin");
     innerDiv.appendChild(pinImage);

     new OpacityObject("pubshPin","resource/images/pin").setBackground();
     var dialog=document.createElement("div");
     dialog.style.position="absolute";
     dialog.style.left=(stripPx(pinImage.style.left)-90)+"px";
     dialog.style.top=(stripPx(pinImage.style.top)-210)+"px";
     dialog.style.width="309px";
     dialog.style.height="229px";
     dialog.style.zIndex=2;
     dialog.setAttribute("id","pinDialog");
     dialog.innerHTML="<table height='80%' width='100%'>"+"<tr><td align='center'>The capital of Spain</td></tr></table>";
     innerDiv.appendChild(dialog);
     new OpacityObject('pinDialog','resource/images/dialog').setBackground();
       }  
  </script>
   </head>
   <body onload="init()">
       <p>
       <h1>Ajaxian Maps</h1>
    </p>
    <div id="outerDiv">
       <div id="toggleZoomDiv" onclick="toggleZoom()">
    </div>
    <div id="togglePushPinDiv" onclick="togglePushPin()">
    </div>
    <div id="innerDiv" style="z-index:0">
            The rain in Spain falls mainly in the plains.
    </div>
    </div>
   </body>
</html>

Javascript 相关文章推荐
javascript multibox 全选
Mar 22 Javascript
Ext 今日学习总结
Sep 19 Javascript
jquery清空textarea等输入框实现代码
Apr 22 Javascript
Bootstrap每天必学之前端开发框架
Nov 19 Javascript
基于bootstrap插件实现autocomplete自动完成表单
May 07 Javascript
巧用Javascript的逻辑运算符
Dec 02 Javascript
详解基于angular路由的requireJs按需加载js
Jan 20 Javascript
设置cookie指定时间失效(实例代码)
May 28 Javascript
vue2.0结合Element-ui实战案例
Mar 06 Javascript
JavaScript Math对象和调试程序的方法分析
May 13 Javascript
JS实现盒子拖拽效果
Feb 06 Javascript
WebPack工具运行原理及入门教程
Dec 02 Javascript
自适应高度框架 ----属个人收藏内容
Jan 22 #Javascript
Opacity.js
Jan 22 #Javascript
html读出文本文件内容
Jan 22 #Javascript
用ADODB.Stream转换
Jan 22 #Javascript
Web层改进II-用xmlhttp 无声息提交复杂表单
Jan 22 #Javascript
用正则xmlHttp实现的偷(转)
Jan 22 #Javascript
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
Jan 22 #Javascript
You might like
PHP.MVC的模板标签系统(三)
2006/09/05 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
iOS10推送通知开发教程
2016/09/19 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
淘宝搜索框效果实现分析
2011/03/05 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
canvas 弹幕效果(实例分享)
2017/01/11 Javascript
js实现旋转木马效果
2017/03/17 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
[02:33]DOTA2英雄基础教程 司夜刺客
2013/12/04 DOTA
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
JupyterNotebook 输出窗口的显示效果调整方法
2020/04/13 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
.img/.hdr格式转.nii格式的操作
2020/07/01 Python
用CSS3写的模仿iPhone中的返回按钮
2015/04/04 HTML / CSS
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
学校对教师的评语
2014/04/28 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书
教师正风肃纪心得体会
2016/01/15 职场文书
python基于tkinter制作下班倒计时工具
2021/04/28 Python
Win10系统下配置Java环境变量
2021/06/13 Java/Android
vue实现在data里引入相对路径
2022/06/05 Vue.js