2010-07-24 13 views
38

¿Es posible invocar una función usando las cadenas?Función de llamada jQuery desde una cadena

(i.e) Tengo una variable var target = 'next';. Usando esta cadena quiero llamar al método jquery next(). ¿Debo usar target + '()' (esto es un poco tonto) para llamar al next()?

Sé que se puede hacer usando conditional declaraciones. Como se trata de una cadena obtenida de los usuarios, es difícil usar declaraciones condicionales para todo eso.

En mi plugin jQuery, los usuarios pasarán el valor prev, siblings etc. como opciones, para que se ejecuten los métodos jQuery respectivos.

¿Cómo implemento esto?

Respuesta

94

Usted puede utilizar el bracket notation para acceder al miembro con una cadena que contiene el identificador:

var target = 'next'; 
$("foobar")[target](); // identical to $("foobar").next() 
+3

wow no saben este! esto realmente redujo mis líneas de código! –

+2

Esto es realmente útil si sabe que puede llamar al método utilizando 'MyObject.call (myFunctionName, args);' Programación funcional FTW. Gracias por la propina, Gumbo. – josemota

+0

Debería haber aceptado la solución ligeramente, porque esto no es guardar. Especialmente porque no sabes en qué escribe tu usuario. ¿Qué sucede si comete un error tipográfico? La solución de levemente no romperá tu script. –

13

Si tienes intención de usar jQuery, la respuesta es muy elegante. Como jQuery es un objeto (al que se puede acceder como una matriz), puede usar $("selector")[target]().

Ejemplos:

var target = 'next'; 
jQuery("selector")[target](); 

Esto funcionará si usted sabe que puede confiar en la entrada. Sin embargo, si no está seguro de esto, debe verificar que la función exista antes de intentar ejecutarlo, de lo contrario obtendrá un error.

var target = 'doesNotExist'; 
if (jQuery.isFunction(target)) { 
    jQuery('selector')[target](); 
} 
8

En mi caso, necesitaba obtener el valor de un atributo rel y luego analizarlo como una función, esto funcionó para mí.

$jq('#mainbody form').submit(function(e){ 
    var formcheck = $jq(this).attr('rel'); 
    if (typeof window[formcheck] === 'function'){ 
     formok = window[formcheck](); 
     e.preventDefault(); 
    } 
}); 
function maincheck(){ 
    alert("Checked"); 
    return false; 
} 

y la forma

<div id="mainbody"> 
<form action="mainpage.php" method="post" rel="maincheck"> 
<input type="hidden" name="formaction" value="testpost"> 
<label>Field 1 <input type="text" name="field1" value="<?=$_POST['field1'];?>"></label><br> 
<label>Field 2 <input type="text" name="field2" value="<?=$_POST['field2'];?>"></label><br> 
<input type="submit" value="Submit Form"> 
</form> 
</div> 
Cuestiones relacionadas