if(a.value==1 && b.value==2)
{
try{callFunc() }catch(e) {}
}
frm.submit();
在function callFunc()
内,我需要写什么才能完全停止执行?
它不应该执行frm.submit();
function callFunc()
{
//stop execution here -- ensure it won't execute fm.submit()
}
答案 0 :(得分:3)
更好的是
function Abort()
{
throw new Error('This is not an error. This is just to abort javascript');
}
比从任何地方调用
try
{
for(var i=0;i<10;i++)
{
if(i==5)Abort();
}
} catch(e){}
为你
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) {}
答案 1 :(得分:1)
更好的方法是这样:
if(a.value==1 && b.value==2)
{
try{
callFunc();
frm.submit();
}
catch(e) {
// stop execution
}
}
如果函数callFunc中抛出异常,则不会执行frm.submit();
行。相反,它将跳到catch子句
答案 2 :(得分:1)
正如您所发现的,中止JavaScript几乎总是涉及异常。如果你真的无法改变包装器,那么你可能不得不诉诸一些更极端的东西。杀死脚本的一种(恶意)方法是通过运行无限循环来说服浏览器花费太长时间:
function callFunc()
{
//stop execution here
var n = 1;
while (n) {
n += 1;
}
}
现代浏览器会让用户在一段时间后终止脚本。当然,它会使您的网站看起来破碎,但这应该为您提供获得更好的API所需的杠杆。
如果繁忙循环过于极端,您可以使用基于插件的睡眠替换简单添加,或者使用包含在其自己的try / catch安全网中的非常长时间的同步网络请求。
答案 3 :(得分:1)
我明白你要做什么。你不想杀死Javascript解释器,你只是想阻止表单提交继续进行。
<form id="myForm">
…
</form>
// 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 restore 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();
查看实际操作:http://jsfiddle.net/3A7xC/
答案 4 :(得分:0)
很多答案,还有一个很有趣。
你可以把代码放在一个函数中,让try块抛出一个错误,然后从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.');
}
否则,您可以在catch块中设置一个标志,然后立即对其进行测试,然后再继续操作。或者采取其他答案的选项之一。
答案 5 :(得分:0)
所以callFunc
的内部是唯一可以改变的东西?
怎么样:
callFunc(){
frm.submit(function() {
alert('this should not submit');
return false;
});
}
答案 6 :(得分:0)
要终止执行JS脚本,请使用:
system.stop()
答案 7 :(得分:-1)
您可以使用throw
if(a.value==1 && b.value==2){
try{callFunc() }catch(e) {}
}
frm.submit();
function callFunc() {
throw "stop execution";
}