2010-02-08 7 views
59

Tengo una función que quita la id de youtube de una url. Entonces quiero usar esta función 10 veces por página (en el bucle wordpress).¿Cómo puedo hacer que una función definida en jQuery.ready esté disponible globalmente?

La función funciona muy bien cuando le doy la URL dentro de mis etiquetas de script de función, pero cuando comienzo un nuevo conjunto de etiquetas de script dentro del ciclo, no funciona.

Necesito saber cómo puedo usar mi función sin declararlo todo primero.

Así que este es el código que tengo en la cabecera:

<script type="text/javascript"> 
$(document).ready(function() { 
var getList = function(url, gkey){ 
     var returned = null; 
     if (url.indexOf("?") != -1){ 
      var list = url.split("?")[1].split("&"), 
        gets = []; 

      for (var ind in list){ 
      var kv = list[ind].split("="); 
      if (kv.length>0) 
       gets[kv[0]] = kv[1]; 
     } 

     returned = gets; 

     if (typeof gkey != "undefined") 
      if (typeof gets[gkey] != "undefined") 
       returned = gets[gkey]; 

     } 

      return returned; 

    }; 


     // THIS WORKS 

    alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', "v")); 


     }); 

Pero cuando intento utilizar esto en otro lugar de la página, que no funciona.

<script type="text/javascript"> 

     $(document).ready(function() { 
       alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', "v")); 
     }; 
     </script> 

Firebug me da getList no se define lo cual tiene sentido, porque no lo es. ¿Puedo declarar "globalmente" esta función?

+0

Lo siento por el formato pobre, cada vez que edito el código, resulta extraño. El código es válido – wesbos

+0

Una cosa, por cierto, declararlo dentro de document.ready significa que está definido solo cuando el documento está listo (después de cargar la página), por lo que debe llamar a la función cuando esté seguro de que está definida. Declararlo como un objeto global puede no ser suficiente si la declaración en sí se ejecuta después de intentar usarlo. –

Respuesta

95

tiene dos opciones, agregarlo al objeto window para que sea mundial:

window.getList = function(url, gkey){ 
    // etc... 
} 

o mover desde el controlador de eventos listo para documentos en el alcance global:

$(document).ready(function() { 
    alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', "v")); 
}); 
var getList = function(url, gkey){ 

    var returned = null; 
    if (url.indexOf("?") != -1){ 
     var list = url.split("?")[1].split("&"), 
       gets = []; 

     for (var ind in list){ 
     var kv = list[ind].split("="); 
     if (kv.length>0) 
      gets[kv[0]] = kv[1]; 
    } 

    returned = gets; 

    if (typeof gkey != "undefined") 
     if (typeof gets[gkey] != "undefined") 
      returned = gets[gkey]; 

    } 

     return returned; 

}; 

Usted m También quiero leer this question sobre el uso de var functionName = function() {} vs function functionName() {}, y this article sobre alcance variable.

+1

Tantas buenas respuestas, muchas gracias :) – wesbos

2

Sólo definirlo como una función regular en la parte superior de su script:

<script type="text/javascript"> 
    function getlist(url, gkey){ 
     ... 
    } 
</script> 
+0

Independientemente de que sea cierto pero no es una buena solución, por ejemplo, en ese caso definió la función jQuery en otro encabezado de página y desea usarla dentro del elemento img como onclick = "$. Function()", otras respuestas deben ser mejores. – QMaster

+1

No estoy seguro de entender su comentario (y downvote). Este código responde a la pregunta de cómo crear una función en el espacio de nombres global, fuera del manejador jQuery. –

+0

Globally word point it's meaning [Globally]. Supongo que se puede acceder a la función global desde cada sección de script de Java, pero eso no es cierto cuando solo se define en la parte superior de los scripts. Mencioné una muestra de {dentro del elemento img como onclick = "$. Function()"}. Después de todo, el voto negativo es solo para ayudar al usuario a determinar la mejor respuesta. Sinceramente. – QMaster

8

getList declare() fuera de la función ready() ..

var getList = function(url, gkey){ 
     var returned = null; 
     if (url.indexOf("?") != 
.... 
.... 
... 
}; 

Ahora el getList funcionará en cualquier parte del código:

$(document).ready(function() { 
alert(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4', "v")); 
}); 

El problema era, el alcance de la getList (.) función.

41

Otra opción más es colgar la función del objeto jQuery. De esa manera a evitar contaminar el espacio de nombre global más lejos:

jQuery.getlist = function getlist(url, gkey) { 
    // ... 
} 

entonces se puede obtener en ella con "$ .getlist (url, clave)"

+0

Gracias a ti, acabo de hacer mi primera función jQuery, ¡increíble! Si hay un recurso más completo para hacer sus propias funciones de jQuery, hágamelo saber, pero esto me ayudó http://blogs.microsoft.co.il/blogs/basil/archive/2008/09/22/defining-your- own-functions-in-jquery.aspx –

-4

Declarar como una función global, acaba de obtener deshacerse de todos los bits específicos de jQuery. Algo como esto:

function getList(url, gkey) { 
    var returned = null; 
    if (url.indexOf("?") != -1){ 
    var list = url.split("?")[1].split("&"), gets = []; 
    for (var ind in list){ 
     var kv = list[ind].split("="); 
     if (kv.length>0) { 
      gets[kv[0]] = kv[1]; 
     } 
    } 

    returned = gets; 

    if (typeof gkey != "undefined") { 
     if (typeof gets[gkey] != "undefined") { 
      returned = gets[gkey]; 
     } 
    } 

    return returned; 
} 

Y entonces debería poder llamar desde cualquier lugar.

+0

Esto no tiene sentido. Si usó jQuery, fue por una razón, ¿por qué no usarlo más? Además, declarar algo en $ (document) .ready event garantiza que se carga toda la página, lo que a veces es esencial. Por supuesto, mezclar la declaración de document.ready con la función de llamada fuera de este alcance puede ser malo, pero simplemente eliminar la llamada jQuery no es exactamente una solución. Al menos deberías explicar por qué eliminar jquery es bueno. –

+2

ACTUALIZACIÓN: vale, me llevaron, tu respuesta no es tan mala. Pero lo que le falta es una explicación de cuáles son los beneficios y peligros de moverlo fuera del alcance del documento. Las diferencias entre var x = función (...) y función x (...) declaraciones y demás. Sin ella, de alguna manera es magia, resuelve un problema específico, pero sin saber por qué funciona. –

1

simplemente puede añadir a su función en la variable $.fn: el uso

function ($) { 

    $.fn.getList = function() { 
     // ... 
    }; 

}(jQuery)); 

Ejemplo:

$.getList(); 

Esto es lo que normalmente se hace mientras se crea una Basic Plugin para jQuery.

+1

$ .getList(); no funciona, solo $(). getList(); trabajos.... – Andrew

Cuestiones relacionadas