Ошибка Asp.Net Form DefaultButton в Firefox

Сгенерированный .Net код для формы с набором атрибутов "DefaultButton" содержит плохой javascript, который позволяет функциям работать в IE, но не в других браузерах (в частности, в Firefox).

Нажатие клавиши ввода отправляет форму во всех браузерах, но Firefox не может игнорировать нажатие клавиши, когда оно происходит внутри элемента управления ‹textarea›. В результате получается многострочная текстовая область, которая не может быть многострочной в Firefox, поскольку клавиша ввода отправляет форму вместо создания новой строки.

Дополнительную информацию об ошибке можно найти здесь.

Это может быть исправлено в Asp.Net 3.0+, но для версии 2.0 необходимо создать обходной путь.

Любые идеи для самого легкого обходного пути (хак, который не похож на хак = D)? Решение по приведенной выше ссылке немного пугает меня, поскольку оно легко может иметь непреднамеренные побочные эффекты.


person frank hadder    schedule 08.09.2008    source источник


Ответы (3)


Я использую эту функцию, адаптированную из codesta. [Редактировать: тот самый, я вижу, который тебя пугает! Упс. Тогда ничем не могу вам помочь.]

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

Вы используете его, окружая свой код таким div. Вы можете создать подкласс формы, чтобы включить это автоматически. Я не так часто им пользуюсь, поэтому не стал.

<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;
}
person harpo    schedule 08.09.2008

Кажется, что исправление codesta.com, на которое ссылается harpo, больше не требуется, поскольку исправление event.srcElement не интегрировано в ASP.NET 3.5. Однако реализация DefaultButton по-прежнему имеет некоторые проблемы, потому что она слишком часто перехватывает нажатие клавиши Enter. Например: если вы активировали кнопку в форме с помощью вкладки, нажатие Enter должно нажать на кнопку, а не отправить форму.

Включите следующий код JavaScript в нижнюю часть веб-страницы ASP.NET, чтобы 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;
}
person Jan Aagaard    schedule 21.09.2009

Для этой конкретной проблемы причина заключается в том, что javascript, сгенерированный ASP.NET 2.0, имеет некоторую нотацию только для IE: event.srcElement недоступен в 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;
}

Если мы изменим первые 2 строки на:

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

person Espo    schedule 08.09.2008