|
<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>
|
|