移动层随滚动条移动的问题求解 本帖最后由 up2ulin 于 2009-07-06 10:22:45 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 问题主要是这样:js代码第一行:window.onload = closeDiv; //window.onload可以有两种情况,一种是执行getMsg【留言板大窗口】,另一种是closeDiv【留言板小窗口】【这两种窗口样式通过单击按钮切换】,如果window.onload设置为大窗模式口那么窗口会随滚动条移动,如果是小窗口则无反应。想知道问题出在哪里。 window.onresize = resizeDiv; window.onscroll = resizeDiv; //我认为这里是控制层是否跟随滚动条移动的函数,当window.onload为getMsg一切正常,当为closeDiv是窗口就不随滚动条移动了,查看代码发现两个getMsg会执行一个resizeDiv函数,于是我设置window.onscroll = resizeDiv; 但当window.onload为closeDiv小窗口仍不随滚动条移动。 try:window.onload = closeDiv;===>window.onload = function(){getMsg();closeDiv();}; <!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><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>无标题文档</title><style>/* 留言窗口 */#eMeng{ width:209px; overflow:hidden; VISIBILITY:hidden; position:absolute; bottom:0px; right:0px; z-index:999; } .gb_win_open{ height:280px; } .gb_win_close{ height:28px; }#eMeng_gb{ z-index:100; position:absolute; top:0px; left:0px; }#eMeng_gb table{ width:100%; border:none; }#eMeng_bar{ height:28px; position:absolute; left:0; z-index:90; } .eMeng_bar_t1{ top:255px; } .eMeng_bar_t2{ top:0; }.gb_top{ width:209px; height:44px; background:#ccc url(images/guestbook/top_bg.gif) top left no-repeat; } .gb_top_box{ height:22px; line-height:22px; margin:0px 8px 0 8px; color:#FFFFFF; font-size:10pt; position:relative; top:-7px; } .gb_btn_1{ position:absolute; top:0px; left:165px; } .gb_btn_1 img{ cursor:pointer; }.gb_mid{ background:url(images/guestbook/mid_bg.gif) top left repeat-y; padding:5px 8px; }.gb_bot{ height:10px; background:url(images/guestbook/bottom_bg.gif) bottom left no-repeat; }.gb_Frm{ border:solid 1px #77869A; } .Frm_area{ width:186px; height:90px; margin-left:2px; } .Frm_input{ width:165px; } .Frm_btn{ background:url(images/guestbook/btn_sub.gif) top left no-repeat; width:66px; height:19px; border:none; } .gb_yanzheng_box{ padding-left:8px; } .gb_yanzheng_box img{ vertical-align:top !important; vertical-align:text-bottom; }.gb_icon_bg1{ background:url(images/guestbook/icon.gif) 0 -2px no-repeat; padding-left:20px; height:22px; }.gb_icon_bg2{ background:url(images/guestbook/icon.gif) 0 -27px no-repeat; padding-left:20px; height:22px; }.gb_icon_bg3{ background:url(images/guestbook/icon.gif) 0 -52px no-repeat; padding-left:20px; height:22px; }</style><script> window.onload = function(){init();closeDiv();}; //window.onload可以有两种情况,一种是执行getMsg【留言板大窗口】,另一种是closeDiv【留言板小窗口】【这两种窗口样式通过单击按钮切换】,如果window.onload设置为大窗模式口那么窗口会随滚动条移动,如果是小窗口则无反应。想知道问题出在哪里。 window.onresize = resizeDiv; window.onscroll = resizeDiv; //我认为这里是控制层是否跟随滚动条移动的函数,当window.onload为getMsg一切正常,当为closeDiv是窗口就不随滚动条移动了,查看代码发现两个getMsg会执行一个resizeDiv函数,于是我设置window.onscroll = resizeDiv; 但当window.onload为closeDiv小窗口仍不随滚动条移动。 //短信提示使用(asilas添加) var divTop,divLeft,divWidth,divHeight,docHeight,docWidth,objTimer,bodyfrm,i=0; function init(){ try{ bodyfrm = ( document.compatMode.toLowerCase()=="css1compat" ) ? document.documentElement : document.body; //alert(bodyfrm); //bodyfrm = document.documentElement || document.body; divTop = parseInt(document.getElementById("eMeng").style.top,10); divLeft = parseInt(document.getElementById("eMeng").style.left,10); divHeight = parseInt(document.getElementById("eMeng").offsetHeight,10); divWidth = parseInt(document.getElementById("eMeng").offsetWidth,10); docWidth = bodyfrm.clientWidth; docHeight = bodyfrm.clientHeight; document.getElementById("eMeng").style.top = parseInt(bodyfrm.scrollTop,10) + docHeight + 10; // divHeight document.getElementById("eMeng").style.left = parseInt(bodyfrm.scrollLeft,10) + docWidth - divWidth; document.getElementById("eMeng").style.visibility="visible"; objTimer = window.setInterval("moveDiv()",10); } catch(e){} } function getMsg() { try{ bodyfrm = ( document.compatMode.toLowerCase()=="css1compat" ) ? document.documentElement : document.body; //alert(bodyfrm); //bodyfrm = document.documentElement || document.body; divTop = parseInt(document.getElementById("eMeng").style.top,10); divLeft = parseInt(document.getElementById("eMeng").style.left,10); divHeight = parseInt(document.getElementById("eMeng").offsetHeight,10); divWidth = parseInt(document.getElementById("eMeng").offsetWidth,10); docWidth = bodyfrm.clientWidth; docHeight = bodyfrm.clientHeight; document.getElementById("eMeng").style.top = parseInt(bodyfrm.scrollTop,10) + docHeight + 10; // divHeight document.getElementById("eMeng").style.left = parseInt(bodyfrm.scrollLeft,10) + docWidth - divWidth; document.getElementById("eMeng").className = "gb_win_open"; document.getElementById('eMeng_bar').className = "gb_top eMeng_bar_t1"; document.getElementById("eMeng").style.visibility="visible"; document.getElementById("eMeng_gb").style.visibility="visible"; document.getElementById("eMeng_bar").style.visibility="hidden"; objTimer = window.setInterval("moveDiv()",10); } catch(e){} } function resizeDiv() { try{ //修正窗口位置? divHeight = parseInt(document.getElementById("eMeng").offsetHeight,10) divWidth = parseInt(document.getElementById("eMeng").offsetWidth,10) docWidth = bodyfrm.clientWidth; docHeight = bodyfrm.clientHeight; document.getElementById("eMeng").style.top = docHeight - divHeight + parseInt(bodyfrm.scrollTop,10) document.getElementById("eMeng").style.left = docWidth - divWidth + parseInt(bodyfrm.scrollLeft,10) } catch(e){} } function moveDiv() { try { if(parseInt(document.getElementById("eMeng").style.top,10) <= (docHeight - divHeight + parseInt(bodyfrm.scrollTop,10))) { window.clearInterval(objTimer) objTimer = window.setInterval("resizeDiv()",10) } divTop = parseInt(document.getElementById("eMeng").style.top,10) document.getElementById("eMeng").style.top = divTop - 2 } catch(e){} } function closeDiv() { try { document.getElementById('eMeng_gb').style.visibility='hidden'; document.getElementById('eMeng').className = "gb_win_close"; document.getElementById('eMeng_bar').className = "gb_top eMeng_bar_t2"; document.getElementById('eMeng_bar').style.visibility='visible'; if(objTimer){ window.clearInterval(objTimer); } window.setInterval("resizeDiv()",10); } catch(e){} //if(objTimer) window.clearInterval(objTimer) //当不需要小控制柄时,将控制柄删除将此处打开。 //resizeDiv(); }</script></head><body><!-- 留言板 --><div id="eMeng" class="gb_win_open"><div id="eMeng_gb"><form name="myform" method="post" action="guestbook/post.php" onsubmit="javascript:return Check_Frm(this);"><table cellpadding="0" cellspacing="0"> <tr><td class="gb_top"><div class="gb_top_box">请输入留言内容<div class="gb_btn_1"><img src="images/guestbook/btn_close.gif" onclick="javascript:closeDiv();" alt="关闭窗口" /></div></div></td> </tr> <tr><td class="gb_mid"><textarea id="Frm_area" name="guestbook[content]" class="gb_Frm Frm_area" cols="" rows="" ></textarea></td> </tr> <tr><td class="gb_mid"><div class="gb_icon_bg1"><input type="text" id="Frm_tel" name="guestbook[title]" class="gb_Frm Frm_input" /></div><div class="gb_icon_bg2"><input type="text" id="Frm_email" name="guestbook[email]" class="gb_Frm Frm_input" /></div><div class="gb_icon_bg3"><input type="text" id="Frm_address" name="guestbook[qq]" class="gb_Frm Frm_input" /></div></td> </tr> <tr><td class="gb_mid"><img src="images/guestbook/line_1.gif" alt="" /></td> </tr> <tr><td class="gb_mid"><div class="gb_yanzheng_box"><img src="checkcode.php" id="checkcode" onclick="this.src='checkcode.php?id='+Math.random()*5;" style="cursor:pointer;" alt="验证码,看不清楚?请点击刷新验证码"/> <input name="checkcodestr" type="text" id="Frm_yanzheng" size="4" class="gb_Frm" style="width:50px;" /> <input type="submit" value="" class="Frm_btn" /></div></td> </tr> <tr><td class="gb_bot"><input name="dosubmit" value="dosubmit" type="hidden"/><input name="guestbook[username]" value="admin2" type="hidden"/></td></tr></table> </form></div><div id="eMeng_bar" class="gb_top eMeng_bar_t1"><div class="gb_top_box" style="top:5px;">留言板<div class="gb_btn_1"><img src="images/guestbook/btn_open.gif" onclick='javascript:getMsg()' alt="弹出窗口" /></div></div></div></div><!-- 留言板 --><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p></body></html> 如果这样写的话可以把bodyfrm = ( document.compatMode.toLowerCase()=="css1compat" ) ? document.documentElement : document.body; //alert(bodyfrm); //bodyfrm = document.documentElement || document.body; divTop = parseInt(document.getElementById("eMeng").style.top,10); divLeft = parseInt(document.getElementById("eMeng").style.left,10); divHeight = parseInt(document.getElementById("eMeng").offsetHeight,10); divWidth = parseInt(document.getElementById("eMeng").offsetWidth,10); docWidth = bodyfrm.clientWidth; docHeight = bodyfrm.clientHeight;这些都提导函数外面来定义吧?我尝试定义为什么函数内部无法调用函数内部调用全局变量直接饮用酒可以了吧? 这些变量的值是动态变化着的,所以每次使用的时候都需要重新去取,定义全局变量意义不大其实也没有什么思路可言发现问题:当页面初始化的时候,DIV不随滚动条移动点击图片后移动效果正常发现onclick时间执行了getMsg()方法所以确定问题在于,缺少了getMsg某个或某些定义或者初始化,所以在onload时直接执行getMsg方法 恩,我就是找不到那个方法,我一直想如果能找到这个clearDiv中缺少的方法就可以把它提出来放到clearDiv中,这样就不必执行一遍getMsg,因为这样会有一个窗口弹出的动作。找了半天发现两个函数执行时候clearDiv少了resizeDiv()动作。可是在clearDiv中即便执行它也没有效果,窗口还是不跟随滚动条移动。 急求innerHTML的用法 求代码的注释解析 两种不同的JS写法比较(请大家来评论一下),高手多多指教 求《Apache和Tomcat》的整合方法 javascript数值相加问题 <iframe>是可编辑状态,如何得到光标所在的位置(谢谢!!); 如何限制 后台程序添加的 "行数" 再请教高手! IE5与IE6支持不同版本的JS,怎么办啊?天哪! 求:根据鼠标的移动,平滑移动web页面的代码 没有onMouseOver onMouseOut onclick 这个菜单是怎么触发的? 求正则,'str1','str2,','str3'....
js代码第一行:
window.onload = closeDiv; //window.onload可以有两种情况,一种是执行getMsg【留言板大窗口】,另一种是closeDiv【留言板小窗口】【这两种窗口样式通过单击按钮切换】,如果window.onload设置为大窗模式口那么窗口会随滚动条移动,如果是小窗口则无反应。想知道问题出在哪里。
window.onresize = resizeDiv;
window.onscroll = resizeDiv; //我认为这里是控制层是否跟随滚动条移动的函数,当window.onload为getMsg一切正常,当为closeDiv是窗口就不随滚动条移动了,查看代码发现两个getMsg会执行一个resizeDiv函数,于是我设置window.onscroll = resizeDiv; 但当window.onload为closeDiv小窗口仍不随滚动条移动。
window.onload = closeDiv;
===>
window.onload = function(){getMsg();closeDiv();};
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title><style>
/* 留言窗口 */
#eMeng{ width:209px; overflow:hidden; VISIBILITY:hidden; position:absolute; bottom:0px; right:0px; z-index:999; }
.gb_win_open{ height:280px; }
.gb_win_close{ height:28px; }
#eMeng_gb{ z-index:100; position:absolute; top:0px; left:0px; }
#eMeng_gb table{ width:100%; border:none; }
#eMeng_bar{ height:28px; position:absolute; left:0; z-index:90; }
.eMeng_bar_t1{ top:255px; }
.eMeng_bar_t2{ top:0; }
.gb_top{ width:209px; height:44px; background:#ccc url(images/guestbook/top_bg.gif) top left no-repeat; }
.gb_top_box{ height:22px; line-height:22px; margin:0px 8px 0 8px; color:#FFFFFF; font-size:10pt; position:relative; top:-7px; }
.gb_btn_1{ position:absolute; top:0px; left:165px; }
.gb_btn_1 img{ cursor:pointer; }.gb_mid{ background:url(images/guestbook/mid_bg.gif) top left repeat-y; padding:5px 8px; }
.gb_bot{ height:10px; background:url(images/guestbook/bottom_bg.gif) bottom left no-repeat; }
.gb_Frm{ border:solid 1px #77869A; }
.Frm_area{ width:186px; height:90px; margin-left:2px; }
.Frm_input{ width:165px; }
.Frm_btn{ background:url(images/guestbook/btn_sub.gif) top left no-repeat; width:66px; height:19px; border:none; }
.gb_yanzheng_box{ padding-left:8px; }
.gb_yanzheng_box img{ vertical-align:top !important; vertical-align:text-bottom; }
.gb_icon_bg1{ background:url(images/guestbook/icon.gif) 0 -2px no-repeat; padding-left:20px; height:22px; }
.gb_icon_bg2{ background:url(images/guestbook/icon.gif) 0 -27px no-repeat; padding-left:20px; height:22px; }
.gb_icon_bg3{ background:url(images/guestbook/icon.gif) 0 -52px no-repeat; padding-left:20px; height:22px; }
</style>
<script> window.onload = function(){init();closeDiv();}; //window.onload可以有两种情况,一种是执行getMsg【留言板大窗口】,另一种是closeDiv【留言板小窗口】【这两种窗口样式通过单击按钮切换】,如果window.onload设置为大窗模式口那么窗口会随滚动条移动,如果是小窗口则无反应。想知道问题出在哪里。
window.onresize = resizeDiv;
window.onscroll = resizeDiv; //我认为这里是控制层是否跟随滚动条移动的函数,当window.onload为getMsg一切正常,当为closeDiv是窗口就不随滚动条移动了,查看代码发现两个getMsg会执行一个resizeDiv函数,于是我设置window.onscroll = resizeDiv; 但当window.onload为closeDiv小窗口仍不随滚动条移动。
//短信提示使用(asilas添加)
var divTop,divLeft,divWidth,divHeight,docHeight,docWidth,objTimer,bodyfrm,i=0;
function init(){
try{
bodyfrm = ( document.compatMode.toLowerCase()=="css1compat" ) ? document.documentElement : document.body;
//alert(bodyfrm);
//bodyfrm = document.documentElement || document.body;
divTop = parseInt(document.getElementById("eMeng").style.top,10);
divLeft = parseInt(document.getElementById("eMeng").style.left,10);
divHeight = parseInt(document.getElementById("eMeng").offsetHeight,10);
divWidth = parseInt(document.getElementById("eMeng").offsetWidth,10);
docWidth = bodyfrm.clientWidth;
docHeight = bodyfrm.clientHeight;
document.getElementById("eMeng").style.top = parseInt(bodyfrm.scrollTop,10) + docHeight + 10; // divHeight
document.getElementById("eMeng").style.left = parseInt(bodyfrm.scrollLeft,10) + docWidth - divWidth;
document.getElementById("eMeng").style.visibility="visible";
objTimer = window.setInterval("moveDiv()",10);
}
catch(e){}
}
function getMsg()
{
try{
bodyfrm = ( document.compatMode.toLowerCase()=="css1compat" ) ? document.documentElement : document.body;
//alert(bodyfrm);
//bodyfrm = document.documentElement || document.body;
divTop = parseInt(document.getElementById("eMeng").style.top,10);
divLeft = parseInt(document.getElementById("eMeng").style.left,10);
divHeight = parseInt(document.getElementById("eMeng").offsetHeight,10);
divWidth = parseInt(document.getElementById("eMeng").offsetWidth,10);
docWidth = bodyfrm.clientWidth;
docHeight = bodyfrm.clientHeight;
document.getElementById("eMeng").style.top = parseInt(bodyfrm.scrollTop,10) + docHeight + 10; // divHeight
document.getElementById("eMeng").style.left = parseInt(bodyfrm.scrollLeft,10) + docWidth - divWidth;
document.getElementById("eMeng").className = "gb_win_open";
document.getElementById('eMeng_bar').className = "gb_top eMeng_bar_t1";
document.getElementById("eMeng").style.visibility="visible";
document.getElementById("eMeng_gb").style.visibility="visible";
document.getElementById("eMeng_bar").style.visibility="hidden";
objTimer = window.setInterval("moveDiv()",10);
}
catch(e){}
}
function resizeDiv()
{
try{ //修正窗口位置?
divHeight = parseInt(document.getElementById("eMeng").offsetHeight,10)
divWidth = parseInt(document.getElementById("eMeng").offsetWidth,10)
docWidth = bodyfrm.clientWidth;
docHeight = bodyfrm.clientHeight;
document.getElementById("eMeng").style.top = docHeight - divHeight + parseInt(bodyfrm.scrollTop,10)
document.getElementById("eMeng").style.left = docWidth - divWidth + parseInt(bodyfrm.scrollLeft,10)
}
catch(e){}
}
function moveDiv()
{
try {
if(parseInt(document.getElementById("eMeng").style.top,10) <= (docHeight - divHeight + parseInt(bodyfrm.scrollTop,10)))
{
window.clearInterval(objTimer)
objTimer = window.setInterval("resizeDiv()",10)
}
divTop = parseInt(document.getElementById("eMeng").style.top,10)
document.getElementById("eMeng").style.top = divTop - 2
}
catch(e){}
}
function closeDiv()
{
try {
document.getElementById('eMeng_gb').style.visibility='hidden';
document.getElementById('eMeng').className = "gb_win_close";
document.getElementById('eMeng_bar').className = "gb_top eMeng_bar_t2";
document.getElementById('eMeng_bar').style.visibility='visible';
if(objTimer){
window.clearInterval(objTimer);
}
window.setInterval("resizeDiv()",10);
}
catch(e){}
//if(objTimer) window.clearInterval(objTimer) //当不需要小控制柄时,将控制柄删除将此处打开。
//resizeDiv(); }
</script>
</head><body><!-- 留言板 -->
<div id="eMeng" class="gb_win_open">
<div id="eMeng_gb">
<form name="myform" method="post" action="guestbook/post.php" onsubmit="javascript:return Check_Frm(this);">
<table cellpadding="0" cellspacing="0">
<tr>
<td class="gb_top"><div class="gb_top_box">请输入留言内容<div class="gb_btn_1"><img src="images/guestbook/btn_close.gif" onclick="javascript:closeDiv();" alt="关闭窗口" /></div></div></td>
</tr>
<tr>
<td class="gb_mid"><textarea id="Frm_area" name="guestbook[content]" class="gb_Frm Frm_area" cols="" rows="" ></textarea></td>
</tr>
<tr>
<td class="gb_mid">
<div class="gb_icon_bg1"><input type="text" id="Frm_tel" name="guestbook[title]" class="gb_Frm Frm_input" /></div>
<div class="gb_icon_bg2"><input type="text" id="Frm_email" name="guestbook[email]" class="gb_Frm Frm_input" /></div>
<div class="gb_icon_bg3"><input type="text" id="Frm_address" name="guestbook[qq]" class="gb_Frm Frm_input" /></div>
</td>
</tr>
<tr>
<td class="gb_mid"><img src="images/guestbook/line_1.gif" alt="" /></td>
</tr>
<tr>
<td class="gb_mid"><div class="gb_yanzheng_box"><img src="checkcode.php" id="checkcode" onclick="this.src='checkcode.php?id='+Math.random()*5;" style="cursor:pointer;" alt="验证码,看不清楚?请点击刷新验证码"/> <input name="checkcodestr" type="text" id="Frm_yanzheng" size="4" class="gb_Frm" style="width:50px;" /> <input type="submit" value="" class="Frm_btn" /></div></td>
</tr>
<tr>
<td class="gb_bot"><input name="dosubmit" value="dosubmit" type="hidden"/><input name="guestbook[username]" value="admin2" type="hidden"/></td>
</tr>
</table>
</form>
</div>
<div id="eMeng_bar" class="gb_top eMeng_bar_t1">
<div class="gb_top_box" style="top:5px;">留言板<div class="gb_btn_1"><img src="images/guestbook/btn_open.gif" onclick='javascript:getMsg()' alt="弹出窗口" /></div></div>
</div>
</div>
<!-- 留言板 --><p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
<p>a</p>
</body>
</html>
bodyfrm = ( document.compatMode.toLowerCase()=="css1compat" ) ? document.documentElement : document.body;
//alert(bodyfrm);
//bodyfrm = document.documentElement || document.body;
divTop = parseInt(document.getElementById("eMeng").style.top,10);
divLeft = parseInt(document.getElementById("eMeng").style.left,10);
divHeight = parseInt(document.getElementById("eMeng").offsetHeight,10);
divWidth = parseInt(document.getElementById("eMeng").offsetWidth,10);
docWidth = bodyfrm.clientWidth;
docHeight = bodyfrm.clientHeight;这些都提导函数外面来定义吧?我尝试定义为什么函数内部无法调用函数内部调用全局变量直接饮用酒可以了吧?
发现问题:当页面初始化的时候,DIV不随滚动条移动
点击图片后移动效果正常
发现onclick时间执行了getMsg()方法
所以确定问题在于,缺少了getMsg某个或某些定义或者初始化,所以在onload时直接执行getMsg方法
找了半天发现两个函数执行时候clearDiv少了resizeDiv()动作。可是在clearDiv中即便执行它也没有效果,窗口还是不跟随滚动条移动。