Asp.Net Form DefaultButton Error in Firefox

. The generated .NET code for the form with the "DefaultButton" attribute set contains bad javascript that allows functions to work in IE, but not in other browsers (Firefox definitely).

If you press the enter key, it will send the form with all browsers, but Firefox cannot ignore the keystroke when this happens inside the <textarea> control. The result is a multi-line text area control that cannot be multi-line in Firefox because the input key sends the form instead of creating a new line.

For more information about the error, read here .

This can be fixed in Asp.Net 3.0+, but a workaround must still be created for version 2.0.

Any ideas for the easiest workaround (hack that doesn't look like hack = D)? The solution in the link above scares me a bit, as it can easily have unintended side effects.

+5
source share
3 answers

I use this feature adapted from codesta. [Edit: the one I see, it scares you! Unfortunately. Then you cannot help.]

http://blog.codesta.com/codesta_weblog/2007/12/net-gotchas---p.html .

You use it by surrounding your code with a div as such. You can subclass a form to include it automatically. I do not use it so much, so I did not.

<div onkeypress="return FireDefaultButton(event, '<%= aspButtonID.ClientID %>')">
    (your form goes here)
</div>

.

function FireDefaultButton(event, target) 
{
    // srcElement is for IE
    var element = event.target || event.srcElement;

    if (13 == event.keyCode && !(element && "textarea" == element.tagName.toLowerCase())) 
    {
        var defaultButton;
        defaultButton = document.getElementById(target);

        if (defaultButton && "undefined" != typeof defaultButton.click) 
        {
            defaultButton.click();
            event.cancelBubble = true;
            if (event.stopPropagation) 
                event.stopPropagation();
            return false;
        }
    }
    return true;
}
+4

, codesta.com, harpo, , fix event.srcElement ASP.NET 3.5. , DefaultButton , Enter . : , Enter .

JavaScript - ASP.NET, Enter , .

// Fixes ASP.NET 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 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

For this particular problem, the reason is that the javascript generated by ASP.NET 2.0 has only IE notation: event.srcElement is not available in FireFox (use event.target instead):

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;
}

If we change the first 2 lines to:

function WebForm_FireDefaultButton(event, target) {
var element = event.target || event.srcElement;
if (!__defaultFired && event.keyCode == 13 && !(element && 
(element.tagName.toLowerCase() == "textarea"))) {

Put the modified code in a file, and then execute

protected void Page_Load(object sender, EventArgs e)
{
ClientScript.RegisterClientScriptInclude("js1", "JScript.js");
}

Then it will work for both IE and FireFox.

Source:

http://www.velocityreviews.com/forums/t367383-formdefaultbutton-behaves-incorrectly.html

+1
source

All Articles