Firefox 中的 Asp.Net 表单 DefaultButton 错误
Posted
技术标签:
【中文标题】Firefox 中的 Asp.Net 表单 DefaultButton 错误【英文标题】:Asp.Net Form DefaultButton Error in Firefox 【发布时间】:2010-09-08 04:19:36 【问题描述】:.Net 为带有“DefaultButton”属性集的表单生成的代码包含糟糕的 javascript,它允许该功能在 IE 中工作,但不能在其他浏览器(特别是 Firefox)中工作。
点击回车键确实会在所有浏览器中提交表单,但是当它发生在
有关该错误的更多信息,read it here。
这可以在 Asp.Net 3.0+ 中修复,但仍然需要为 2.0 创建解决方法。
对于最简单的解决方法(看起来不像 hack =D 的 hack)有什么想法吗?上面链接中的解决方案让我有点害怕,因为它很容易产生意想不到的副作用。
【问题讨论】:
【参考方案1】:我使用这个改编自codesta的函数。 [编辑:同样的,我明白了,这让你害怕!哎呀。那帮不了你了。]
http://blog.codesta.com/codesta_weblog/2007/12/net-gotchas---p.html.
您可以通过用这样的 div 包围您的代码来使用它。您可以将表单子类化以自动包含它。我用的不多,所以没用。
(你的表格在这里)这是函数。
函数 FireDefaultButton(事件,目标) // srcElement 用于 IE var 元素 = event.target ||事件.srcElement; if (13 == event.keyCode && !(element && "textarea" == element.tagName.toLowerCase())) 变种默认按钮; defaultButton = document.getElementById(target); if (defaultButton && "undefined" != typeof defaultButton.click) defaultButton.click(); event.cancelBubble = true; 如果(事件.stopPropagation) event.stopPropagation(); 返回假; 返回真;【讨论】:
【参考方案2】:似乎不再需要 harpo 链接到的修复 codesta.com,因为修复 event.srcElement 在 ASP.NET 3.5 中未集成。然而,DefaultButton 的实现仍然存在一些问题,因为它在太多情况下会捕获 Enter 按键。例如:如果您使用 tab 激活了表单中的按钮,按 Enter 应该会单击该按钮而不是提交表单。
在您的 ASP.NET 网页底部包含以下 JavaScript 代码,以使 Enter 以应有的方式运行。
// Fixes ASP.NET's behavior of default button by testing for more controls
// than just textarea where the event should not be caugt by the DefaultButton
// action. This method has to override ASP.NET's WebForm_FireDefaultButton, so
// it has to included at the bottom of the page.
function WebForm_FireDefaultButton(event, target)
if (event.keyCode == 13)
var src = event.srcElement || event.target;
if (!(
src
&&
(
src.tagName.toLowerCase() == "textarea"
|| src.tagName.toLowerCase() == "a"
||
(
src.tagName.toLowerCase() == "input"
&&
(
src.getAttribute("type").toLowerCase() == "submit"
|| src.getAttribute("type").toLowerCase() == "button"
|| src.getAttribute("type").toLowerCase() == "reset"
)
)
|| src.tagName.toLowerCase() == "option"
|| src.tagName.toLowerCase() == "select"
)
))
var defaultButton;
if (__nonMSDOMBrowser)
defaultButton = document.getElementById(target);
else
defaultButton = document.all[target];
if (defaultButton && typeof (defaultButton.click) != "undefined")
defaultButton.click();
event.cancelBubble = true;
if (event.stopPropagation) event.stopPropagation();
return false;
return true;
【讨论】:
【参考方案3】:对于这个特定的问题,原因是因为 javascript 生成的 ASP.NET 2.0 有一些仅限 IE 的符号:event.srcElement is not available in FireFox(使用 event.target 代替):
function WebForm_FireDefaultButton(event, target)
if (!__defaultFired && event.keyCode == 13 && !(event.srcElement &&
(event.srcElement.tagName.toLowerCase() == "textarea")))
var defaultButton;
if (__nonMSDOMBrowser)
defaultButton = document.getElementById(target);
else
defaultButton = document.all[target];
if (defaultButton && typeof(defaultButton.click) !=
"undefined")
__defaultFired = true;
defaultButton.click();
event.cancelBubble = true;
if (event.stopPropagation) event.stopPropagation();
return false;
return true;
如果我们把前两行改成:
function WebForm_FireDefaultButton(event, target)
var element = event.target || event.srcElement;
if (!__defaultFired && event.keyCode == 13 && !(element &&
(element.tagName.toLowerCase() == "textarea")))
把修改后的代码放到一个文件里然后做
protected void Page_Load(object sender, EventArgs e)
ClientScript.RegisterClientScriptInclude("js1", "JScript.js");
那么它将适用于 IE 和 FireFox。
来源:
http://www.velocityreviews.com/forums/t367383-formdefaultbutton-behaves-incorrectly.html
【讨论】:
以上是关于Firefox 中的 Asp.Net 表单 DefaultButton 错误的主要内容,如果未能解决你的问题,请参考以下文章
回发在 Firefox 中无法用于 asp.net(C#) 页面
ASP.NET MVC + IIS7 + FireFox:URL 中的斜杠
Internet Explorer 中的 asp.net 表单身份验证问题
将 asp.net WebForms 应用程序中的组合表单/Windows 身份验证迁移到 asp.net MVC 应用程序