Javascript 测试值是否为函数

Javascript 测试值是否为函数,javascript,typeof,onsubmit,Javascript,Typeof,Onsubmit,我需要测试表单的onsubmit的值是否是函数。格式通常为onsubmit=“return valid();”。有没有办法判断这是否是一个函数,是否可以调用?使用typeof只会返回一个字符串,这对我没有多大帮助 编辑:当然,我知道“return valid();”是一个字符串。我已将其替换为“valid();”,甚至是“valid()”。我想知道这两个函数中是否有一个是函数 编辑:以下代码可能有助于解释我的问题: $("a.button").parents("form").submit(fun

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

编辑:当然,我知道“return valid();”是一个字符串。我已将其替换为“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;
    }
} );
编辑2:这是新代码。似乎我仍然必须使用eval,因为调用form.submit()不会激发现有的onsubmit

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;
    }
} );

关于如何做得更好的建议?

像这样的简单检查会让您知道它是否存在/定义:

if (this.onsubmit)
{
  // do stuff;
}

确保在实际函数上调用typeof,而不是字符串文字:

function x() { 
    console.log("hi"); 
}

typeof "x"; // returns "string"

typeof x; // returns "function"

你用的是什么浏览器

alert(typeof document.getElementById('myform').onsubmit);
这给了我IE7和FireFox中的“
功能”

您可以尝试修改以满足您的需要:

 function isFunction() {
   var functionName = window.prompt('Function name: ');
   var isDefined = eval('(typeof ' + functionName + '==\'function\');');
   if (isDefined)
     eval(functionName + '();');
   else
     alert('Function ' + functionName + ' does not exist');
 }
 function anotherFunction() {
   alert('message from another function.');
 }
试一试

嗯,
“return valid();”
是一个字符串,所以这是正确的

如果要检查它是否附加了函数,可以尝试以下操作:

formId.onsubmit = function (){ /* */ }

if(typeof formId.onsubmit == "function"){
  alert("it's a function!");
}

如果它是一个字符串,你可以假设/希望它总是这样

return SomeFunction(arguments);
解析函数名,然后查看该函数是否使用

if (window[functionName]) { 
    // do stuff
}

您可以简单地将
typeof
运算符与三元运算符一起使用,简称为:

onsubmit="return typeof valid =='function' ? valid() : true;"
如果它是一个函数,我们调用它并返回它的返回值,否则只返回
true

编辑:

我不太确定你到底想做什么,但我会尽力解释可能发生的事情

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

HTML: <form onsubmit="return valid();" />
JavaScript: myForm.onsubmit = function() { return valid(); };
HTML:
JavaScript:myForm.onsubmit=function(){return valid();};
这两个函数都是函数,都是可调用的。您可以使用
typeof
运算符测试其中任何一个,该运算符应显示相同的结果:
“function”

现在,如果通过JavaScript为“onsubmit”属性分配一个字符串,它将保持为字符串,因此不可调用。请注意,如果对其应用
typeof
运算符,将得到
字符串
,而不是
函数

我希望这可以澄清一些事情。然后,如果您想知道这样的属性(或该问题的任何标识符)是否是一个函数并且可以调用,那么
typeof
操作符应该做这件事。虽然我不确定它是否能在多个帧上正常工作


Cheers

form.onsubmit在定义为表单元素的属性时始终是一个函数。这是一种附加到HTML元素的匿名函数,它将this指针绑定到该表单元素,并且还有一个名为
event
的参数,该参数将包含有关提交事件的数据

在这种情况下,我不明白你是如何得到一个字符串作为一个操作类型的结果。你应该提供更多的细节,更好的代码

编辑(作为对第二次编辑的回应):

我相信不管上面的代码如何,附加到HTML属性的处理程序都会执行。此外,您可以尝试以某种方式阻止它,但是,看起来FF 3、IE 8、Chrome 2和Opera 9首先执行HTML属性处理程序,然后执行附加的属性处理程序(虽然我没有使用jQuery进行测试,但是使用addEventListener和attachEvent进行了测试)。所以你到底想完成什么


顺便说一下,您的代码不起作用,因为正则表达式将提取字符串“valid();”,这肯定不是函数。

我认为混淆的根源是节点的属性与相应的属性之间的区别

您正在使用:

$("a.button").parents("form").attr("onsubmit")
您直接读取的是
onsubmit
属性的值(该值必须是字符串)。相反,您应该访问节点的
onsubmit
属性

$("a.button").parents("form").prop("onsubmit")
下面是一个快速测试:

<form id="form1" action="foo1.htm" onsubmit="return valid()"></form>
<script>
window.onload = function () {
    var form1 = document.getElementById("form1");

    function log(s) {
        document.write("<div>" + s + "</div>");
    }

    function info(v) {
        return "(" + typeof v + ") " + v;
    }

    log("form1 onsubmit property: " + info(form1.onsubmit));
    log("form1 onsubmit attribute: " + info(form1.getAttribute("onsubmit")));
};
</script> 

window.onload=函数(){
var form1=document.getElementById(“form1”);
功能日志{
文件。写(“+s+”);
}
功能信息(五){
返回“(“+typeof v+”)+v;
}
日志(“form1 onsubmit属性:”+info(form1.onsubmit));
日志(“form1-onsubmit属性:”+info(form1.getAttribute(“onsubmit”)));
};
这将产生:

form1 onsubmit property: (function) function onsubmit(event) { return valid(); } form1 onsubmit attribute: (string) return valid() form1 onsubmit属性:(函数)函数onsubmit(事件){return valid();} form1 onsubmit属性:(string)返回valid() 我正在将提交按钮替换为 锚链。自从打电话以来 form.submit()未激活 在Submit's,我找到了,而且 我自己评估一下。但是我想 检查之前是否存在该函数 只是评估一下那里有什么gms8994


您始终可以在JavaScript博客上使用其中一种类型的函数,例如。对
typeOf()
函数使用如下定义将有效:

function typeOf(o){return {}.toString.call(o).slice(8,-1)}
此函数(在全局命名空间中声明)的使用方式如下:

alert("onsubmit is a " + typeOf(elem.onsubmit));

如果是函数,则返回“function”。如果是字符串,则返回“string”。将显示其他可能的值。

使用基于字符串的变量作为示例,并使用函数的实例 注册函数..分配变量..检查变量是否为函数名..执行预处理..将函数分配给新变量..然后调用函数

function callMe(){
   alert('You rang?');
}

var value = 'callMe';

if (window[value] instanceof Function) { 
    // do pre-process stuff
    // FYI the function has not actually been called yet
    console.log('callable function');
    //now call function
   var fn = window[value];
   fn();
}

xxx=='function'的类型不是最好最快的吗

我做了一个长凳,你可以在里面试一下,和instanceof相比
document.forms['theForm'].onsubmit = onsubmitHandler;
function typeOf(o){return {}.toString.call(o).slice(8,-1)}
alert("onsubmit is a " + typeOf(elem.onsubmit));
// This should be a function, because in certain JavaScript engines (V8, for
// example, try block kills many optimizations).
function isFunction(func) {
    // For some reason, function constructor doesn't accept anonymous functions.
    // Also, this check finds callable objects that aren't function (such as,
    // regular expressions in old WebKit versions), as according to EcmaScript
    // specification, any callable object should have typeof set to function.
    if (typeof func === 'function')
        return true

    // If the function isn't a string, it's probably good idea to return false,
    // as eval cannot process values that aren't strings.
    if (typeof func !== 'string')
        return false

    // So, the value is a string. Try creating a function, in order to detect
    // syntax error.
    try {
        // Create a function with string func, in order to detect whatever it's
        // an actual function. Unlike examples with eval, it should be actually
        // safe to use with any string (provided you don't call returned value).
        Function(func)
        return true
    }
    catch (e) {
        // While usually only SyntaxError could be thrown (unless somebody
        // modified definition of something used in this function, like
        // SyntaxError or Function, it's better to prepare for unexpected.
        if (!(e instanceof SyntaxError)) {
            throw e
        }

        return false
    }
}
function callMe(){
   alert('You rang?');
}

var value = 'callMe';

if (window[value] instanceof Function) { 
    // do pre-process stuff
    // FYI the function has not actually been called yet
    console.log('callable function');
    //now call function
   var fn = window[value];
   fn();
}