function showUserCard(e, user) { e = window.event||e; e.cancelBubble=true; var img = e.srcElement || e.target; var user = img.parentNode.children; if(user.length<2) return; var user = user[1].innerHTML.trim();if(!user) return; MzElement.show("UserCard_layer"); } <a target="_blank" href="http://hi.csdn.net/renyu732" onmouseover="javascript:showUserCard();"><img alt="" src="/u/ui/images/blank.gif" class="userstatus"><var csdnid="Reply_Username">renyu732</var></a>原来我也问过这个问题~别个给的答案~
<script language="javascript"> function XmlPost(o) { var webFileUrl = "WebForm2.aspx?ID=18"; var result = ""; var xmlHttp = new ActiveXObject("MSXML2.XMLHTTP"); xmlHttp.open("POST", webFileUrl, false);//使用XMLPOST方式 xmlHttp.send("");//发送 result = xmlHttp.responseText;//得到返回的结果
QUOTE:TO22楼,您的方法在火狐下不行,我试过了,请问题如何解决兼容问题?谢谢!!! -------------------------- 一看就知道不行了// var xmlHttp = new ActiveXObject("MSXML2.XMLHTTP"); 改为 var xmlHttp; if(window.ActiveXObject) xmlHttp = new ActiveXObject("MSXML2.XMLHTTP"); else xmlHttp = new XMLHttpRequest();
var isIe=navigator.appName.indexOf("Microsoft")!=-1?true:false; oDiv.style.top=isIe?(event.clientY-6)+"px":(e.pageY-6)+"px"; var iLeft=isIe?(event.clientX-6):(e.pageX-6); oDiv.style.left=iLeft+"px"; ============================================ LikeCode大哥,你昨晚提供的这个方法有一个问题,就是当页面不处在顶部,即往下拉动页面后,鼠标的真实位置和代码得到的鼠标位置有一个是相对的位置,有一个是绝对的位置,层的显示位置就变乱了 ============================================ 现在改用了9楼的方法,但是在火狐下又不兼容。22楼的问题在您的指点下已经得到解决了^V^
<img alt="" src="/u/ui/images/blank.gif" class="userstatus" style="background-image:url(http://webim.csdn.net/UserOnlineFace/Theme1/Tulipfly.ashx)" /><var id="topicUserName" csdnid="username">Tulipfly</var></a>
onmouseover="javascript:showUserCard(event);
<html>
<head>
<style>
.calendar_Layer_tablebg {
background-color: #bc8e41;
}
.calendar_Layer_tablein {
background-color: #FFFFFF;
}
</style>
<script language='javascript' type="text/javascript">
var show=0;function get_pos_x(obj)
{
var x=obj.offsetLeft;
while(obj.offsetParent){
obj=obj.offsetParent;
x+=obj.offsetLeft;
}
return x;
}
function get_pos_y(obj)
{
var y=obj.offsetTop;
while(obj.offsetParent){
obj=obj.offsetParent;
y+=obj.offsetTop;
}
return y;
}
function show_img(obj,edate)
{
show++;
if(!obj) return;
var div_obj=document.getElementById('contents');
if( 1==1 ) {
//alert(get_pos_x(obj));
div_obj.innerHTML="<table cellpadding=\"1\" cellspacing=\"1\" class=\"calendar_Layer_tablebg\"><tr><td class=\"calendar_Layer_txt1\">" + edate + "</td></tr><tr><td class='calendar_Layer_tablein'>" + edate + "</td></tr></table>";
div_obj.style.left=get_pos_x(obj)+5; //x;
div_obj.style.top=get_pos_y(obj)+15; //y;
div_obj.style.display="inline";
}else div_obj.style.display="none";
}
function hide_img()
{
if(--show>0) return;
var div_obj=document.getElementById('contents');
div_obj.style.display='none';
}
</script>
</head>
<body>
<div class="calendar_Layer" id="contents" style="position:absolute;display:none" onmouseover="show_img()" onmouseout="window.setTimeout('hide_img()',5)"></div><table width="50%">
<tr>
<td ><a href='' onmouseover="show_img(this,'2007-1-1')" onmouseout="window.setTimeout('hide_img()',5)" >用户1</a></td>
</tr><tr><td height='20'> </td></tr><tr>
<td ><a href='' onmouseover="show_img(this,'2007-1-5')" onmouseout="window.setTimeout('hide_img()',5)" >用户2</a></td>
</tr>
</table>
</body>
</html>
或
js+层都可以实现。
方法有很多种了,不过都是基于服务端和客户端两种方法的扩展。
function showUserCard(e, user)
{
e = window.event||e; e.cancelBubble=true;
var img = e.srcElement || e.target;
var user = img.parentNode.children; if(user.length<2) return;
var user = user[1].innerHTML.trim();if(!user) return;
MzElement.show("UserCard_layer");
}
<a target="_blank" href="http://hi.csdn.net/renyu732" onmouseover="javascript:showUserCard();"><img alt="" src="/u/ui/images/blank.gif" class="userstatus"><var csdnid="Reply_Username">renyu732</var></a>原来我也问过这个问题~别个给的答案~
建议把JS代码独立写在一个JS文件中,用DIV显示,在onmouseover()事件中调用
<a target="_blank" href="http://hi.csdn.net/renyu732" onmouseover="javascript:showUserCard();"><img alt="" src="/u/ui/images/blank.gif" class="userstatus"><var csdnid="Reply_Username">renyu732</var></a> e = window.event||e; e.cancelBubble=true;
var img = e.srcElement || e.target;
//获取鼠标当前的标签元素 也就是HTML代码中的<img alt="" src="/u/ui/images/blank.gif" class="userstatus">
var user = img.parentNode.children; if(user.length<2) return;
//取得父节点的子节点元素组<a><img></img><var></var></a>
var user = user[1].innerHTML.trim();if(!user) return;
//取得元素组中的第二个元素,也就是<var csdnid="Reply_Username">renyu732</var>中的innerHTML renyu732
这个是用户的唯一性标志了~相当于获取到了用户ID了
MzElement.show("UserCard_layer");//显示图层,细节我不清楚了,可能是AJAX实现
非常感谢帮我说的这么详细。
具体CSDN是咋实现的~我不知道~
我说说我的想法~
UserCard_layer应该是个DIV,MzElement.show("UserCard_layer")将它设置为可见
然后用AJAX根据获得的用户ID去调取用户的信息function showUserCard(e, user)
{
e = window.event||e; e.cancelBubble=true;
var img = e.srcElement || e.target;
var user = img.parentNode.children; if(user.length<2) return;
var user = user[1].innerHTML.trim();if(!user) return;
MzElement.show("UserCard_layer"); var layer=MzElement.check("UserCard_layer");
var xy = MzElement.realOffset(img);
layer.style.left = (xy.x + img.offsetWidth - 8) +"px";
layer.style.top = (xy.y) +"px"; var left = "<a target='_blank' href='http://hi.csdn.net/{0}/'><img alt='' class='face' src='http://profile.csdn.net/{0}/picture/2.jpg' /></a><br/>"
+"<a href='http://hi.csdn.net/{0}/' target='_blank'>\u4e2a\u4eba\u7a7a\u95f4</a><br/>"
+"<a href='http://webim.csdn.net/AddFriends/"+user+".ashx' target='_blank' ><img alt='add friend' class='addFriend' src='"+ System.resourcePath +"/blank.gif' /></a><br/>"
+"<a href='http://webim.csdn.net/Messages/"+user+".ashx' target='_blank'><img alt='send message' class='sendIMMsg' src='"+ System.resourcePath +"/blank.gif' /></a><br/>"
+"<a href='http://blog.csdn.net/{0}/' target='_blank'><img alt='blog' class='goBlog' src='"+ System.resourcePath +"/blank.gif' /></a><br/>"
+"<a href=''>"
MzElement.check("UserCard_left").innerHTML = left.format(user); var right = "<span>\u5e10\u53f7\uff1a</span><a target='_blank' href='http://hi.csdn.net/{0}/'><var>{0}</var></a><br/>"+ //username
"<img src='http://counter.csdn.net/pv.aspx?id=241' border='0' style='display:none'/>"+ //counter
"<span>\u6635\u79f0\uff1a</span><a target='_blank' href='http://hi.csdn.net/{0}/'><var id='UserCard_nickname'></var></a><br/>"+ //nickname
"<span>\u6700\u65b0\u5e16\u5b50\uff1a</span><br/><span id='UserCard_topiclist'></span>"+ //last topic
"<span style='margin-left:90px'><a href='http://forum.csdn.net/PointForum/Forum/UserTopicList.aspx?type=TopicUserRewarded&user={0}'>\u66f4\u591a\u5e16\u5b50...</a></span>"
MzElement.check("UserCard_right").innerHTML = right.format(user); if(typeof(showUserCard.database[user])=="undefined")
{
MzJson.request(MzElement.check("hf_cardUrl").value + user);
}
else bindData(user);
}
俺给你找出来了~
JS你得自己下下来慢慢看了~感觉挺多的~
function XmlPost(o)
{
var webFileUrl = "WebForm2.aspx?ID=18";
var result = "";
var xmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
xmlHttp.open("POST", webFileUrl, false);//使用XMLPOST方式
xmlHttp.send("");//发送
result = xmlHttp.responseText;//得到返回的结果
if(result != "")
{
var msgw,msgh,bordercolor;
msgw=400;//提示窗口的宽度
msgh=100;//提示窗口的高度
titleheight=25 //提示窗口标题高度
bordercolor="#c51100";//提示窗口的边框颜色
titlecolor="#c51100";//提示窗口的标题颜色 var sWidth,sHeight;
var bgObj=document.createElement("div");
bgObj.setAttribute('id','bgDiv');
bgObj.style.position="absolute";
bgObj.style.top="0";
bgObj.style.background="#cecece";
bgObj.style.filter="progid:DXImageTransform.Microsoft.Alpha(style=3,opacity=25,finishOpacity=75";
bgObj.style.opacity="0.6";
bgObj.style.left = o.style.left+o.width/2;
bgObj.style.top = o.style.top+o.height/2;
bgObj.style.width=200 + "px";
bgObj.style.height=300 + "px";
bgObj.style.zIndex = "10000";
bgObj.innerHTML=result;
document.getElementById("lads").appendChild(bgObj);
}
else
{
alert("aa");
}
}
</script>Ajax代码里面的div层自己设计就好了
webform2.aspx.cn中的代码private void Page_Load(object sender, System.EventArgs e)
{
DataRow d=DB.Admin_Show("18");
string admin="";
Response.Clear();
admin=d["username"].ToString().Trim()+"/";
admin+=d["flag"].ToString().Trim()+"/";
admin+=d["classstr"].ToString().Trim();
Response.Write(admin);//向HTTP输出内容流写入一个字符数组
Response.End();
}
--------------------------
一看就知道不行了// var xmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
改为
var xmlHttp;
if(window.ActiveXObject) xmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
else xmlHttp = new XMLHttpRequest();
oDiv.style.top=isIe?(event.clientY-6)+"px":(e.pageY-6)+"px";
var iLeft=isIe?(event.clientX-6):(e.pageX-6);
oDiv.style.left=iLeft+"px";
============================================
LikeCode大哥,你昨晚提供的这个方法有一个问题,就是当页面不处在顶部,即往下拉动页面后,鼠标的真实位置和代码得到的鼠标位置有一个是相对的位置,有一个是绝对的位置,层的显示位置就变乱了
============================================
现在改用了9楼的方法,但是在火狐下又不兼容。22楼的问题在您的指点下已经得到解决了^V^
帮你把问题拆分一下:
1:客户端与服务器端的通讯。方法有很多种:AJAX组件、js调用WebService,或者实现ICallbackEventHandler接口
2:js控制层的显示与隐藏.这个很简单
Hardcoding:
1:DEMO
加在Page_Load里
String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context", "ClientErrorCallback",false);
String callbackScript = "function CallServer(arg, context) {" + cbReference + "; }";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(),"CallServer", callbackScript, true);
具体解释可以参照MSDN实现ICallbackEventHandler接口的方法,这里你需要访问数据库,结果以string 形式返回客户端处理
#region 客户端回调
public void RaiseCallbackEvent(string eventArgument)
{
try
{
string UserID = string.Empty;
string Area = string.Empty;
string AccountState = string.Empty;
UserID = eventArgument;
model = bll.GetModel(int.Parse(UserID),0);
if (!string.IsNullOrEmpty(model.AreaCode))
{
tempds = cbll.GetList(10, 1, "Code ='" + model.AreaCode + "' ");
Area = tempds.Tables[0].Rows[0]["Name"].ToString();
}
returnValue = model.LoginName + ',' + model.Email + ',' + model.Phone + ',' + model.Score + ',' + Area + ',' + model.RegisterTime;
}
catch (Exception e)
{
Response.Write(e.Message.ToString());
}
}
public string GetCallbackResult()
{
return returnValue;
}
#endregion
客户端JS function ReceiveServerData(rvalue,context)//客户端回调函数,处理数据库查询结果字符串
{
var Info=new Array();
Info=rvalue.split(',');
oDiv.innerHTML="<table width='150' height='100' padding=0 margin=0 bgcolor='#cccccc' border='1'cellpadding='0' cellspacing='1' bordercolorlight='#CCCCCC' bordercolordark='#ffffff'><tr><td align='right' ><font color='red'>用户</font></td><td align='left'><font color='red'> "+Info[0]+"</font></td></tr><tr><td align='right'><font color='red'>EMail</font></td><td align='left' nowrap><font color='red'> "+Info[1]+"</font></td></tr><tr><td align='right' nowrap><font color='red'>联系方式</font></td><td align='left'><font color='red'> "+Info[2]+"</font></td></tr><tr><td align='right'><font color='red'>积分</font></td><td align='left'><font color='red'> "+Info[3]+"</font></td></tr><tr><td align='right'><font color='red'>地区</font></td><td align='left'><font color='red'> "+Info[4]+"</font></td></tr><tr><td align='right'><font color='red'>注册时间</font></td><td align='left' nowrap><font color='red'> "+Info[5]+"</font></td></tr></table>"; } function ClientErrorCallback( error, context )
{
alert("The validation failed. " + error);
} function LookUpInfo(obj) {//onmouseover触发
var div = obj;
var UserID = div.title;
var oDiv=document.getElementById("oDiv");
oDiv.style.display="";
oDiv.style.left= window.event.x + document.body.scrollLeft;
oDiv.style.top= window.event.y + document.body.scrollTop;
CallServer(UserID, "");//请求服务端处理
}2层的控制
function hidden()//层的显示与隐藏
{
var oDiv=document.getElementById("oDiv");
oDiv.style.display="none";
}需要添加以下层用于显示数据<div id="oDiv" class="block"></div> 绝对原创,测试通过
{
var x=obj.offsetLeft;
while(obj.offsetParent){
obj=obj.offsetParent;
x+=obj.offsetLeft;
}
return x;
}
function get_pos_y(obj)
{
var y=obj.offsetTop;
while(obj.offsetParent){
obj=obj.offsetParent;
y+=obj.offsetTop;
}
return y;
} div_obj.style.left=get_pos_x(obj)+5; //x;
div_obj.style.top=get_pos_y(obj)+15; //y;请问9楼的这段代码在火狐下怎么修改???就差这一步,就把CSDN的这个功能整理好了!!!
oDiv.style.top= window.event.y + document.body.scrollTop;
-----------------
不好意思,当时代码没有考虑到IE的一个不同.
你开个新贴,我回答你怎么做,嘿嘿~~~~
算了,我说.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default7.aspx.cs" Inherits="Default7" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
<div style="float:left;width:500px;border:solid 1px red">dddddd</div><a href="#" onmousemove="setPosition(event,true)" onmouseout="setPosition('',false)">link 1</a><br />
<a href="#" onmousemove="setPosition(event,true)" onmouseout="setPosition('',false)">link 2</a><br />
<a href="#" onmousemove="setPosition(event,true)" onmouseout="setPosition('',false)">link 3</a><br />
<div style="position:absolute;width:100px;height:100px;border:solid 1px red;top:100px;left:100px;display:none;background:#fff" id="div1">i'm here.</div>
</div>
</form>
<script type="text/javascript">
function setPosition(e,isShow){
var oDiv=document.getElementById("div1");
if(isShow){
//为了简单起见,脚本只判断IE与非IE,不多种浏览器之间,可能会有兼容问题,你可以自己完善代码,但是有小小的代价
var isIe=navigator.appName.indexOf("Microsoft")!=-1?true:false;
var ieBody;
if(isIe)
ieBody=(document.compatMode && document.compatMode!="BackCompat")?document.documentElement:document.body;
oDiv.style.top=isIe?event.clientY+ieBody.scrollTop+"px":e.pageY+"px";
var iLeft=isIe?event.clientX+ieBody.scrollLeft:e.pageX;
iLeft+=12;
oDiv.style.left=iLeft+"px";
if(isShow) oDiv.style.display="";
}
else
oDiv.style.display="none";
}
</script>
</body>
</html>
oDiv.style.top= window.event.y + document.body.scrollTop;
==============================
这个方法有一个问题,就是当页面不处在顶部,即往下拉动页面后,鼠标的真实位置和代码得到的鼠标位置有一个是相对的位置,有一个是绝对的位置,层的显示位置就变乱了,9楼的没有这个问题出现,但是不兼容火狐,不知道怎么改好。想用9楼的那种
<html>
<head>
<style>
.calendar_Layer_tablebg {
background-color: #bc8e41;
}
.calendar_Layer_tablein {
background-color: #FFFFFF;
}
</style>
<script language='javascript' type="text/javascript">
var show=0;
var addLeft = 5;
var addTop = 15;
var sUserAgent = navigator.userAgent;
var isOpera = sUserAgent.indexOf("Opera") > -1;
var isIE = sUserAgent.indexOf("compatible") > -1 && sUserAgent.indexOf("MSIE") > -1 && !isOpera;
function get_pos_x(obj)
{
var x=obj.offsetLeft;
while(obj.offsetParent){
obj=obj.offsetParent;
x+=obj.offsetLeft;
} if(isIE)
{
return (x+addLeft);
}
else
{
return (x+addLeft) + "px";
}
}
function get_pos_y(obj)
{
var y=obj.offsetTop;
while(obj.offsetParent){
obj=obj.offsetParent;
y+=obj.offsetTop;
}
if(isIE)
{
return (y+addTop);
}
else
{
return (y+addTop) + "px";
}
}function show_img(obj,edate)
{
show++;
if(!obj) return;
var div_obj=document.getElementById('contents');
if( 1==1 ) {
div_obj.innerHTML="<table cellpadding=\"1\" cellspacing=\"1\" class=\"calendar_Layer_tablebg\"><tr><td class=\"calendar_Layer_txt1\">" + edate + "</td></tr><tr><td class='calendar_Layer_tablein'>" + edate + "</td></tr></table>";
//alert(get_pos_y(obj));
div_obj.style.left=get_pos_x(obj); //+5; //x;
div_obj.style.top= get_pos_y(obj); //+15; //y;
div_obj.style.display="inline";
}else div_obj.style.display="none";
}
function hide_img()
{
if(--show>0) return;
var div_obj=document.getElementById('contents');
div_obj.style.display='none';
}
</script>
</head>
<body>
<div class="calendar_Layer" id="contents" style="position:absolute;display:none" onmouseover="show_img()" onmouseout="window.setTimeout('hide_img()',5)"></div><table width="50%">
<tr>
<td ><a href='' onmouseover="show_img(this,'2007-1-1')" onmouseout="window.setTimeout('hide_img()',5)" >用户1</a></td>
</tr><tr><td height='20'> </td></tr><tr>
<td ><a href='' onmouseover="show_img(this,'2007-1-5')" onmouseout="window.setTimeout('hide_img()',5)" >用户2</a></td>
</tr>
</table>
</body>
</html>