炼狱:window.createPopup()弹出提示tips

本文介绍如何利用window.createPopup()函数为Web界面的Text和Select控件创建动态大小的提示信息。针对Select控件无Title属性的问题,通过两次调用show方法获取窗口实际尺寸,并采用表格td元素的nowrap属性确保提示内容不换行。

炼狱:window.createPopup()弹出提示tips


CCBS 系统增加了新的需求,给界面上的Text文本输入框和Select下拉框增加信息提示。
对于Text输入框来说,实现起来并不难:重载Text文本框的onmouseover事件,然后显示出Text文本框的title也就可以了。
但是,对于Select控件来说就远远没有这么简单了。首先Select本身没有Title属性!无疑增加了实现的难度。
在网上找了点资料后,发现window.createPopup()函数可以实现弹出式的tips,而且微软的技术支持网站也有这方面的例子(参见:http://msdn.microsoft.com/workshop/samples/author/dhtml/popup/usingpopup.htm)。但是实现起来并不是那么一帆风顺的事情。
首先,window.createPopup()生成的窗口在显示的时候要手动指定该窗口的位置(x,y坐标),窗口的宽度和高度。而显示的内容是变化的,显示的字符串有长有短,窗口的长度和宽度也要跟着变化,如何实现呢?
其次,windows网页上的title属性在显示提示信息的时候是永远不会换行的,哪怕你显示的信息超过屏幕的显示范围它也不会顾忌到你的感受。windows标准就是我们的标准,我们也只能仿效了。
上面的两个问题着实让我困惑了一阵子,应该说是一个下午吧。不过最后问题还是得到解决了,虽然过程颇有些周折。
首先解决的是弹出窗口的指定位置,宽度和高度问题。窗口的位置就是响应鼠标事件的位置,但是该位置一定要区分清楚,鼠标如下几个位置的参数:clientX,clientY;offsetX,offsetY,screenX,screenY,x,y等。(具体每个位置的意义有单独的文章来解释)在这里应该是相对于响应控件的位置,使用的是offsetX,offsetY值。
要控制createPopuo()生成的窗口的宽度和高度,必须使用一个比较“土”的方法:首先调用oPopup.show(0,0,width,height)方法,马上获得该窗体的scrollWidth,scrollHeight,然后对该窗体隐藏:oPopup.hide()。获得具体的宽度和高度之后,再在具体的位置上显示真正的提示信息:
oPopup.show(x,y,scrollWidth,scrollHeight)。也就是说:在真正显示tips之前要调用一次显示方法获得实际的宽度和高度!这是解决问题的重点!!!
让显示的信息不换行的问题解决过程说难也不难,重要的是要能够想到该方法:使用table中的td不允许换行的属性:nowrap,那么包含在td中的内容就会一直显示出来,永远都不会换行了!!!
代码的范例如下:
 
var winPopup = window.createPopup(); //Create the window to popup
var winstr="<table style=/" border: 1 solid  #FFA6CA/" border=/"0/" width=/"100%/" height=/"100%/" cellpadding=/"0/" cellspacing=/"0/"  background=/"/" >";
 winstr+="<tr><td align=/"center/"><table width=/"100%/" height=/"100%/" border=/"0/" cellpadding=/"0/" cellspacing=/"0/">";
 winstr+="<tr><td nowrap id=/"tdMsg/" valign=/"center/" style=/"font-size:12px; color: red; face: Tahoma/"></td></tr></table></td></tr></table>";
winPopup.document.body.innerHTML = winstr;
var eventElement = null;
var xPos = 0;
var yPos = 0;
var timer = null;
/*************************************************************************
 Function Name:showPopupHelp
 Description:Popup a window that shows the content of text or select
 Input Parameter:None
 Output :None
 Return:None
 ***********************************************************************/
function showPopupHelp(helpMsg)
{
 initPopupWindow(helpMsg);
 eventElement = event.srcElement;
 xPos= window.event.offsetX;
 yPos= window.event.offsetY;
 timer = setTimeout("showPopupWindow()",1000);
}
/*************************************************************************
 Function Name:hidePopupHelp
 Description:Invisible the popup window
 Input Parameter:None
 Output :None
 Return:None
 ***********************************************************************/
function hidePopupHelp()
{
 clearTimeout(timer);
 winPopup.hide();
}
/*************************************************************************
 Function Name:initPopupWindow
 Description:Initilize the popup window,draw the frame
 Input Parameter:String to show
 Output :None
 Return:None
 ***********************************************************************/
function initPopupWindow(msgstr)
{
 winPopup.document.all('tdMsg').innerText = msgstr;
}
/*************************************************************************
 Function Name:showPopupWindow
 Description:Visible the popup window
 Input Parameter:None
 Output :None
 Return:None
 ***********************************************************************/
function showPopupWindow()
{
 winPopup.show(0,0,10,10);
 var h = winPopup.document.body.scrollHeight;
 var w = winPopup.document.body.scrollWidth;
 winPopup.hide();
 //var w = eventElement.offsetWidth;
 //var h = winPopup.document.body.scrollHeight;
 //var x = eventElement.style.left;
 //var y = eventElement.style.top + eventElement.offsetHeight;
 var x = xPos + 3;
 var y = yPos + 3;
 winPopup.show(x,y,w,h,eventElement);
 delete eventElement;
}
 

flyToPoint(data){ // 优化版:改进多边形中心计算并添加高度偏移 let _this = this; const dataSources = _this.viewer.dataSources._dataSources; let lengthSources = dataSources.length; for (let f = lengthSources - 1; f >= 0; f--) { var entities = dataSources[f].entities.values; entities.forEach(item=>{ item._polygon.material.color.alpha = 0.5 item._polygon.material.color.blue = 0.2235294117647059 item._polygon.material.color.green = 0.7843137254901961 item._polygon.material.color.red = 1 }) const newEnity = entities.find(item => item.properties && item.properties.gridcode && item.properties.gridcode._value == data.gridCode ); if (!newEnity || !newEnity._polygon || !newEnity._polygon.hierarchy) { continue; // 跳过无效实体 } newEnity._polygon.material = new Cesium.ColorMaterialProperty( new Cesium.Color.fromBytes(222, 67, 41, 128) ); const hierarchy = newEnity._polygon.hierarchy._value; let centerPosition; // 优先使用边界框中心(更准确) if (hierarchy.positions && hierarchy.positions.length > 0) { // 使用边界框计算中心(考虑地形起伏) const boundingSphere = Cesium.BoundingSphere.fromPoints(hierarchy.positions); centerPosition = boundingSphere.center; // 或者使用Cesium提供的多边形中心计算工具 // centerPosition = Cesium.PolygonPipeline.computeCenter(hierarchy.positions); } else { // 回退到简单平均法 const positions = hierarchy.positions || []; centerPosition = this.calculatePolygonCenter(positions); } // 将笛卡尔坐标转换为经纬度高度 const cartographic = Cesium.Cartographic.fromCartesian(centerPosition); // 添加高度偏移(例如100米),避免被地形遮挡 cartographic.height += 20; // 转回笛卡尔坐标 centerPosition = Cesium.Ellipsoid.WGS84.cartographicToCartesian(cartographic); // 增加事件标签和网格员的信息 var obj = { name: data.name, value: { '网格名称': data.name, '网格面积': data.gridArea + '㎡', '地址': data.address, '网格员': data.names, '网格员电话':data.phoneNumber, // '事件总数':data. } }; // 创建弹窗并设置高度 _this.createPopup(data.id, centerPosition, obj); // 飞行到该实体,设置适当的视角 this.viewer.flyTo(newEnity, { duration: 0.2, offset: new Cesium.HeadingPitchRange( 0, // 航向角 -Cesium.Math.toRadians(45), // 俯仰角(俯视) 500 // 距离(米),可根据需要调整 ) }); } } 之前的颜色没有回复成之前的
最新发布
07-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值