문제

양식의 값이 onsubmit 기능입니다. 형식은 일반적으로입니다 onsubmit="return valid();". 이것이 기능인지, 호출 가능하는지 알 수있는 방법이 있습니까? Typeof를 사용하면 문자열이라는 것을 반환합니다.

편집하다: 물론, 나는 "return valid (); 문자열입니다. 나는 replaced "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: 여기에 새 코드가 있습니다. call 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;
    }
} );

이 작업을 더 잘 수행하는 방법에 대한 제안?

도움이 되었습니까?

해결책

앵커 링크로 제출 버튼을 교체하고 있습니다. Calling.submit ()는 onsubmit 's를 활성화하지 않기 때문에, 나는 그것을 찾아서 그것을 직접 평가하고 있습니다. 그러나 나는 거기에있는 것을 평가하기 전에 함수가 존재하는지 확인하고 싶습니다. - 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 단기적으로 3 원 운영자와 함께 운영자 :

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

그것이 기능이라면 우리가 호출하고 반환 값을 반환합니다. 그렇지 않으면 반환하십시오. true

편집하다:

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

당신이 당신의 선언 할 때 onsubmit HTML 내에서 코드는 함수로 바뀌어 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);

이것은 나에게 준다 "function"IE7과 Firefox에서.

문자열 문자가 아닌 실제 함수에서 Typeof를 호출하고 있는지 확인하십시오.

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

typeof "x"; // returns "string"

typeof x; // returns "function"

문자열 기반 변수를 예제로 사용하고 사용합니다. instanceof Function 함수를 등록하십시오 .. 변수를 할당 ... 변수가 함수 이름인지 확인하십시오 ... 사전 프로세스 ... 함수를 새 Var에 할당 한 다음 함수를 호출하십시오.

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

form.onsubmit은 HTML의 속성으로 정의 된 경우 항상 기능이됩니다. 그것은 HTML 요소에 첨부 된 일종의 익명 기능입니다. 이것 포인터는 해당 양식 요소에 바인딩되고 이름이 지정된 매개 변수도 있습니다. event 제출 이벤트에 대한 데이터가 포함됩니다.

이러한 상황에서 나는 당신이 유형의 작업의 결과로 문자열을 어떻게 얻었는지 이해하지 못합니다. 더 자세한 내용은 더 나은 코드를 제공해야합니다.

편집하다 (두 번째 편집에 대한 응답으로) :

HTML 속성에 첨부 된 핸들러가 위 코드에 관계없이 실행될 것이라고 생각합니다. 더욱이, 당신은 어떻게 든 그것을 멈출 수 있지만, FF 3, IE 8, Chrome 2 및 Opera 9는 처음에 HTML 속성 핸들러를 실행 한 다음 첨부 된 것 (jQuery로 테스트하지 않았습니다. 그러나 addeventListener 및 afchevent와 함께). 그래서 ... 정확히 무엇을 성취하려고합니까?

그건 그렇고, 정규 표현식이 문자열 "valid ();"를 추출하기 때문에 코드가 작동하지 않습니다. 이는 확실히 함수가 아닙니다.

문자열이라면 항상 양식의 것으로 가정 / 희망 할 수 있습니다.

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 기인하다의 가치 (what ~ 해야 하다 문자열이 되십시오). 대신, 당신은 액세스해야합니다 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 블로그에서 다음과 같은 유형의 기능 중 하나를 사용할 수 있습니다. Chris West 's. 다음과 같은 정의를 사용합니다 typeOf() 기능은 작동합니다 :

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

이 기능 (글로벌 네임 스페이스에서 선언 된 것은 다음과 같이 사용할 수 있습니다.

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

함수 인 경우 "기능"이 반환됩니다. 문자열 인 경우 "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