Pergunta

A seguir, o meu código JavaScript (Mootools):

$('orderNowForm').addEvent('submit', function (event) {
    event.preventDefault();
    allFilled = false;
    $$(".required").each(function (inp) {
        if (inp.getValue() != '') {
            allFilled = true;
        }
    });

    if (!allFilled) {
        $$(".errormsg").setStyle('display', '');
        return;
    } else {
        $$('.defaultText').each(function (input) {
            if (input.getValue() == input.getAttribute('title')) {
                input.setAttribute('value', '');
            }
        });
    }

    this.send({
        onSuccess: function () {
            $('page_1_table').setStyle('display', 'none');
            $('page_2_table').setStyle('display', 'none');
            $('page_3_table').setStyle('display', '');
        }
    });
});

Em todos os navegadores, exceto o IE, isso funciona bem. Mas no IE, isso causa um erro. Eu tenho o IE8, então, enquanto uso seu depurador JavaScript, descobri que o event objeto não tem um preventDefault Método que está causando o erro e, portanto, o formulário está sendo enviado. O método é suportado no caso do Firefox (que descobri usando o Firebug).

Qualquer ajuda?

Foi útil?

Solução

No IE, você pode usar

event.returnValue = false;

para alcançar o mesmo resultado.

E para não receber um erro, você pode testar a existência do PreventDefault:

if(event.preventDefault) event.preventDefault();

Você pode combinar os dois com:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);

Outras dicas

Se você vincular o evento através da função AddEvent do Mootols, seu manipulador de eventos receberá um evento fixo (aumentado) aprovado como o parâmetro. Ele sempre conterá o método DevideDefault ().

Experimente esse violino para ver a diferença na ligação do evento.http://jsfiddle.net/pfqry/8/

// preventDefault always works
$("mootoolsbutton").addEvent('click', function(event) {
 alert(typeof(event.preventDefault));
});

// preventDefault missing in IE
<button
  id="htmlbutton"
  onclick="alert(typeof(event.preventDefault));">
  button</button>

Para todos jQuery Usuários por aí você pode corrigir um evento quando necessário. Digamos que você usou html onclick = ".." e obtenha um evento específico do IE que não possui o PreventDefault (), basta usar esse código para obtê -lo.

e = $.event.fix(e);

Depois disso e.preventDefault (); funciona bem.

Sei que este é um post bastante antigo, mas passei algum tempo tentando fazer esse trabalho no IE8.

Parece que existem algumas diferenças nas versões do IE8 porque as soluções postadas aqui e em outros tópicos não funcionaram para mim.

Digamos que temos este código:

$('a').on('click', function(event) {
    event.preventDefault ? event.preventDefault() : event.returnValue = false;
});

No meu IE8 preventDefault() O método existe por causa do jQuery, mas não está funcionando (provavelmente por causa do ponto abaixo), então isso falhará.

Mesmo se eu definir returnValue propriedade diretamente para false:

$('a').on('click', function(event) {
    event.returnValue = false;
    event.preventDefault();
});

Isso também não funcionará, porque eu apenas defino algumas propriedades do JQuery Custom Event Object.

A única solução que funciona para mim é definir a propriedade returnValue do variável global event assim:

$('a').on('click', function(event) {
    if (window.event) {
        window.event.returnValue = false;
    }
    event.preventDefault();
});

Só para facilitar a qual alguém que tentará convencer o IE8 a trabalhar. Espero que o IE8 morra terrivelmente em morte dolorosa em breve.

ATUALIZAR:

Como sv_in ressalta, você pode usar event.originalEvent Para obter objeto de evento original e definir returnValue propriedade no original. Mas ainda não testei no meu IE8.

MooTools redefine prevenirdefault nos objetos de eventos. Portanto, seu código deve funcionar bem em todos os navegadores. Caso contrário, há um problema com o suporte do IE8 no MooTools.

Você testou seu código no IE6 e/ou IE7?

O médico diz

Todo evento adicionado ao AddEvent obtém o método MooTools automaticamente, sem a necessidade de institui -lo manualmente.

Mas, caso não, você pode querer tentar

new Event(event).preventDefault();
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

Testado no IE 9 e Chrome.

Para desativar uma chave de teclado após o IE9, use: e.preventDefault();

Para desativar um chave de teclado regular Sob IE7/8, use: e.returnValue = false; ou return false;

Se você tentar desativar um Atalho do teclado (com Ctrl, como Ctrl+F) você precisa adicionar essas linhas:

try {
    e.keyCode = 0;
}catch (e) {}

Aqui está um exemplo completo apenas para o IE7/8:

document.attachEvent("onkeydown", function () {
    var e = window.event;

    //Ctrl+F or F3
    if (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {
        //Prevent for Ctrl+...
        try {
            e.keyCode = 0;
        }catch (e) {}

        //prevent default (could also use e.returnValue = false;)
        return false;
    }
});

Referência: Como desativar os atalhos do teclado no IE7 / IE8

Aqui está uma função que tenho testado com o JQuery 1.3.2 e a construção noturna de 09-18-2009. Deixe -me saber seus resultados com isso. Tudo executa bem nessa extremidade no Safari, FF, Opera no OSX. É exclusivamente para corrigir um bug problemático do IE8 e pode ter resultados não intencionais:

function ie8SafePreventEvent(e) {
    if (e.preventDefault) {
        e.preventDefault()
    } else {
        e.stop()
    };

    e.returnValue = false;
    e.stopPropagation();
}

Uso:

$('a').click(function (e) {
    // Execute code here
    ie8SafePreventEvent(e);
    return false;
})

preventDefault é um padrão generalizado; Usar um adhoc toda vez que você deseja estar em conformidade com as versões antigas do IE é complicado, melhor usar um poli -preenchimento:

if (typeof Event.prototype.preventDefault === 'undefined') {
    Event.prototype.preventDefault = function (e, callback) {
        this.returnValue = false;
    };
}

Isso modificará o protótipo do evento e adicionará essa função, um ótimo recurso do JavaScript/DOM em geral. Agora você pode usar e.preventDefault sem nenhum problema.

return false No seu ouvinte, deve funcionar em todos os navegadores.

$('orderNowForm').addEvent('submit', function () {
    // your code
    return false;
}

FWIW, caso alguém revise essa pergunta posteriormente, você também pode verificar o que está entregando à sua função OnkeyPress Handler.

Eu entrei nesse erro quando passei por engano no OnKeyPress (isto) em vez do OnKeyPress (evento).

Apenas outra coisa para verificar.

Fui ajudado por um método com uma verificação de função. Este método funciona no IE8

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top