[javascript] 값이 함수인지 테스트

폼의 값이 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 : 여기에 새 코드가 있습니다. 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>

편집 : testOnsubmitAndSubmit 함수에서 매개 변수 f 누락

위의 내용은 onsubmitHTML 속성 을 지정하든 JavaScript에서 지정 하든 관계없이 작동합니다 .

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


답변

시험

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


답변

간단히 typeof삼항 연산자와 함께 연산자 를 사용할 수 있습니다 .

onsubmit="return typeof valid =='function' ? valid() : true;"

함수라면 우리는 그것을 호출하고 반환 값을 반환하고 그렇지 않으면 그냥 반환합니다. true

편집하다:

나는 당신이 정말로 무엇을하고 싶은지 잘 모르겠지만, 무슨 일이 일어날 지 설명하려고 노력할 것입니다.

onsubmitHTML 내에서 코드 를 선언 하면 함수로 바뀌므로 JavaScript “world”에서 호출 할 수 있습니다. 이는이 두 가지 방법이 동일하다는 것을 의미합니다.

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

이 두 가지는 모두 함수이고 둘 다 호출 가능합니다. typeof동일한 결과를 표시해야하는 연산자를 사용하여 테스트 할 수 있습니다 "function"..

이제 JavaScript를 통해 “onsubmit”속성에 문자열을 할당하면 문자열로 유지되므로 호출 할 수 없습니다. 이에 typeof대해 연산자 를 적용하면 "string"대신 "function".

나는 이것이 몇 가지를 명확히 할 수 있기를 바랍니다. 그런 다음 이러한 속성 (또는 문제에 대한 식별자)이 함수이고 호출 가능한지 알고 싶다면 typeof연산자가 트릭을 수행해야합니다. 여러 프레임에서 제대로 작동하는지 확실하지 않지만.

건배


답변

어떤 브라우저를 사용하고 있습니까?

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

이것은 functionIE7 및 FireFox에서 ” “를 제공합니다 .


답변

문자열 기반 변수를 예제로 사용하여 사용 instanceof Function
함수를 등록합니다. 변수 할당 … 변수가 함수 이름인지 확인합니다 … 사전 처리를 수행합니다 … 함수를 새 변수에 할당합니다. 함수를 호출하십시오.

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


답변

문자열 리터럴이 아닌 실제 함수에서 typeof를 호출하고 있는지 확인하십시오.

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

typeof "x"; // returns "string"

typeof x; // returns "function"


답변

필요에 맞게이 기술 을 수정할 수 있습니다 .

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