注:此处所说的弹窗窗口,主要指的是那些弹窗窗口中嵌入iframe,包含信息页面的窗口大小控制。

1、首先来了解下 SuperMap 示例中的处理方案

二维的处理方式

ARCgis按Esc乱跑 arcgis弹出窗口太大怎么办_Core

ARCgis按Esc乱跑 arcgis弹出窗口太大怎么办_ARCgis按Esc乱跑_02

1 //初始化Anchored类
 2       popup = new SuperMap.Popup.Anchored(
 3                     "chicken",
 4                     marker.getLonLat(),
 5                     new SuperMap.Size(220,140),
 6                     "<iframe frameborder=no border=0  src='http://www.baidu.com' style='width:100%;height:100%;border:none;' border='0'></iframe>",
 7                     icon,
 8                     true,
 9                     null
10             );
11 
12             infowin = popup;
13             //添加弹窗到map图层
14             map.addPopup(popup);

二维弹窗处理方式

三维的处理方式

ARCgis按Esc乱跑 arcgis弹出窗口太大怎么办_Core

ARCgis按Esc乱跑 arcgis弹出窗口太大怎么办_ARCgis按Esc乱跑_02

1 function createBubble(pos){
  2         try{
  3                 bubble = new SuperMap.Web.Realspace.Bubble();
  4                 bubble.set_pointer(pos);
  5                 
  6                 //设置气泡标题内容
  7                 var title = document.getElementById("TitleName").value;
  8                 if (title != null) {
  9                     bubble.set_title(title);
 10                 }
 11                   
 12                 var textStyle3D = new SuperMap.Web.Core.TextStyle3D();
 13                 
 14                 //设置气泡标题对齐方式
 15                 var textAligns = document.getElementById("TextAlign");
 16                 for(var i=0;i<textAligns.length;i++)
 17                 {
 18                      if (textAligns[i].selected) {
 19                         textStyle3D.set_alignment(textAligns[i].value);
 20                     }
 21                 }        
 22                 //设置标题文本字体   
 23                 var fontNames = document.getElementById("FontName");    
 24                 for(var i=0;i<fontNames.length;i++){
 25                     if (fontNames[i].selected) {
 26                         var selectValue = fontNames[i].value;
 27                         if (selectValue == 1) {
 28                             textStyle3D.set_fontName("微软雅黑");
 29                         }
 30                         else if (selectValue == 2) {
 31                             textStyle3D.set_fontName("宋体");
 32                         }
 33                         else if (selectValue == 3) {
 34                            textStyle3D.set_fontName("隶书");
 35                         }
 36                     }
 37                 } 
 38                 
 39                 //设置标题字体颜色
 40                 var fontColors = document.getElementById("FontColor");
 41                 for(var i = 0;i<fontColors.length;i++){
 42                     if (fontColors[i].selected) {
 43                         var selectColor = fontColors[i].value;
 44                         switch(selectColor) {
 45                         case "Red":
 46                             textStyle3D.set_foreColor(new SuperMap.Web.Core.Color(255,0,0,100));
 47                             break;
 48                         case "Green":
 49                             textStyle3D.set_foreColor(new SuperMap.Web.Core.Color(0,255,0,100));
 50                             break;
 51                         case "Blue":
 52                             textStyle3D.set_foreColor(new SuperMap.Web.Core.Color(0,0,255,100));
 53                             break;
 54                         default:
 55                             bubble.set_backColor(new SuperMap.Web.Core.Color(0,0,0,255));
 56                             break;
 57                         }
 58                     }
 59                 } 
 60                 
 61                 bubble.set_titleTextStyle3D(textStyle3D);                      
 62                 
 63                 //设置气泡边框宽度
 64                 var frameWidth = document.getElementById("FrameWidth").value;
 65                 if (frameWidth != null) {
 66                     bubble.set_frameWidth(frameWidth);
 67                 }
 68                 
 69                 //设置气泡圆角程度
 70                 var roundQuality = document.getElementById("RoundQuality").value;
 71                 if (roundQuality != null) {
 72                     bubble.set_roundQuality(roundQuality);
 73                 }
 74                 
 75                 //设置边框颜色
 76                 var frameColors = document.getElementById("FrameColor");
 77                 for(var i = 0;i<frameColors.length;i++){
 78                     if (frameColors[i].selected) {
 79                         var selectColor = frameColors[i].value;
 80                         switch(selectColor) {
 81                         case "Red":
 82                             bubble.set_backColor(new SuperMap.Web.Core.Color(255,0,0,100));
 83                             break;
 84                         case "Green":
 85                             bubble.set_backColor(new SuperMap.Web.Core.Color(0,255,0,100));
 86                             break;
 87                         case "Blue":
 88                             bubble.set_backColor(new SuperMap.Web.Core.Color(0,0,255,100));
 89                             break;
 90                         default:
 91                             bubble.set_backColor(new SuperMap.Web.Core.Color(255,255,255,255));
 92                             break;
 93                         }
 94                     }
 95                 }            
 96                 bubble.set_frameColor(new SuperMap.Web.Core.Color(255,255,255,255));    
 97                  
 98                 bubble.set_height(400);
 99                 bubble.set_width(500);
100         
101                 sceneControl.get_bubbles().removeAll();
102                 sceneControl.get_bubbles().add(bubble);
103             } 
104         catch(e){
105             alert("创建气泡失败");
106         }   
107     }
108     
109     function bubbleInitialize(bubble){
110         try
111         {
112             var frameInfo = document.getElementById("infoWindow");
113             frameInfo.style.display = "block";
114             frameInfo.src = infoPage;            
115             
116             frameInfo.frameborder = 0;
117             frameInfo.style.marginwidth = 0;
118             frameInfo.style.marginheight = 0;
119             
120             frameInfo.style.width = bubble.get_clientWidth()+"px";
121             frameInfo.style.height = bubble.get_clientHeight()+"px";
122             frameInfo.style.left = bubble.get_clientLeft() + sceneControl.get_controlOffsetX()+"px";
123             frameInfo.style.top = bubble.get_clientTop() + sceneControl.get_controlOffsetY()+"px";
124         }
125         catch(e){
126             alert("Faile to initialize bubble");
127         }
128     }
129     
130     function bubbleResize(bubble){
131         try
132         {
133             var frameInfo = document.getElementById("infoWindow");
134             frameInfo.style.display = "block";
135             frameInfo.src = infoPage;
136                     
137             frameInfo.style.width = bubble.get_clientWidth()+"px";
138             frameInfo.style.height = bubble.get_clientHeight()+"px";
139             frameInfo.style.left = bubble.get_clientLeft() + sceneControl.get_controlOffsetX()+"px";
140             frameInfo.style.top = bubble.get_clientTop() + sceneControl.get_controlOffsetY()+"px";
141         }
142         catch(e)
143         {
144             alert("Failed to resize bubble");
145         }
146     }
147     
148     //关闭气泡
149     function bubbleClose(bubble){
150         try
151         {
152             var frameInfo = document.getElementById("infoWindow");
153             frameInfo.style.display = "none";
154             
155             var selection3Ds = scene.findSelection3Ds(true);
156             if (selection3Ds.length > 0) {
157                 for(var i = 0; i <= selection3Ds.length - 1; i++){
158                     selection3Ds[i].removeAll();
159                 }
160             }
161         }
162         catch(e){
163             alert("Failed to close bubble");
164         }
165     }

三维弹窗处理方式

示例处理方式评价:

优点:使用示例中的处理方式,简单方便,在初始化弹窗的时候,即设置好了弹窗窗口的大小,这样在弹窗弹出的时候,窗口大小就已经固定,不会出现弹窗大小变动的现象,用户体验好。

缺点:在后期如果需要补充信息页面数据,窗口大小需要根据页面显示范围调整大小。此时就需要找到弹出窗口的代码,修改弹窗初设宽度和高度。如果只是几个页面,这么操作还好,如果需要修改的弹窗很多,修改很频繁,那么这么设置的弊病就出来了。需要花费很多功夫。

2、为了有效解决这个问题,于是下面的方案就出来了。

操作步骤如下:

1、在二维和三维初始化弹窗的时候,随意设置一个宽度和高度,建议设置成小尺寸即可。

ARCgis按Esc乱跑 arcgis弹出窗口太大怎么办_Core

ARCgis按Esc乱跑 arcgis弹出窗口太大怎么办_ARCgis按Esc乱跑_02

1 popup = new SuperMap.Popup.Anchored(
2                      "chicken",
3                       marker.getLonLat(),
4                       new SuperMap.Size(10,10),
5                       "<iframe frameborder=no border=0  src='http://www.baidu.com' style='width:100%;height:100%;border:none;' border='0'></iframe>",
6                       icon,
7                       true,
8                       null
9              );

二维操作

ARCgis按Esc乱跑 arcgis弹出窗口太大怎么办_Core

ARCgis按Esc乱跑 arcgis弹出窗口太大怎么办_ARCgis按Esc乱跑_02

1 bubble.set_height(10);
2 bubble.set_width(10);

三维操作

2、设置弹窗中显示页面的body的style,设置width和height,根据页面内容多少对应设置对应width和height。

ARCgis按Esc乱跑 arcgis弹出窗口太大怎么办_Core

ARCgis按Esc乱跑 arcgis弹出窗口太大怎么办_ARCgis按Esc乱跑_02

1 <body style="padding:15px;width:320px;height:380px;">

页面代码示例

3、在弹窗中显示页面加载之后,调用地图和三维场景的弹窗对象,重新设置弹窗的width和height。

ARCgis按Esc乱跑 arcgis弹出窗口太大怎么办_Core

ARCgis按Esc乱跑 arcgis弹出窗口太大怎么办_ARCgis按Esc乱跑_02

1 /**
 2  * 本js用于地图或者场景弹窗中嵌入iframe页面后,弹窗根据iframe内容自动缩放大小。
 3  * 注意:嵌入页面需要设置body的width,并且嵌入页面需要引入本js
 4  */
 5 function resizePop(){
 6     /// 查找对应的iframe
 7     var _iframe;
 8     var _frames=parent.$("iframe");
 9     for(var i=0;i<_frames.length;i++){
10         if(_frames[0].src.match(location.herf)){
11             _frame=_frames[i];
12         }
13     }
14     
15     if(parent["_map"]){// map对象存在
16         
17         var _popArray=parent._map.popups;
18         for(var i=0;i<_popArray.length;i++){
19             var _pop=_popArray[i];
20             
21             /// 判断寻找对应的pop
22             if($(_frame).parent().attr("id").split("_")[0]===_pop.id){
23                  _pop.setSize(new parent.SuperMap.Size($(document.body).outerWidth(),$(document.body).outerHeight()));
24             }
25         }
26     }else if(parent.window["sceneControl"]){// 3d不存在
27         var _bubble=parent.bubble;
28         var _padding_L=Number($(document.body).css("padding-left").replace("px",""));
29         var _padding_R=Number($(document.body).css("padding-right").replace("px",""));
30         var _padding_B=Number($(document.body).css("padding-bottom").replace("px",""));
31         var _padding_T=Number($(document.body).css("padding-top").replace("px",""));
32         
33         _bubble.set_clientWidth($(document.body).width()+12+_padding_L+_padding_R);
34         _bubble.set_clientHeight($(document.body).height()+12+_padding_B+_padding_T);
35     }
36 }
37 
38 $(document).ready(function(){
39     resizePop();
40 });

示例代码

注:代码为开发环境配置,未做处理,不一定适合测试,仅供参考

此种方案处理评价:

优点:每次修改弹窗信息页面显示内容的时候,不论增加还是减少内容,修改完毕后,对应修改页面body的style即可。而不用去查找调用弹窗的代码。修改信息,本身就在信息页面操作,操作完毕后,顺手改了宽度和高度即可。

缺点:每次弹窗弹出来的时候,会有一个弹窗由小变大的一个效果。