测试值是否为函数

Gle*_*rry 85 javascript typeof onsubmit

我需要测试一个表单的值是否onsubmit是一个函数.格式通常是onsubmit="return valid();".有没有办法判断这是否是一个函数,如果它是可调用的?使用typeof只返回它是一个字符串,这对我没有多大帮助.

编辑:当然,我明白"返回有效();" 是一个字符串.我把replace它归结为"valid();",甚至是"valid()".我想知道其中任何一个是否是一个功能.

编辑:这里有一些代码,可能有助于解释我的问题:

$("a.button").parents("form").submit(function() {
    var submit_function = $("a.button").parents("form").attr("onsubmit");
    if ( submit_function && typeof( submit_function.replace(/return /,"") ) == 'function' ) {
        return eval(submit_function.replace(/return /,""));
    } else {
        alert("onSubmit is not a function.\n\nIs the script included?"); return false;
    }
} );
Run Code Online (Sandbox Code Playgroud)

编辑2:这是新代码.似乎我仍然需要使用eval,因为调用form.submit()不会触发现有的onsubmits.

var formObj = $("a.button").parents("form");
formObj.submit(function() {
    if ( formObj[0].onsubmit && typeof( formObj.onsubmit ) == 'function' ) {
        return eval(formObj.attr("onsubmit").replace(/return /,""));
    } else {
        alert("onSubmit is not a function.\n\nIs the script included?");
        return false;
    }
} );
Run Code Online (Sandbox Code Playgroud)

关于如何更好地做到这一点的建议?

Gra*_*ner 80

我正在用一个锚链接替换一个提交按钮.因为调用form.submit()不会激活onsubmit,我会找到它,并自己eval().但是我想在eval()之前检查函数是否存在. - gms8994

<script type="text/javascript">
function onsubmitHandler() {
    alert('running onsubmit handler');
    return true;
}
function testOnsubmitAndSubmit(f) {
    if (typeof f.onsubmit === 'function') {
        // onsubmit is executable, test the return value
        if (f.onsubmit()) {
            // onsubmit returns true, submit the form
            f.submit();
        }
    }
}
</script>

<form name="theForm" onsubmit="return onsubmitHandler();">
<a href="#" onclick="
    testOnsubmitAndSubmit(document.forms['theForm']);
    return false;
"></a>
</form>
Run Code Online (Sandbox Code Playgroud)

编辑:函数testOnsubmitAndSubmit中缺少参数f

无论您是分配onsubmitHTML属性还是在JavaScript中分配它,上述内容都应该有效:

document.forms['theForm'].onsubmit = onsubmitHandler;
Run Code Online (Sandbox Code Playgroud)


art*_*emb 55

尝试

if (this.onsubmit instanceof Function) {
    // do stuff;
}
Run Code Online (Sandbox Code Playgroud)

  • 那只是一个样本.您可以将其更改为button.onsubmit instanceof Function (7认同)
  • 那"这个"很危险.该代码应该驻留在哪里? (5认同)

Pab*_*era 12

您可以简单地使用typeof运算符和三元运算符:

onsubmit="return typeof valid =='function' ? valid() : true;"
Run Code Online (Sandbox Code Playgroud)

如果它是一个函数,我们调用它并返回它的返回值,否则只返回 true

编辑:

我不太确定你真正想做什么,但我会试着解释可能会发生什么.

当您onsubmit在html中声明代码时,它会变成一个函数,因此可以从JavaScript"world"调用它.这意味着这两种方法是等价的:

HTML: <form onsubmit="return valid();" />
JavaScript: myForm.onsubmit = function() { return valid(); };
Run Code Online (Sandbox Code Playgroud)

这两个函数都是函数,都可以调用.您可以使用typeof运算符测试任何那些应该得到相同结果的运算符:"function".

现在,如果您通过JavaScript将字符串分配给"onsubmit"属性,它将保持为字符串,因此不可调用.请注意,如果您typeof对它应用运算符,您将获得"string"而不是"function".

我希望这可以澄清一些事情.然后,如果你想知道这样的属性(或者问题的任何标识符)是否是一个函数和可调用的,那么typeof运算符应该这样做.虽然我不确定它是否可以跨多个帧正常工作.

干杯


Gre*_*reg 5

你使用的是什么浏览器?

alert(typeof document.getElementById('myform').onsubmit);
Run Code Online (Sandbox Code Playgroud)

function在IE7和FireFox中给了我" ".