对geobeansEvent事件回调函数的改进
生活随笔
收集整理的這篇文章主要介紹了
对geobeansEvent事件回调函数的改进
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
demo中提供的geobeansEvent事件回調函數如下:
?var?pMap?=?document.GeoBeansMap;
?switch(id){
?case?0:
??alert("coError:"+id+"\n"+"v1:"+v1+"\n"+"v2:"+v2+"\n"+"v3:"+v3+"\n"+"v4:"+v4+"\n"+"v5:"+v5);
??break;
?case?7:
??//alert("coViewMap:"+id+"\n"+"顯示比例:"+v1+"\n"+"XMIN:"+v2+"\n"+"YMIN:"+v3+"\n"+"XMAX:"+v4+"\n"+"YMAX:"+v5);
??break;
?case?17://完成地圖繪制
??//alert("coPainted:"+id+"\n"+"v1:"+v1+"\n"+"v2:"+v2+"\n"+"v3:"+v3+"\n"+"v4:"+v4+"\n"+"v5:"+v5);
??
??cc();
??break;
?case?18://自動停止閃爍
??//alert("coFlashed:"+id+"\n"+"v1:"+v1+"\n"+"v2:"+v2+"\n"+"v3:"+v3+"\n"+"v4:"+v4+"\n"+"v5:"+v5);
??break;
?case?8:?//鼠標移動時的圖形坐標
??//alert("coViewPosition:"+id+"\n"+"X:"+v1+"\n"+"Y:"+v2+"\n"+"v3:"+v3+"\n"+"v4:"+v4);
??parent.TOCFrame.setShapeXY(v1,v2);
??break;
?case?36://鼠標單擊事件
??//alert("coMouseClick:"+id+"\n"+"X:"+v1+"\n"+"Y:"+v2+"\n"+"v3(ClickCount,x,y):"+v3+"\n"+"v4:"+v4);
??parent.TOCFrame.setShapeXY(v1,v3);
??break;
?case?10://成功加載地圖工程
??var?pManager??=?pMap.getManager();
??var?pLayers?=?document.all("MapConfig");
??//動態創建圖層配置信息
??var?strBody="<table?width=100%?border=1?cellpadding=0?cellspacing=0>";
??strBody?+="<tr><td><font?face=黑體?size=2><strong>地圖配置</strong></font></td></tr>";
??var?nCount=1;
??var?pNode?=?pManager.getRootNode();
??while(pNode!=null){
???strBody?+="<tr><td>";
???strBody?+=?"<input?type=checkbox?name=C"+nCount+"?value=";
???strBody?+=?pNode.getName();
???strBody?+=?"?onClick=JavaScript:setLayerVisible(this)?";
???strBody?+=?(pNode.isVisible()==true)?"checked>":">";
???strBody?+=?"<font?size=1>";
???strBody?+=?pNode.getName();
???strBody?+=?"</font>";
???strBody?+=?"</td></tr>";
???pNode?=?pNode.getSibling();nCount++;
??}
??strBody?+=?"</table>";
??pLayers.innerHTML=?strBody;
??var?pOverview?=?document.VEE;
??pMap.setOverview(pOverview.getOverview());
??pMap.getOptions().setHighlightColorFromString("#0000FF");
??
??break;
?case?16://成功加載了MapExpress
??//ContextMenu();
??
??break;
?case?12://Loading?Layer
??//alert("開始裝載圖層:"+id+"\n"+"圖層名:"+v1);
??break;
?case?11:
??//alert("裝載圖層:"+id+"\n"+"圖層名:"+v1+"\n"+"v2:"+v2+"\n"+"v3:"+v3+"\n"+"v4:"+v4);
??//if(v1=="chinar"){
??//?pMap.setLayer("Tiper","CHINAR");
??//}
??//if(v1=="CHINAP")pMap.setLayer("Tiper","CHINAP");
??ok=1;parent.TOCFrame.ok=1;
??break;
?case?19:
??//alert("下載子圖:"+id+"\n子圖號="+v1);
??break;
?case?21://Overview
??alert("coOverview:"+id+"\nVisible="+v1);
??break;
?case?101:case?102:case?103:case?105:case?106:
??//alert("屬性查詢:"+id+"\n"+"圖層名:"+v1+"\n"+"圖元個數:"+v2+"\n"+"圖元編碼:"+v3+"\n"+"v4:"+v4);
??if(v2=="-1"){
???parent.AttrFrame.location=v3;
??}else{
???parent.TOCFrame.setSelectedItem(v1,v3,v4);
??}
??//獲得被選中的圖形
??//var?pSelector?=?pMap.getSelector();
??//if(pSelector!=null){alert(""+pSelector);
??//?var?pShapes?=?pSelector.getShapes();
??//?if(pShapes)alert(""+pShapes);
??//}
??break;
?case?101+50:
??//alert("屬性查詢:"+id+"\n"+"X坐標:"+v1+"\n"+"Y坐標:"+v2+"\n"+"v3:"+v3+"\n"+"v4=:"+v4);
??break;
?case?102+50:
??alert("屬性查詢:"+id+"\n"+"圓心坐標X:"+v1+"\n"+"圓心坐標Y:"+v2+"\n"+"半徑:"+v3+"\n"+"v4=:"+v4+"\n"+"v5=:"+v5);
??break;
?case?103+50:
??//alert("屬性查詢:"+id+"\n"+"X最小值:"+v1+"\n"+"Y最小值:"+v2+"\n"+"X最大值:"+v3+"\n"+"Y最大值:"+v4);
??break;
?case?105+50:
??var?pDrawer??=?pMap.getDrawer();
??var?pPoints??=?pDrawer.getWorldPoints();
??var?nCount=pPoints.size();
??var?strValue?=?""+nCount+"(";
??for(i=0;i<nCount;i++){
???var?pPoint=pPoints.dotAt(i);
???strValue?+=?pPoint.m_x?+?"?"?+?pPoint.m_y;
???if(i<nCount-1)
????strValue?+=?","
???
??}
??strValue?+=?")";
??alert("屬性查詢:"+id+"\nPoint="?+?strValue);
??break;
?case?301+50:
??alert("緩沖區查詢:"+id+"\n"+"X坐標:"+v1+"\n"+"Y坐標:"+v2+"\n"+"v3:"+v3+"\n"+"v4=:"+v4);
??break;
?case?302+50:
??alert("緩沖區查詢:"+id+"\n"+"圓心坐標X:"+v1+"\n"+"圓心坐標Y:"+v2+"\n"+"半徑:"+v3+"\n"+"v4=:"+v4);
??break;
?case?303+50:
??alert("緩沖區查詢:"+id+"\n"+"X最小值:"+v1+"\n"+"Y最小值:"+v2+"\n"+"X最大值:"+v3+"\n"+"Y最大值:"+v4);
??break;
?case?2001:
??alert("添加標注點:"+id+"\n"+"圖層名:"+v1+"\n"+"X坐標:"+v2+"\n"+"Y坐標:"+v3);
??parent.TOCFrame.setShapeXY(v2,v3);
??break;
?case?2003:
??alert("刪除標注點:"+id+"\n"+"圖層名:"+v1+"\n"+"圖元編碼:"+v2);
??break;
?case?2004:
??alert("修改標注點:"+id+"\n"+"圖層名:"+v1+"\n"+"圖元編碼:"+v2);
??break;
????????case?202:case?203:
??//如果圖形是經緯度坐標,可以利用以下代碼計算地球表面的距離,單位公里
??//var?pDrawer??=?pMap.getDrawer();
??//var?pPoints??=?pDrawer.getWorldPoints();
??//alert("折線長度:"+pPoints.ellipsoidDistance(1)+"公里");
??alert("折線\n長度:"+v1);
??break;
?case?211:
??alert("圓形區域\n面積:"+v1?+?"\n周長:"+v2);
??break;
?case?212:
??alert("矩形區域\n面積:"+v1?+?"\n周長:"+v2);
??break;
?case?213:
??//如果圖形是經緯度坐標,可以利用以下代碼計算地球表面的面積,單位平方公里
??//var?pDrawer??=?pMap.getDrawer();
??//var?pPoints??=?pDrawer.getWorldPoints();
??//alert("多邊形面積:"+pPoints.ellipsoidArea()+"平方公里");
??//alert("多邊形區域\n面積:"+v1?+?"\n周長:"+v2);
??break;
?case?214:
??alert("面積查詢:"+id+"\n"+"圖層名:"+v1+"\n"+"圖元個數:"+v2+"\n"+"圖元面積:"+v3+"\n"+"v4:"+v4);
??break;
?case?201+50:case?202+50:case?203+50:case?211+50:case?212+50:case?213+50:case?214+50:
??alert("地圖量算"+id);
??break;??
?//快捷菜單
?case?65://coContextMenuPre
??//pMap.ContextMenu("aaaaaa=8001;bbbbbb=8002",0,0);
??//alert("事件:?"+id+"\n"+"v1:"+v1+"\n"+"v2:"+v2+"\n"+"v3:"+v3+"\n"+"v4:"+v4+"\n"+"v5:"+v5);
??break;
?case?107:
?case?8001:
?case?8002:
?case?8003:
?case?8004:
??alert("自定義事件:?"+id+"\n"+"v1:"+v1+"\n"+"v2:"+v2+"\n"+"v3:"+v3+"\n"+"v4:"+v4+"\n"+"v5:"+v5);
??break;
?case?23://MouseReleased?:?v1=x,v2=y
??//var?pLayer;
??//pLayer.setAutoLabel(0x2000);
??//var?pInfo=pLayer.getLabelInfo();?//此處pInfo為GINote對象,可通過該參數修改標注的字體信息
??//pInfo
??//alert("MouseReleased");
??break;
?}
}
使用switch語句對事件id進行分支判斷。那么,能否對其進行改造呢,肯定是可以的。希望能去掉這個switch語句,具體實現過程如下:
1、實現一個方法,可以判斷某個函數是否存在(相當于反射,根據對象名創建對象的實例,這里采用js實現執行給定名稱的函數,當然要利用eval這個有用的方法了),如果存在則執行這個方法。
?*?判斷名稱為給定字符串的一個或多個函數是否存在,執行第一個存在的函數并返回值。
?*?@param?{Array}?funcArguments?函數參數
?*?@arguments?{string}?一個或多個函數名稱
?*?@return?函數執行后的返回值
?*/
var?applyEval?=?function(funcArguments)?
{
????for(var?i?=?1;?i?<?arguments.length;?i++)
????{
????????var?fName?=?arguments[i];
????????if(eval('typeof?'?+?fName)?==?"function")
????????{
????????????return?eval(fName?+?'.apply(this,?funcArguments)');
????????}
????}
}
2、定義一個geobeans事件哈希表。
?
var?userEventKey?=?{????Key2:?'OnZoomIn',
????Key7:?'OnZoom',
????Key10:?'Onloaded',
????Key11:?'OnLoadLayer',
????Key21:?'OverView',
????Key36:?'OnClick',
????Key2001:'OnDbClick'
};
示例暫時先只定義這幾個事件,可以自己擴展。
3、改造geobeansEvent事件回調函數,使其更利于用戶擴展。
?
var?geobeansEvent?=?function(){????
????????var?keyName?=?'Key'?+?arguments[0].toString();
????if(typeof?userEventKey?!=?'undefined'?&&?userEventKey?!=?null)
????{
????????var?f1Name?=?userEventKey[keyName];
????????applyEval(arguments,?f1Name);
????}
}
現在你想寫哪個事件的回調函數,只要寫userEventKey中對應事件的方法就可以了,比如我想在圖層加載事件(事件11,userEventKey中的Key11)回調中進行自定義處理,我只要提供OnLoadLayer方法即可。
以上只是個人的一些改造方法,可能還有其它的好方法,歡迎一起討論。
轉載于:https://www.cnblogs.com/gao241/archive/2006/08/25/486308.html
總結
以上是生活随笔為你收集整理的对geobeansEvent事件回调函数的改进的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于在SVG中如何实现gif动画的问题?
- 下一篇: SQL关闭自增长列标识:SET IDEN