为什么没有调用第二个javascript函数?

时间:2011-11-09 18:09:13

标签: javascript jquery html

我试图在单个事件上调用两个javascript函数。这是我的函数调用代码。

<input type="text" name="cbh" id="c8"  value="0"  onkeypress="return isNumberKey(event);calculate();" />

第一个仅允许数字的功能,它具有以下工作流程。

    function isNumberKey(evt)
{
    var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57))
    return false;



    return true;
}

出于调试目的,sencond函数只有一行。

function calculate()
{
    alert("ok");

}

现在,第一个函数被称为100%ok。但第二个功能似乎没有被调用。有什么建议吗?

编辑:我想在执行第一个函数后调用第二个函数。

7 个答案:

答案 0 :(得分:4)

因为您在第一次通话后返回。

如果你想跳过第二个,如果第一个返回false:

onkeypress="if (isNumberKey(event)) { calculate(); return true; } else { return false; }"

如果两者都要返回状态,则第二个只应在第一个返回true时运行:

onkeypress="return isNumberKey(event) && calculate();"

答案 1 :(得分:2)

在调用第一个函数后,您将立即从onkeypress处理程序返回:

onkeypress="return isNumberKey(event);calculate();"

在javascript中,忽略return语句后面的所有内容。所以你想要的是有一个函数,首先检测参数是否是一个数字和计算:

function handlePress(evt) {
    var result = isNumberKey(evt);
    calculate();
    return result;
}

然后:

onkeypress="return handlePress(event);"

你可以直接在HTML中编写这个逻辑而不引入第三个函数,但恕我直言混合HTML和这样的javascript是不好的。我甚至会不引人注意地附加这个onkeypress事件,而不是在输入上使用onkeypress属性:

window.onload = function() {
    var c8 = document.getElementById('c8');
    if (c8 != null) {
        c8.onkeypress = function(evt) {
            var result = isNumberKey(evt);
            calculate();
            return result;
        };
    }
};

并在html中:

<input type="text" name="cbh" id="c8" value="0" />

现在我们在javascript和标记之间有明确的分离。这样做的另一个好处是减少了标记大小,并且由于缓存了javascript文件等静态资源,因此限制了带宽使用并加快了网站的速度。

答案 2 :(得分:1)

onkeypress="var r = isNumberKey(event);calculate();return r;"

答案 3 :(得分:1)

在事件返回后调用第二个函数。口译员永远无法联系到它。改为

var isNumber = isNumberKey(evt);calculate(); return isNumber;

修复了这个特定问题,但是你会遇到跨浏览器问题和突兀的代码来处理

答案 4 :(得分:0)

return将结束您所使用的任何功能(包括onclick属性生成的匿名功能。)

您可能需要以下内容:

var value = isNumberKey(event);
calculate();
return value;

onclick="var value = isNumberKey(event);calculate();return value;"

答案 5 :(得分:0)

由于你有一个return语句,所以不会达到第二个语句。

最好有一个处理函数然后调度到更多函数,例如

onkeypress事件= myonkeypress

function myonkeypress() {
  if (isNumberKey()) {
    calculate();
  }
}

答案 6 :(得分:-1)

我建议将alert()调用放在您尝试调试的函数中。

由于它仅用于调试,因此一旦完成调试,它就会减少清理代码:您只需删除警报语句,而不必担心其他任何问题(即从中删除额外的函数调用)你的onkeypress活动。

所以你可以摆脱你的calculate()函数,只需更新你的isNumberKey函数:

function isNumberKey(evt)
{
    var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57))
    {
         alert("isNumberKey FALSE");
         return false;
    }

    alert("isNumberKey TRUE");
    return true;
}