Asp.Net Formulário DefaultButton Erro no Firefox
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.
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