今天先来解决一下昨天留下的问题。
首先是“ 只能提交一次的按钮 ”,在ff中 history.back()后按钮仍然是disabled状态。这个问了很久都没有答案,于是自己试啊试,发现在ff中history.back(),页面不会执行onload,即停留在最后提交的状态,而ie会在history.back()后执行onload,但这是浏览器的问题,估计也没办法。垂死挣扎,正要放弃之际,突然发现成功了,立即看看是哪里问题。最好发现,如果在页面中写一个onunload的函数,即使是空的,只要不是null,那么ff在history.back()之后就会执行onload。太好了!虽然是误打误撞,也不知道为什么,反正是解决了,于是修改如下:
接下来是多个提交按钮时设置默认提交按钮的问题。baidu了一下,发现用DefaultButton可以设置默认提交按钮。于是使用并查看代码,发现ms是用一个WebForm_FireDefaultButton这样的js来修改默认提交按钮的。又baidu一下,发现可以直接在客户端调用这个函数,先试一下,真的可以。于是修改“能定义默认提交按钮的TextBox”如下:
接下来做一下会员信息显示的页面吧,其实现在也没什么信息可显示的。
首先是“ 只能提交一次的按钮 ”,在ff中 history.back()后按钮仍然是disabled状态。这个问了很久都没有答案,于是自己试啊试,发现在ff中history.back(),页面不会执行onload,即停留在最后提交的状态,而ie会在history.back()后执行onload,但这是浏览器的问题,估计也没办法。垂死挣扎,正要放弃之际,突然发现成功了,立即看看是哪里问题。最好发现,如果在页面中写一个onunload的函数,即使是空的,只要不是null,那么ff在history.back()之后就会执行onload。太好了!虽然是误打误撞,也不知道为什么,反正是解决了,于是修改如下:
/// <summary>
/// 只能提交一次的按钮
/// </summary>
public class ButtonSubmitOnce : Button
{
private string _textonclick = "处理中,请稍后。。。";
private string _clientcheck;
protected override void Render(HtmlTextWriter writer)
{
StringBuilder temp = new StringBuilder();
temp.Append(this.OnClientClick);
if (!string.IsNullOrEmpty(_clientcheck)) temp.Append("if(!").Append(_clientcheck).Append(") return false;");
if (!string.IsNullOrEmpty(_textonclick)) temp.Append("this.value=\"").Append(_textonclick).Append("\";");
//this is for the ff
temp.Append("if(null==window.onunload) window.onunload = function(){};");
temp.Append("this.disabled = true;").Append(Page.GetPostBackEventReference(this));
this.OnClientClick = temp.ToString();
base.Render(writer);
}
public string TextOnClick
{
set { _textonclick = value; }
}
public string ClientCheck
{
set { _clientcheck = value; }
}
}
测试也通过,太好了,先解决了一个问题。/// 只能提交一次的按钮
/// </summary>
public class ButtonSubmitOnce : Button
{
private string _textonclick = "处理中,请稍后。。。";
private string _clientcheck;
protected override void Render(HtmlTextWriter writer)
{
StringBuilder temp = new StringBuilder();
temp.Append(this.OnClientClick);
if (!string.IsNullOrEmpty(_clientcheck)) temp.Append("if(!").Append(_clientcheck).Append(") return false;");
if (!string.IsNullOrEmpty(_textonclick)) temp.Append("this.value=\"").Append(_textonclick).Append("\";");
//this is for the ff
temp.Append("if(null==window.onunload) window.onunload = function(){};");
temp.Append("this.disabled = true;").Append(Page.GetPostBackEventReference(this));
this.OnClientClick = temp.ToString();
base.Render(writer);
}
public string TextOnClick
{
set { _textonclick = value; }
}
public string ClientCheck
{
set { _clientcheck = value; }
}
}
接下来是多个提交按钮时设置默认提交按钮的问题。baidu了一下,发现用DefaultButton可以设置默认提交按钮。于是使用并查看代码,发现ms是用一个WebForm_FireDefaultButton这样的js来修改默认提交按钮的。又baidu一下,发现可以直接在客户端调用这个函数,先试一下,真的可以。于是修改“能定义默认提交按钮的TextBox”如下:
/// <summary>
/// 能定义默认提交按钮的TextBox
/// </summary>
public class TextBoxSubmit : TextBox
{
private Button _buttonsubmit;
protected override void Render(HtmlTextWriter writer)
{
if (_buttonsubmit != null)
{
this.Attributes["onkeypress"] += "return WebForm_FireDefaultButton(event, '" + _buttonsubmit.ClientID + "');";
}
base.Render(writer);
}
public Button ButtonSubmit
{
set { _buttonsubmit = value; }
}
}
再测试,奇怪,怎么又不可以了。打开源码一看,没什么问题啊。对比一下刚才成功的代码,发现少了WebResource.axd 这个文件的调用。奇怪怎么刚才就有,现在就没了。在找一下原因,原来刚才我使用了DefaultButton,这样才会自动调用这个文件,但我是自己定义的,系统不知道我需要这个文件。于是到网上找一下怎么手动调用这个文件,但没找到,郁闷,只好设一个DefaultButton装一下样子啦,希望以后能找到方法。经过测试,通过!终于解决了两座大山。
/// 能定义默认提交按钮的TextBox
/// </summary>
public class TextBoxSubmit : TextBox
{
private Button _buttonsubmit;
protected override void Render(HtmlTextWriter writer)
{
if (_buttonsubmit != null)
{
this.Attributes["onkeypress"] += "return WebForm_FireDefaultButton(event, '" + _buttonsubmit.ClientID + "');";
}
base.Render(writer);
}
public Button ButtonSubmit
{
set { _buttonsubmit = value; }
}
}
接下来做一下会员信息显示的页面吧,其实现在也没什么信息可显示的。
再整理一下,明天继续吧。
本文转自博客园cloudgamer的博客,原文链接:我来做百科(第八天),如需转载请自行联系原博主。