我需要测试表单的值是否 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;
    }
} );

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

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

有帮助吗?

解决方案

  

我更换具有提交按钮   锚链接。由于主叫   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>

编辑:在功能testOnsubmitAndSubmit缺少参数f

上面应该无论是否分配onsubmit HTML属性或在JavaScript中分配给它的工作:

document.forms['theForm'].onsubmit = onsubmitHandler;

其他提示

尝试

if (this.onsubmit instanceof Function) {
    // 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(); };

这两个将两个函数,都将是可调用。可以测试任何使用应yeld相同的结果的操作者typeof的那些:"function"

现在,如果你分配一个字符串通过JavaScript“的onsubmit”属性,它仍将是一个字符串,因此不调用。请注意,如果您将typeof运营商反对的话,你会得到的,而不是"string" "function"

我希望,这可能澄清一些事情。再说,如果你想知道如果这样的财产(或为此事的任何标识符)是一个功能和可调用的typeof运营商应该做的伎俩。虽然我不知道这是否正常工作,在多个帧。

干杯

您使用的是什么浏览器?

alert(typeof document.getElementById('myform').onsubmit);

这使我 “function” 在IE7和Firefox。

请确保您的实际功能,而不是一个字符串的typeof呼吁:

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

typeof "x"; // returns "string"

typeof x; // returns "function"

使用基于字符串变量如实施例和利用instanceof Function 您注册function..assign变量...检查变量的函数的名称...做预处理...分配的功能,以新的变种...然后调用该函数。

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

您可以尝试修改这种技术以满足您的需求:

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

当定义为HTML形式元素的属性form.onsubmit将始终是一个函数。这是某种形式的匿名函数附加到一个HTML元素,它具有的这个的绑定到该FORM元素,也指针有一个参数叫event其中将包含有关提交的事件数据。

在这种情况下,我不知道你是怎么将一个字符串作为typeof运算操作的结果。你应该提供更多的细节,更好一些代码。

修改(以您的第二编辑的响应):

相信不管连接到HTML属性该处理程序将执行上面的代码。更进一步,你可以尝试以某种方式阻止它,但是,看来FF 3,IE 8,铬2和Opera 9的执行摆在首位的HTML属性处理程序,然后将一个连接(我没有使用jQuery测试虽然,但随着的addEventListener和的attachEvent)。所以...什么是你要完成的是什么呢?

顺便提及,您的代码不工作,因为你的正则表达式将提取字符串“有效();”,这绝对不是一个功能

如果它是一个字符串,你可以假设/希望它的形式总是

return SomeFunction(arguments);

解析为函数的名称,然后看看是否函数是使用定义

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

好了,"return valid();"的字符串,所以这是正确的。

如果你想检查是否有代替附加的功能,你可以试试这个:

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

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

我觉得混乱的源是一个节点的属性之间的区别并相应的属性

您正在使用:

$("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> 

此产生:

form1 onsubmit property: (function) function onsubmit(event) { return valid(); }
form1 onsubmit attribute: (string) return valid()
  if ( window.onsubmit ) {
     //
  } else {
     alert("Function does not exist.");
  }

您始终可以在 JavaScript 博客上使用 typeOf 函数之一,例如 克里斯·韦斯特的. 。使用如下定义 typeOf() 函数可以工作:

function typeOf(o){return {}.toString.call(o).slice(8,-1)}

这个函数(在全局命名空间中声明,可以像这样使用:

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

如果是函数,则返回“Function”。如果是字符串,则返回“String”。显示其他可能的值 这里.

// 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
    }
}

这样一个简单的检查将让你知道,如果它存在/定义的:

if (this.onsubmit)
{
  // do stuff;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top