Javascript stop execution abort or exit

if(a.value==1 && b.value==2) { try{callFunc() }catch(e) {} } frm.submit(); 

Dentro de la function callFunc() , ¿qué tengo que escribir para que la ejecución se detenga por completo? No debería ejecutar frm.submit();

 function callFunc() { //stop execution here -- ensure it won't execute fm.submit() } 

Mejor uno es

 function Abort() { throw new Error('This is not an error. This is just to abort javascript'); } 

que de cualquier lugar llamar esto

 try { for(var i=0;i<10;i++) { if(i==5)Abort(); } } catch(e){} 

Para ti

 function callFunc() { //stop execution here Abort(); } //code from where you are going to call try { if(a.value==1 && b.value==2) { callFunc() } frm.submit(); } catch(e) {} 

Como has descubierto, abortar JavaScript casi siempre conlleva excepciones. Si realmente no puedes cambiar el envoltorio, entonces tendrás que recurrir a algo un poco más extremo. Una (mal) manera de matar el script es convencer al browser de que tarda demasiado, ejecutando un bucle infinito:

 function callFunc() { //stop execution here var n = 1; while (n) { n += 1; } } 

Los browseres modernos permitirán al usuario matar el script después de un time. De acuerdo, hará que su sitio parezca quebrado, pero eso debería darle el apalancamiento que necesita para get una mejor API en su lugar.

Si el bucle ocupado es demasiado extremo, podría replace la adición simple con un sueño basado en un complemento, o tal vez una request de networking síncrona que lleva un time extremadamente largo, envuelto en su propia networking de security try / catch.

Entiendo lo que estás tratando de hacer. No quiere matar al intérprete de Javascript, solo quiere evitar que continúe el envío del formulario.

HTML

 <form id="myForm"> … </form> 

Javascript

 // Setup… var frm = document.getElementById('myForm'), a = { value: 1 }, b = { value: 2 }; // Can change this code var callFunc = function() { // Throwing will do nothing here, since // exceptions are being caught in a try/catch // Instead, let's overwrite the submit handler with one that // will cancel the form submission, then restre the old handler var oldSubmitHandler = frm.submit; var killHandler = function(e) { // Prevents the submission e.preventDefault(); // Restores the old handler frm.submit = oldSubmitHandler; }; frm.submit = killHandler; }; // Can't change any of this code if(a.value==1 && b.value==2) { try { callFunc() } catch(e) { } } // Want to stop this from happening frm.submit(); 

Véalo en acción: http://jsfiddle.net/3A7xC/

Mejor forma es esta:

 if(a.value==1 && b.value==2) { try{ callFunc(); frm.submit(); } catch(e) { // stop execution } } 

Si se lanza una exception en la function callFunc, frm.submit(); línea no se ejecutará. En cambio, saltará a la cláusula de captura

Muchas respuestas, una más por diversión.

Puede poner el código en una function, hacer que el bloque try arroje un error y luego regresar de la cláusula catch:

 function foo() { var a = {value:1}; var b = {value:2}; if(a.value==1 && b.value==2) { try { callFunc(); } catch(e) { alert(e.message); return; } } alert('error didn\'t stop me!'); } function callFunc() { throw new Error('This is an error.'); } 

De lo contrario, puede establecer un indicador en el bloque catch y probarlo inmediatamente después antes de seguir adelante. O tome una de las opciones de la otra respuesta.

Entonces, ¿el interior de callFunc es lo único que puedes cambiar? Qué tal esto:

 callFunc(){ frm.submit(function() { alert('this should not submit'); return false; }); } 

Puede cancelar la ejecución de javascript con throw :

 if(a.value==1 && b.value==2){ try{callFunc() }catch(e) {} } frm.submit(); function callFunc() { throw "stop execution"; }