一个问题的解决过程。
要求:
在页面上有一个按钮<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:好了,写完了,大家拍砖吧。