走过的路无法回头。所以 —— 一直前进吧!

夫君子之行,静以修身,俭以养德,非淡泊无以明志,非宁静无以致远。

常用链接

统计

最新评论

一个有趣的客户端注册事件

        在写一段再平常不过的代码时,突然发现一个很有趣的问题,客户端的window.location.href无法执行?
        代码很简单。我们在页面中放置一个BUTTON控件,然后在服务端的Page_Load事件中加入客户端注册代码:

if (!Page.IsPostBack)
{
    
this.Button1.Attributes["onclick"= "javascript:return ConfirmSelect();";
}
在客户端中的javascirpt中:
function ComfirmSelect()
{
    window.location.href 
= "abc.aspx";
    
//return false;
}

    按照假定的逻辑,应当是从客户端直接执行window.location,而不需要再返回服务端。可实际上呢?这个客户端事件根本没有执行,服务端的Button1_Click事件依旧被执行。
    我们再把客户端Javascript改写一下,看看会发生什么情况:
function ComfirmSelect()
{
    alert(
"第一次执行!");
    window.location.href
="abc.aspx";
    alert(
"第二次执行!");
    
//return false;
}
    我们会注意到,在执行第一个alert()时,状态栏中的进度条是未被加载的,紧接着,会在进度条加载的状态下显示第二个alert()。这时我们可以注意到,window.location已经被服务端的事件覆盖了。也就是说在服务端注册的客户端事件对于window.location是无效的。
    现在我们把return false这行的注释去掉,看看处理方式。在这种情况下,只有第一次alert是按照逻辑来处理的,然后页面会向服务端传递一次,再次执行第二个alert(),最后才转到我想要的页面。(顺序反了?)

       还不清楚为什么会这样,希望能得到解答。

posted on 2006-11-19 08:53 George Ge 阅读(1928) 评论(8)  编辑 收藏 网摘 所属分类: ASP.NET

评论

#1楼  2006-11-19 09:08 yunhuasheng      

细小的问题,没太注意,有时很奇怪,编程时不能运行,可是过了一阵子就可以了,   回复  引用  查看    

#2楼  2006-11-19 12:21 布尔      

首先是这样的:
<form id="form" method="post"> <input type="submit" id="button"></form>
按钮没有挂任何的js事件,点按钮form会post到服务器端
<form id="form" method="post"> <input type="submit" id="button" onclick="return f()"></form>
按钮挂上js事件后,form表单会不会提交取决于f是否为真,比如下面的
<form id="form" method="post"> <input type="submit" id="button" onclick="return false"></form>肯定不会提交表单

明白这些后,如果ComfirmSelect没有明确值,即没有明确form.onclick = function (){return false},表单就会被提交。还有一点需要注意,表单被提交的时候js事件都会被释放掉。

另外还有一点需要注意,当表单中有附件提交时,form.submit();document.location.href = "orther.aspx";这时表单的附件将不会被服务器得到。   回复  引用  查看    

#3楼  2006-11-19 13:34 木野狐      

需要用 return false 来终止 form 提交,这没什么奇怪的。另外一个需要考虑的就是 event bubbling 的问题。   回复  引用  查看    

#4楼  2006-11-19 14:20 Allen Zhang      

把最终生成的html打开看一下为什么会这样   回复  引用  查看    

#5楼 [楼主] 2006-11-19 14:23 George Ge      

@布尔
@木野狐
问题不在于这里,我并不是说要终于FORM的提交,而是说两点:1、JAVASCRIPT中的执行并没有按我想像的顺序来执行;2、提交到服务端之前应当先执行客户端事件的,但是alert()可以执行,window.location却不能执行。即便我用了return false,可如果存在window.location,还是一样会进行一次FORM的提交,这却是不我想的。   回复  引用  查看    

#6楼  2006-11-19 15:06 James[匿名] [未注册用户]

使用type="button"的按钮,submit的用法不是这样的   回复  引用    

#7楼  2006-11-19 23:27 锦瑟 [未注册用户]

如果只需要客户端事件,那就不要用<asp:Button>,用<input type=button>应该没有这个问题了,如果客户端事件后继续执行服务器端事件,建议使用onclientclick属性。   回复  引用    

#8楼  2006-11-20 09:08 PureEviL      

将window.location.href写到服务器端,
runat server的button是先执行客户端,后执行服务器端   回复  引用  查看    





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-11-19 08:55 编辑过
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:

相关链接: