Pregunta

necesito para comprobar si el valor de onsubmit de una forma es una función. El formato es típicamente onsubmit="return valid();". ¿Hay una manera de saber si se trata de una función, y si es exigible? Usando typeof sólo devuelve que es una cadena, que no me ayuda mucho.

Editar : Por supuesto, entiendo que la "vuelta válida ();" es una cadena. He replaced se reduce a "válida ();", e incluso "válido ()". Quiero saber si alguno de ellos es una función.

Editar : Aquí hay un código, que puede ayudar a explicar mi problema:

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

EDIT 2 : Aquí está el nuevo código. Parece que todavía tengo que usar un eval, porque llamando form.submit () no se dispara existente 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;
    }
} );

Sugerencias sobre posiblemente cómo hacer esto mejor?

¿Fue útil?

Solución

  

Estoy sustitución de un botón de enviar con una   vínculo de anclaje. Desde llamando   form.submit () no activa   onsubmit de, se me hace, y   eval () ing yo mismo. Pero me gustaría   comprobar si existe la función antes   acaba de eval () ing lo que hay. - 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: falta parámetro f en función testOnsubmitAndSubmit

Lo anterior debería funcionar independientemente de si se asigna el atributo onsubmit HTML o le asigne en JavaScript:

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

Otros consejos

Trate

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

Usted simplemente puede usar el operador typeof junto con un operador ternario, para abreviar:

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

Si se trata de una función que llamamos y lo devolverá su valor de retorno, de lo contrario sólo volver true

Editar

No estoy muy seguro de lo que realmente quiere hacer, pero voy a tratar de explicar lo que podría estar sucediendo.

Cuando se declara su código onsubmit dentro de su HTML, que se convirtió en una función y por tanto su exigible desde el "mundo" JavaScript. Esto significa que estos dos métodos son equivalentes:

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

Estos dos serán ambas funciones y ambos serán invocable. Puede probar cualquiera de los que utilizan el operador typeof que debe Yeld el mismo resultado:. "function"

Ahora bien, si se asigna una cadena a la propiedad "onsubmit" a través de JavaScript, se mantendrá una cadena, por lo tanto, no se puede llamar. Tenga en cuenta que si se aplica el operador typeof contra ella, obtendrá "string" en lugar de "function".

Espero que esto podría aclarar algunas cosas. Por otra parte, si desea saber si dicha propiedad (o cualquier identificador para el caso) es una función y exigible, el operador typeof debe hacer el truco. Aunque no estoy seguro si funciona correctamente a través de múltiples tramas.

Saludos

¿Qué navegador está usando?

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

Esto me da "function" en IE7 y Firefox.

Asegúrese de que está llamando typeof en la función real, no una cadena literal:

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

typeof "x"; // returns "string"

typeof x; // returns "function"

utilizando una variable basada cadena como ejemplo y haciendo uso instanceof Function Registrar el function..assign la variable ... ver la variable es el nombre de la función ... hacer pre-proceso ... asignar la función de nuevo var ... a continuación, llamar a la función.

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

Puede intentar modificar esta técnica para satisfacer sus necesidades:

 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 siempre habrá una función cuando se define como un atributo de HTML la forma del elemento. Es una especie de función anónima unido a un elemento HTML, que tiene el este puntero con destino a ese elemento FORM y también tiene un event llamado parámetro que contendrá los datos sobre el evento enviar.

En estas circunstancias, no entiendo cómo ha llegado una cadena como consecuencia de una operación de typeof. Debe dar más detalles, más algo de código.

Editar (como una respuesta a su segunda edición):

Creo que el controlador asociado al atributo HTML ejecutará sin importar el código de seguridad. Más aún, se podría tratar de detenerlo de alguna manera, pero, parece que FF 3, IE 8, Chrome y Opera 9 2 están ejecutando el controlador de atributo HTML en el primer lugar y luego el adjunto (no he probado con jQuery sin embargo, pero con addEventListener y attachEvent). Así que ... ¿Qué está tratando de lograr exactamente?

Por cierto, el código no está funcionando debido a que su expresión regular que va a extraer la cadena "válida ();"., Lo que definitivamente no es una función

Si se trata de una cadena, que podría suponer / espero que sea siempre de la forma

return SomeFunction(arguments);

analizar para el nombre de la función, y luego ver si esa función se define utilizando

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

Bueno, "return valid();" es una cadena, por lo que es correcto.

Si desea comprobar si tiene una función de adjunto en lugar, puede probar lo siguiente:

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

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

Creo que la fuente de confusión es la distinción entre atributo de un nodo y el correspondiente propiedad .

Usted está utilizando:

$("a.button").parents("form").attr("onsubmit")

Usted está leyendo directamente el onsubmit atributo valor 's (que debe es una cadena). En su lugar, usted debe tener acceso a la onsubmit propiedad del nodo:

$("a.button").parents("form").prop("onsubmit")

Esto es una prueba rápida:

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

Esto produce:

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

Siempre se puede utilizar una de las funciones TypeOf en los blogs de JavaScript, como de Chris West. Usando una definición como la siguiente para la función typeOf() funcionaría:

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

Esta función (que se declara en el espacio de nombres global, se puede utilizar la siguiente manera:

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

Si se trata de una función, "Función" será devuelto. Si se trata de una cadena, "Cadena" será devuelto. Otros valores posibles se muestran href="http://gotochriswest.com/blog/2012/07/03/javascript-better-typeof-function/" aquí .

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

Un cheque simple como esto le permitirá saber si existe / definido:

if (this.onsubmit)
{
  // do stuff;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top