2009-07-28 16 views
62

Soy un novato en programación, y no puedo encontrar la manera de almacenar una función en JQuery y ejecutarla en varios lugares.Cómo ejecutar una función en jquery

que tengo:

$(function() { 
    $("div.class").click(function(){ 
    //Doo something 

    }); 

    $("div.secondclass").click(function(){ 
    //Doo something 
    }); 

}); 

Ahora el 2 "// Doo algo" son los mismos, y no quiero que escribir el mismo código de nuevo.

Si pongo:

$(function() { 

    function doosomething() 
    { 
    //Doo something 
    } 

    $("div.class").click(doosomething); 

    $("div.secondclass").click(doosomething); 

}); 

que se ejecutan la función de carga de la página, en lugar de sólo cuando se hace clic.

¿Cómo hago esto correctamente?

Gracias!

Respuesta

108

Lo siguiente debería funcionar bien.

$(function() { 

    // Way 1 
    function doosomething() 
    { 
    //Doo something 
    } 

    // Way 2, equivalent to Way 1 
    var doosomething = function() { 
    // Doo something 
    } 

    $("div.class").click(doosomething); 

    $("div.secondclass").click(doosomething); 

}); 

Básicamente, usted está declarando su función en el mismo alcance que su use (JavaScript utiliza para determinar el alcance Closures).

Ahora, ya que las funciones en JavaScript se comportan como cualquier otro objeto, puede simplemente asignar doosomething como la función de llamar al hacer clic mediante el uso de .click(doosomething);

Su función no se ejecutará hasta que llame usando doosomething() (doosomething sin el () se refiere a la función pero no la llama) o llama a otra función (en este caso, el controlador click).

+1

Gracias por vía 2, voy a tener que tratar ese. Pero la función de hecho se ejecuta en la carga de la página porque en jquery $ (función() es una abreviatura de carga de documentos.De modo que al menos 1, no funcionará. – Corin

+0

La forma 1 funciona ... Acabo de probarla. –

+2

soy muy nuevo en jQuery, por lo que puede explicar la primera línea '$ (function() {'? ¿Cuál es el propósito de esta línea, por favor? Tyvm –

18
function doosomething() 
{ 
    //Doo something 
} 


$(function() { 


    $("div.class").click(doosomething); 

    $("div.secondclass").click(doosomething); 

}); 
11

alternativa (yo diría que preferentemente), puede hacerlo de esta manera:

$(function() { 
    $("div.class, div.secondclass").click(function(){ 
    //Doo something 
    }); 
}); 
+7

que vence el punto de la cuestión – Corin

+1

agradable cuando Fe div.secondclass no existe aún ... NO! – bicycle

28

lo haría de esta manera:

(function($) { 
jQuery.fn.doSomething = function() { 
    return this.each(function() { 
     var $this = $(this); 

     $this.click(function(event) { 
     event.preventDefault(); 
     // Your function goes here 
     }); 
    }); 
}; 
})(jQuery); 

Luego, el documento listo, puede hacer cosas como esta:

$(document).ready(function() { 
    $('#div1').doSomething(); 
    $('#div2').doSomething(); 
}); 
+3

¿La creación de una función fuera del "documento listo" en realidad proporciona algún beneficio? – Navigatron

+0

@Nuktu sí, para el desarrollo de complementos – Swordfish0321

+0

Si está usando $ en el parámetro de la función, entonces ¿por qué molestarse en llamarlo jQuery en lugar de usar $ otra vez? –

2

es éste el más Obfusc solución ated posible? No creo que la idea de jQuery fuera crear código como este. También existe la presunción de que no queremos crear eventos, lo que probablemente sea incorrecto.

simple movimiento doosomething() fuera del $(function(){} hará que tienen alcance global y mantener el código simple/legible.

+0

? Pero si se usa solo en las funciones de JQuery, es mucho mejor no contaminar el alcance global y mantenerlo donde corresponde. – Johnride

5

También puede hacer esto: como quiere que una función se use en todas partes, puede hacerlo llamando directamente a JqueryObject.function(). Por ejemplo, si desea crear su propia función para manipular cualquier CSS en un elemento:

jQuery.fn.doSomething = function() { 
    this.css("position","absolute"); 
    return this; 
} 

Y la forma de llamarlo:

$("#someRandomDiv").doSomething(); 
Cuestiones relacionadas