1. ホーム
  2. javascript

[解決済み] 値が関数であるかどうかのテスト

2023-01-20 14:36:04

質問

フォームの onsubmit の値が関数であるかどうかをテストする必要があります。 フォーマットは通常 onsubmit="return valid();" . これが関数かどうか、そして呼び出し可能かどうかを判断する方法はありますか? typeofを使用しても、それが文字列であることを返すだけで、あまり役に立ちません。

EDIT : もちろん、"return valid();"が文字列であることは理解しています。 私は replace dして、"valid();"、さらには"valid()"としました。 私はこれらのいずれかが関数であるかどうかを知りたいのです。

EDIT : これは私の問題を説明するのに役立つかもしれない、いくつかのコードです。

$("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 : これが新しいコードです。 form.submit()を呼んでも、既存のonsubmitsが起動しないので、やはりevalを使う必要があるようです。

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>

EDIT : testOnsubmitAndSubmit関数でパラメータfが不足しています。

上記は onsubmit 属性を指定しても、JavaScriptで指定しても動作するはずです。

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