2010-02-08 81 views
59

我有一個功能,可以將youtube id從網址中刪除。然後我想每頁使用10次這個函數(在wordpress循環中)。如何在全局可用的jQuery.ready中定義一個函數?

當我在我的函數腳本標記中給它提供url時,該函數很好用,但是當我在循環內啓動一組新的腳本標記時,它不起作用。

我需要知道如何在不首先聲明所有函數的情況下使用我的函數。

所以這是我在報頭中的代碼:

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


     }); 

但是當我嘗試用這個地方的頁面上的其他人,它不工作。

​​

螢火蟲給我的GetList沒有定義這是有道理的,因爲它不是。我能夠'全球'宣佈這個功能嗎?

+0

對不起,糟糕的格式,每次我編輯代碼,它變得怪異。該代碼是有效的。 – wesbos 2010-02-08 17:00:40

+0

BTW - 在document.ready中聲明它意味着它只在文檔準備好(頁面加載後)時定義,所以你應該在確定它已經定義時調用函數。如果聲明本身在嘗試使用後運行,則聲明它爲全局對象可能不夠。 – 2011-09-05 10:09:05

回答

95

你有兩個選擇,將它添加到window對象,使其全球:

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

或移動它從文檔就緒事件處理程序中進入全局範圍:

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

}; 

你m ight也想閱讀this question關於使用var functionName = function() {} vs function functionName() {}this article關於變量的範圍。

+1

所以很多很好的答案,非常感謝:) – wesbos 2010-02-08 17:23:50

2

在你的腳本的頂部就其定義爲常規功能:

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

不管這是真的,但它不是一個好的解決方案,例如在這種情況下,您在其他頁面標題中定義了jQuery函數,並且您希望在img元素中使用它作爲onclick =「$。Function()」,其他答案必須更好。 – QMaster 2015-06-27 09:26:35

+1

不知道我理解你的評論(和downvote)。這段代碼回答瞭如何在全局命名空間中創建一個函數的問題 - 在jQuery處理程序之外。 – 2015-06-27 18:48:47

+0

從全球角度來看,它的含義是[全球]。我假定可以從每個Java腳本部分訪問全局函數,但是當您只是在腳本頂部定義時,這不是真的。我提到了{img元素內部的例子,如onclick =「$。Function()」}。所有的投票都是幫助用戶確定最佳答案。真誠。 – QMaster 2015-06-28 07:57:21

8

申報的GetList()就緒()函數之外..

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

現在的GetList將代碼中的任何地方工作:

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

的問題是,在的GetList範圍(。 )功能。

41

另一種選擇是將函數掛起jQuery對象本身。這樣,你避免污染全局命名空間中的任何進一步:

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

然後你就可以得到它以「$ .getlist(URL,鍵)」

+0

感謝你,讓我的第一個jQuery功能,真棒!如果有更全面的資源來製作自己的jQuery函數,請讓我知道,但這幫助了我http://blogs.microsoft.co.il/blogs/basil/archive/2008/09/22/defining-your- own-functions-in-jquery.aspx – 2013-06-15 21:19:38

-4

聲明它作爲一個全球性的功能,只得到擺脫所有的jQuery特定位。類似這樣的:

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

然後你應該可以從任何地方調用它。

+0

這沒有任何意義。如果他使用jQuery,那是爲什麼不再使用它的原因?更重要的是 - 在$(document).ready事件中聲明一些內容可以確保整個頁面都被加載,這有時是非常重要的。 當然,將document.ready聲明與此範圍之外的調用函數混合可能是不好的,但是簡單地刪除jQuery調用並不完全是一種解決方案。你至少應該解釋爲什麼刪除jquery是好的。 – 2011-09-05 10:03:35

+2

更新:好吧,我得到了進展,你的答案其實不是那麼糟糕。但它缺乏解釋什麼是將它移到document.ready範圍之外的好處和危險,var x = function(...)和function x(...)聲明等等之間的區別。沒有它,它有點像魔術 - 解決了一個具體的問題,但沒有知識它爲什麼會起作用。 – 2011-09-05 10:12:09

1

您可以簡單地添加你的函數在$.fn變量:

function ($) { 

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

}(jQuery)); 

用法示例:

$.getList(); 

這就是你通常會做,同時爲jQuery的一個Basic Plugin

+1

$ .getList();不工作,只有$()。getList();作品.... – Andrew 2017-02-25 11:49:52

相關問題