一个问题的解决过程。
2008-07-01 17:31
375 查看
一个问题的解决过程。
要求:
在页面上有一个按钮<input id="btnAssure" runat="server" value="Assure">
点击它的时候触发 onclick[ShowBalanceAgain()]和onserverclick 2个click事件。
onserverclick的工作是修改页面一个隐藏层div的内容。
onclick的工作是createElement一个div. div里引用了隐藏层的内容。
问题:
click的时候页面不弹出
探索
1:为什么click页面不弹出
既然click 时,页面不弹出有2中原因,一种是没有执行onclick 的ShowBalanceAgain.
令一种执行了,但页面post刷新了。
我查看了一下源代码
ShowBalanceAgain(); __doPostBack('ctl00$ContentPlaceHolder1$btnAssure','')
可见浏览器click要先于serverclick执行.所以原因应该是后者。
2: 能不能有一种机制让serverclick先执行、onclick后执行呢?
为了让serverclick限制性,我使用了这种机制。
当 page_load的时候
this.btnAssure.Attributes.Add("onclick", "ShowBalanceAgain();return;");
先return,这样就不会执行__doPostBack
然后自己写js方法
function useRasin()
{
__doPostBack("<%=btnAssure.ClientID%>");
}
调用时顺序
useRasin(),ShowBalanceAgain();
感觉这样很好,可是运行后才知道自己愚蠢至极。
只要post,也就是__doPostBack。弹出的div 都会消失。不管你是先、是后!
3:我该如何是好?
既然post后,弹出的div就会消失。那我就不post。如果不post。如何实现刚开始我提出的要求呢。
好了,我想到了ajax。
<script language="javascript" type="text/javascript" defer="true">
var xmlHttp;
function createXmlHttp()
{
//IE browser
if(window.ActiveXObject)
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest)
{
xmlHttp=new XMLHttpRequest();
}
}
function refreshModelList()
{
var url="ajax.aspx?ts="+new Date().getTime();
createXmlHttp();
xmlHttp.onreadystatechange=handleStateChange;
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
// alert("refreshModelList");
}
function handleStateChange()
{
if(xmlHttp.readyState == 4)
{
if(xmlHttp.status == 200)
{
updateModelsList();
}
}
}
function updateModelsList()
{
document.getElementById("<%=lblOrderAmount.ClientID %>").innerText=xmlHttp.responseText.split(",")[0];
}
function ShowBalanceAgain()
{
//Div3
//debugger
//ajax called
refreshModelList();
CancelOper(2);
//alert(document.getElementById("lblMessage").innerText);
createWindow('结算中心', 340,100, '#ffffff', 3, 0, 0, 0);
makeCenter(3);
//useRasin();
return false;
}
</script>
我用了ajax,窗口是弹出来了,但不是serverclick修改后的内容。
我明明document.getElementById("<%=lblOrderAmount.ClientID %>").innerText=xmlHttp.responseText.split(",")[0];
做了这个操作。为什么不会修改呢?
4: ajax为什么不成功
百思之后,才知道自己用了异步ajax[asynchronism].读取的内容有一定的滞后性[特别是耗时很长时,滞后性更大。]
如果改用同步就可以实现刚开始的要求。但一定程度上失去了ajax的意义。
5: 除了ajax还有别的方法吗?
俗话说条条道路通罗马,有偷懒的方法,但从逻辑上不一定正确。
6: 如何做呢?
我在页面上弄一个隐藏域 ,它有runat="server"的属性
<input type="hidden" id="hidOperate" name="hidOperate" value="0" runat="server" />
当serverclick的时候我设置隐藏域为1
//this operating is to show balance's window,please don't remove it !
this.hidOperate.Value = "1";
在页面上加上
<script language="javascript">
if(document.readyState=="complete")
{
//弹出窗口
}
else
{
document.onreadystatechange=function(){
if(document.readyState=="complete")
{
//弹出窗口
}}
}
</script>
note:用readystate是为了防止页面DOM树的结构发生紊乱
7:好了,写完了,大家拍砖吧。
要求:
在页面上有一个按钮<input id="btnAssure" runat="server" value="Assure">
点击它的时候触发 onclick[ShowBalanceAgain()]和onserverclick 2个click事件。
onserverclick的工作是修改页面一个隐藏层div的内容。
onclick的工作是createElement一个div. div里引用了隐藏层的内容。
问题:
click的时候页面不弹出
探索
1:为什么click页面不弹出
既然click 时,页面不弹出有2中原因,一种是没有执行onclick 的ShowBalanceAgain.
令一种执行了,但页面post刷新了。
我查看了一下源代码
ShowBalanceAgain(); __doPostBack('ctl00$ContentPlaceHolder1$btnAssure','')
可见浏览器click要先于serverclick执行.所以原因应该是后者。
2: 能不能有一种机制让serverclick先执行、onclick后执行呢?
为了让serverclick限制性,我使用了这种机制。
当 page_load的时候
this.btnAssure.Attributes.Add("onclick", "ShowBalanceAgain();return;");
先return,这样就不会执行__doPostBack
然后自己写js方法
function useRasin()
{
__doPostBack("<%=btnAssure.ClientID%>");
}
调用时顺序
useRasin(),ShowBalanceAgain();
感觉这样很好,可是运行后才知道自己愚蠢至极。
只要post,也就是__doPostBack。弹出的div 都会消失。不管你是先、是后!
3:我该如何是好?
既然post后,弹出的div就会消失。那我就不post。如果不post。如何实现刚开始我提出的要求呢。
好了,我想到了ajax。
<script language="javascript" type="text/javascript" defer="true">
var xmlHttp;
function createXmlHttp()
{
//IE browser
if(window.ActiveXObject)
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest)
{
xmlHttp=new XMLHttpRequest();
}
}
function refreshModelList()
{
var url="ajax.aspx?ts="+new Date().getTime();
createXmlHttp();
xmlHttp.onreadystatechange=handleStateChange;
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
// alert("refreshModelList");
}
function handleStateChange()
{
if(xmlHttp.readyState == 4)
{
if(xmlHttp.status == 200)
{
updateModelsList();
}
}
}
function updateModelsList()
{
document.getElementById("<%=lblOrderAmount.ClientID %>").innerText=xmlHttp.responseText.split(",")[0];
}
function ShowBalanceAgain()
{
//Div3
//debugger
//ajax called
refreshModelList();
CancelOper(2);
//alert(document.getElementById("lblMessage").innerText);
createWindow('结算中心', 340,100, '#ffffff', 3, 0, 0, 0);
makeCenter(3);
//useRasin();
return false;
}
</script>
我用了ajax,窗口是弹出来了,但不是serverclick修改后的内容。
我明明document.getElementById("<%=lblOrderAmount.ClientID %>").innerText=xmlHttp.responseText.split(",")[0];
做了这个操作。为什么不会修改呢?
4: ajax为什么不成功
百思之后,才知道自己用了异步ajax[asynchronism].读取的内容有一定的滞后性[特别是耗时很长时,滞后性更大。]
如果改用同步就可以实现刚开始的要求。但一定程度上失去了ajax的意义。
5: 除了ajax还有别的方法吗?
俗话说条条道路通罗马,有偷懒的方法,但从逻辑上不一定正确。
6: 如何做呢?
我在页面上弄一个隐藏域 ,它有runat="server"的属性
<input type="hidden" id="hidOperate" name="hidOperate" value="0" runat="server" />
当serverclick的时候我设置隐藏域为1
//this operating is to show balance's window,please don't remove it !
this.hidOperate.Value = "1";
在页面上加上
<script language="javascript">
if(document.readyState=="complete")
{
//弹出窗口
}
else
{
document.onreadystatechange=function(){
if(document.readyState=="complete")
{
//弹出窗口
}}
}
</script>
note:用readystate是为了防止页面DOM树的结构发生紊乱
7:好了,写完了,大家拍砖吧。
相关文章推荐
- 一个新手学习python的过程中遇到的一些问题及解决方法
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三).so文件编译过程问题的解决
- vs2017在排除一个文件夹下所有文件过程中很慢导致假死问题的解决
- 部署ArcGIS API for JS时出的一个小问题及解决过程
- 一个CMake编译问题的解决过程
- 一个罕见的MySQL redo死锁问题排查及解决过程(pt-pmp)
- mysql-mysql多实例只能起来一个实例 问题解决过程
- 思考一个问题的解决过程
- 一个较奇异的问题(485通信)我解决问题的整个过程(时间差不多4个小时)
- Linux下安装MyEclipse和Tomcat服务器详解,以及我安装过程中所出现的问题以及解决办法,并实现一个web小程序
- 一个博友的SQL问题解决过程
- 解决了安装kchmviewer的过程中遇到的一个小问题
- 一个光标绘制问题的解决过程
- 一个查了6个小时的问题的解决过程
- 一个图文混排问题的解决过程
- 人生是一个不断解决问题的过程
- 一直以来我(每个从事linux开发的人)深受“bug”的困扰,好像“bug”不足以描述这种被问题困扰的无奈。因为当在驱动或BSP的开发过程中,所碰到的问题比解决一个bug难得多。 Li
- 关于 json解析过程中的一个问题的解决
- 一个问题的解决过程