style link attribute javascript typeof onsubmit

javascript - link - title css



Probando si el valor es una funciĆ³n (15)

Necesito comprobar si el valor de la onsubmit de un formulario es una función. El formato suele ser onsubmit="return valid();" . ¿Hay alguna forma de saber si se trata de una función y si se puede llamar? Usar typeof solo devuelve que es una cadena, lo cual no me ayuda mucho.

EDITAR : por supuesto, entiendo que "return valid ();" es una cadena Lo he replace por "válido ();" 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 una evaluación, porque al llamar a form.submit () no se activan los envíos existentes.

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?


Estoy reemplazando un botón de enviar con un enlace de anclaje. Como al llamar a form.submit () no se activa onsubmit, lo encuentro y eval () lo hago yo mismo. Pero me gustaría comprobar si la función existe antes de simplemente evaluar () lo que hay allí. - 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>

EDITAR: falta el parámetro f en la función testOnsubmitAndSubmit

Lo anterior debería funcionar independientemente de si asigna el onsubmit HTML onsubmit o lo asigna en JavaScript:

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


¿Qué navegador estás usando?

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

Esto me da " function " en IE7 y FireFox.


Asegúrese de estar llamando a typeof en la función real, no a un literal de cadena:

function x() { console.log("hi"); } typeof "x"; // returns "string" typeof x; // returns "function"


Bueno, "return valid();" es una cadena, eso es correcto.

Si desea verificar si tiene una función adjunta, intente 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 el atributo de un nodo y la propiedad correspondiente.

Estás usando:

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

Está leyendo directamente el onsubmit atributo onsubmit (que debe ser una cadena). En su lugar, debe acceder a la propiedad onsubmit del nodo:

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

Aquí hay 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()


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


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

return SomeFunction(arguments);

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

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


Siempre puede usar una de las funciones typeOf en blogs de JavaScript como Chris West''s . Usar 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 usar así:

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

Si es una función, se devolverá "Función". Si es una cadena, se devolverá "Cadena". Otros valores posibles se muestran aquí .


Simplemente podría usar el operador typeof junto con un operador ternario para abreviar:

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

Si es una función, la llamamos y le devolvemos el valor de retorno; de lo contrario, solo devuelve true

Editar:

No estoy muy seguro de lo que realmente quieres hacer, pero trataré de explicar qué podría estar pasando.

Cuando declaras tu código onsubmit dentro de tu html, se convierte en una función y, por lo tanto, se puede llamar desde el "mundo" de JavaScript. Eso significa que esos dos métodos son equivalentes:

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

Estas dos funciones serán ambas y ambas serán invocables. Puede probar cualquiera de los que utilizan el operador typeof que debería arrojar el mismo resultado: "function" .

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

Espero que esto pueda aclarar algunas cosas. Por otra parte, si desea saber si dicha propiedad (o cualquier identificador para el asunto) es una función y puede llamarse, el operador de typeof debería hacer el truco. Aunque no estoy seguro de si funciona correctamente en varios marcos.

Aclamaciones


Tratar

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


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

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


form.onsubmit siempre será una función cuando se define como un atributo de HTML el elemento de formulario. Es una especie de función anónima asociada a un elemento HTML, que tiene este puntero vinculado a ese elemento FORM y también tiene un parámetro llamado event que contendrá datos sobre el evento submit.

En estas circunstancias, no entiendo cómo obtuvo una cadena como resultado de un tipo de operación. Deberías dar más detalles, mejorar algún código.

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

Creo que el controlador asociado al atributo HTML se ejecutará independientemente del código anterior. Además, podría intentar detenerlo de alguna manera, pero parece que FF 3, IE 8, Chrome 2 y Opera 9 están ejecutando el controlador de atributos HTML en primer lugar y luego el adjunto (no probé con jQuery sin embargo, pero con addEventListener y attachEvent). Entonces ... ¿qué estás tratando de lograr exactamente?

Por cierto, su código no funciona porque su expresión regular extraerá la cadena "valid ();", que definitivamente no es una función.


usando una variable basada en cadenas como ejemplo y haciendo uso de una instanceof Function Usted registra la función ... asigna la variable ... verifica que la variable es el nombre de la función ... preprocesa ... asigna la función a la nueva var .. . Entonces llame 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(); }


if ( window.onsubmit ) { // } else { alert("Function does not exist."); }


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