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 中的斜杠

asp.net 中的 Paypal 表单标签问题

Internet Explorer 中的 asp.net 表单身份验证问题

将 asp.net WebForms 应用程序中的组合表单/Windows 身份验证迁移到 asp.net MVC 应用程序

Web 表单中的 ASP.NET Web Api