Pergunta

A .Líquido gerado código de um formulário com o "DefaultButton" conjunto de atributos contém pobres javascript que permite a funcionalidade para funcionar no IE, mas não em outros navegadores (Firefox specifcially).

Bater a tecla enter não enviar o formulário com todos os navegadores, mas o Firefox não é possível desconsiderar a tecla quando ele acontece dentro de uma <textarea> o controle.O resultado é um texto de várias linhas de controle de área que não pode ser de várias linhas no Firefox, como a tecla enter submete o formulário em vez de criar uma nova linha.

Para obter mais informações sobre o erro, leia aqui.

Isso pode ser corrigido em Asp.Net 3.0+, mas uma solução ainda tem de ser criado para 2.0.

Qualquer idéias para a solução mais leve (um hack que não se parece com um hack =D)?A solução no link acima assusta-me um pouco como ele poderia facilmente ter indesejados efeitos colaterais.

Foi útil?

Solução

Eu uso essa função adaptado de codesta.[Editar:muito mesmo, eu vejo, que o assusta!Oops.Não posso ajudá-lo em seguida.]

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

Você utilize-o ao redor do seu código com uma div assim.Você poderia subclasse Formulário para incluir isso automaticamente.Eu não uso muito, então eu não.

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

Eis a função.

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

Outras dicas

Parece que a correcção codesta.com que harpo link não é mais necessário, uma vez que a correção do evento.srcElement não é do integrade em ASP.NET 3.5.A implementação de DefaultButton, no entanto, ainda tem alguns problemas, porque ele está pegando a tecla Enter pressione em muitos casos.Por exemplo:Se você tiver ativado um botão no formulário usando a guia, pressionar Enter, deve clicar no botão e não submeter o formulário.

Incluir o código JavaScript a seguir, na parte inferior do seu ASP.NET página da web para fazer Entrar comportar-se da maneira que deveria.

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

Para este problema específico, a razão é porque o javascript gerado pelo ASP.NET 2.0 tem algumas ou seja, só a notação:do evento.srcElement não está disponível em O FireFox (uso do evento.destino em vez):

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

Se mudarmos as 2 primeiras linhas:

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

Coloque o código alterado em um arquivo e, em seguida, fazer

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

Em seguida, ele vai trabalhar tanto para o IE e o FireFox.

Fonte:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top