2010-02-08 8 views
59

Mam funkcję, która usuwa identyfikator YouTube z adresu URL. Następnie chcę użyć tej funkcji 10 razy na stronę (w pętli wordpress).Jak mogę utworzyć funkcję zdefiniowaną w jQuery. Czy jest już dostępna globalnie?

Funkcja działa świetnie, gdy dodaję adres URL do skryptów funkcji, ale gdy uruchamiam nowy zestaw znaczników skryptów w pętli, to nie działa.

Muszę wiedzieć, w jaki sposób mogę korzystać z mojej funkcji bez uprzedniego zadeklarowania wszystkiego.

Więc jest to kod mam w nagłówku:

<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")); 


     }); 

Ale gdy próbuję użyć tego gdzieś indziej na stronie, nie robi praca.

<script type="text/javascript"> 

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

Firebug daje mi getlist nie jest zdefiniowana które ma sens, bo jej nie. Czy jestem w stanie "globalnie" ogłosić tę funkcję?

+0

Przepraszamy za słabe formatowanie, za każdym razem, gdy edytuję kod, okaże się dziwne. Kod jest ważny. – wesbos

+0

Jedna rzecz: BTW - deklaracja w dokumencie. Oznacza to, że jest ona zdefiniowana tylko wtedy, gdy dokument jest gotowy (po załadowaniu strony), więc powinieneś wywołać funkcję, gdy jesteś pewien, że jest zdefiniowana. Zgłoszenie go jako obiektu globalnego może nie wystarczyć, jeśli sama deklaracja zostanie uruchomiona po próbie użycia. –

Odpowiedz

95

masz dwie opcje, dodaj go do obiektu window aby globalny:

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

lub przenieść to z wnętrza modułu obsługi zdarzeń gotowego dokumentu do globalnego zakresu:

$(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; 

}; 

You m Warto również przeczytać this question o używaniu var functionName = function() {} w stosunku do function functionName() {} i this article dotyczących zakresu zmiennych.

+1

Tak wiele wspaniałych odpowiedzi, dziękuję bardzo :) – wesbos

2

Wystarczy zdefiniować go jako zwykłej funkcji w górnej części skryptu:

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

Niezależnie od tego, czy jest to prawda, ale nie jest to dobre rozwiązanie, na przykład w tym przypadku zdefiniowałeś funkcję jQuery w innym nagłówku strony i chcesz użyć jej wewnątrz elementu img jako onclick = "$. Funkcja()", Inne odpowiedzi muszą być lepsze. – QMaster

+1

Nie jestem pewien, czy rozumiem Twój komentarz (i głosowanie). Ten kod odpowiada na pytanie, jak utworzyć funkcję w globalnej przestrzeni nazw - poza obsługą jQuery. –

+0

Globalne słowo oznacza to [Globalnie]. Zakładam, że funkcja globalna jest dostępna z każdej sekcji skryptu java, ale nie jest to prawdą, gdy definiujesz tylko u góry skrypty. Wspomniałem próbkę elementu {inside img jako onclick = "$. Function()"}. Po tym wszystkim, że głosowanie w dół jest po to, aby pomóc użytkownikowi w określeniu najlepszej odpowiedzi. Z poważaniem. – QMaster

8

stwierdzenie getlist() poza funkcją ready() ..

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

Teraz getlist będzie pracować w dowolnym miejscu w kodzie:

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

Problem polegał na tym, zakres getlist (.).

41

Jeszcze inną opcją jest zawieszenie tej funkcji z samego obiektu jQuery. W ten sposób można uniknąć zanieczyszczenia nazwy globalnej przestrzeni dowolny dalej:

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

następnie można uzyskać na nią z „$ .getlist (URL, klucz)”

+0

Dzięki tobie, właśnie zrobiłem moją pierwszą funkcję jQuery, niesamowite! Jeśli istnieje szerszy zasób do tworzenia własnych funkcji jQuery, proszę dać mi znać, ale to pomogło mi http://blogs.microsoft.co.il/blogs/basil/archive/2008/09/22/defining-your- own-functions-in-jquery.aspx –

-4

uznaniu jej jako funkcji globalnej, po prostu pozbyć się wszystkich bitów specyficznych dla jQuery. Coś takiego:

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

A następnie powinieneś być w stanie wywołać to z dowolnego miejsca.

+0

To nie ma sensu. Jeśli używał jQuery, to z jakiegoś powodu, dlaczego nie miałby go już używać? Co więcej - deklarowanie czegoś w $ (document) .ready event zapewnia, że ​​cała strona jest załadowana, co jest niekiedy niezbędne. Oczywiście, połączenie deklaracji document.ready z funkcją wywołania poza tym zakresem może być złe, ale po prostu usunięcie wywołania jQuery nie jest dokładnie rozwiązaniem. Powinieneś przynajmniej wyjaśnić, dlaczego usuwanie jquery jest dobre. –

+2

AKTUALIZACJA: ok, zostałem przeniesiony, twoja odpowiedź nie jest tak źle. Ale brak jej jest wyjaśnieniem, jakie są zalety i zagrożenia związane z przeniesieniem go poza dokument.rozszerzenie, różnice między var x = funkcja (...) a deklaracjami funkcji x (...) i tak dalej. Bez niej jest to jak magia - rozwiązuje jeden konkretny problem, ale bez wiedzy, dlaczego to działa. –

1

Można po prostu dodać swoją funkcję w zmiennej $.fn:

function ($) { 

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

}(jQuery)); 

Przykład użycia:

$.getList(); 

To jest to, czego zazwyczaj nie będzie podczas tworzenia Basic Plugin dla jQuery.

+1

$ .getList(); nie działa, tylko $(). getList(); Prace.... – Andrew

Powiązane problemy