您的位置:首页 > 其它

一个问题的解决过程。

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:好了,写完了,大家拍砖吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: