it-swarm.dev

Ignorar erros de sintaxe do javascript em uma página e continuar executando o script

Eu desenvolvo plugins para WordPress. Ele usa alguns jquery no lado do usuário (temas) como um plugin jquery. O problema é que, quando há um erro de javascript com outros plugins feitos por outros autores, javascript do meu plugin não consegue executar.

E o pior é que as pessoas consideram que existe uma falha séria no meu plugin, mesmo que ele funcione 100% bem com instruções condicionais de tratamento de erros. Mas, na verdade, isso se deve a alguns outros erros de sintaxe javascript de outros autores de plug-in/tema WP.

Existe uma maneira de continuar a executar o meu plugin JS ignorando outros erros JS. Ou posso ter sugestões para lidar com esse problema?

enter image description here

47
Aakash Chakravarthy

Experimentar :

window.onerror = function(){
   return true;
}

Isto é, se você puder incluir isso antes que o script seja executado.

22
Cosmin

Você deve corrigir o erro de JavaScript antigo porque pode criar muitos problemas, não para agora, mas para a próxima vez.

Coloque seu arquivo/código JavaScript no topo (antes de JS ter erro), e chame antes do JavaScript afetado por outro código JavaScript.

Caso você precise manipular exceção JavaScript em tempo de execução, a melhor opção é

try { /* run js code */ } 
    catch (error){ /* resolve the issue or bug */ }
8
Krishna Kumar

Você deve conseguir engolir qualquer erro usando o evento error:

$(window).error(function(e){
    e.preventDefault();
});

Eu nunca tentei isso, mas deveria funcionar em teoria.

Deve-se notar que isso provavelmente não é uma ótima solução para o seu problema. Pode ser que o seu plugin esteja interferindo em outros plugins. É claro que é possível que os erros não sejam culpa sua, mas em geral (com plugins lançados publicamente) não são o caso.

4
Shmiddty

Eu encontrei o mesmo problema: há um monte de plugins por aí que fazem muitas suposições e causam erros de JavaScript na sua página, mesmo quando você está sendo um bom cidadão; esses erros não têm nada a ver com o seu plugin.

Não faz sentido tentar lidar com erros em outros plugins - IMO, é melhor ser auto-contido, mas resiliente aos seus erros.

No meu caso, os erros estavam interrompendo o evento pronto do jquery DOM, e meu código de inicialização do JavaScript não estava sendo executado. A forma exata do erro não é importante - a solução é apenas disparar em vários eventos.

A solução para mim era ter fallbacks além de contar com o evento pronto do DOM do jQuery:

  1. Eu envolvi qualquer código que eu quisesse disparar no evento DOM pronto para sua própria função - por exemplo, my_hardened_init_action ();
  2. Eu adicionei uma função, my_hardened_init (), que só é executada uma vez. Ele chama my_hardened_init_action () na primeira vez em que é chamado e não faz nada em chamadas subseqüentes.
  3. Eu adicionei vários métodos para chamar my_hardened_init () no rodapé do WordPress. No meu caso, eu só precisava de dois. Primeiro, tentando o init DOM do jQuery usual, mas voltando para um simples setTimeout (). Portanto, se o init do jQuery DOM nunca for acionado devido a JavaScript quebrado, o tempo limite será acionado logo após o término do carregamento da página.

Você pode adicionar vários outros fallbacks - até mesmo adicionar o código ao cabeçalho, se necessário. Como my_hardened_init () só é executado uma vez, você pode tentar quantas vezes quiser ativá-lo.

Isso funcionou em um monte de sites de clientes com uma variedade de outros plugins quebrados.

Espero que isto ajude.

4
Jhong
2
ScottE

Se você está página em execução. Usar:

$(window).error(function(e){
        e.preventDefault();
});  // IGNORE ALL ERROR JQUERY!

ou use:

window.onerror = function(){
   return true;
}  // IGNORE ALL ERROR JAVASCRIPT!
1
Rogerio de Moraes
<script>
var _z = console;
Object.defineProperty(window, 'console', {
    get: function(){
        if (_z._commandLineAPI) {
         return true;   
        }
        return _z;
    },
    set: function(val) {
        _z = val;
    }
});
</script>
1
Rogerio de Moraes

Coloque sua chamada para o plugin em 

try{
  ......
}
catch(e){

}
0
Rahul

Talvez você possa tentar colocar seu js em um objeto html, para que ele seja executado em uma página separada. Isso provavelmente não ajudará muito se o js na página principal não correr para interagir com o objeto. Apenas algo para brincar.

0
Ian Wizard

Isso é trabalhado para mim:

try{
    //your code
}
catch(error)
{
    return true;
}
0
Enginerd Sunio

Uma instrução try catch regular não funciona para esses tipos de erros. 

Soluções possíveis:

Use inline-css para flutuar a barra para a esquerda em vez de jQuery (não tenho certeza do que a função completa do seu plugin é, mas se apenas flutuar a barra para a esquerda, por que não usar apenas css?)

Tem um iframe invisível que tenta executar algum código na página pai. se falhar do que alertar o usuário (de dentro desse iframe) que não foi sua culpa :)

0
codelove