Ошибка формы DefaultPutton в Asp.Net в Firefox - PullRequest
5 голосов
/ 08 сентября 2008

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

Нажатие клавиши ввода отправляет форму во всех браузерах, но Firefox не может игнорировать нажатие клавиши, когда это происходит внутри элемента управления

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

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

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

Ответы [ 3 ]

4 голосов
/ 08 сентября 2008

Я использую эту функцию, адаптированную из 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;
}
3 голосов
/ 21 сентября 2009

Кажется, что исправление codesta.com, на которое ссылается гарпо, больше не нужно, поскольку исправление 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;
}
1 голос
/ 08 сентября 2008

Для этой конкретной проблемы причина в том, что 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...