Вопрос

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

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

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

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

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

Это было полезно?

Решение

Я использую эту функцию, адаптированную из 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;
}

Другие советы

Похоже, что исправление codesta.com, на которое ссылается harpo, больше не нужно, поскольку fix 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;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top