如何使 jQuery.ready 中定义的函数全局可用?

我有一个函数可以把 youtube 的 id 从网址上去掉。然后我想在每个页面中使用这个函数10次(在 wordpress 循环中)。

当我在我的 function script 标记中提供 URL 时,这个函数工作得很好,但是当我在循环中启动一组新的 script 标记时,它就不工作了。

我需要知道如何在不首先声明函数的情况下使用函数。

这就是我在标题中的代码:

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




});

但是当我尝试在页面的其他地方使用它时,它不起作用。

 <script type="text/javascript">


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

Firebug 给了我 没有定义 getList,这是有意义的,因为它不是。我能“全局”声明这个函数吗?

86917 次浏览

只要将它定义为脚本顶部的一个常规函数:

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

您有两个选项,将其添加到 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;


};

您可能还希望阅读 这个问题关于使用 var functionName = function () {}function functionName() {}的内容,以及 这篇文章关于变量作用域的内容。

在 ready ()函数之外声明 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 (.)函数的作用域。

另一种选择是将函数挂起到 jQuery 对象本身上。这样你就可以避免进一步污染全球名称空间:

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

然后您可以使用“ $. getlist (url,key)”来获取它

要将它声明为一个全局函数,只需去掉所有 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;
}

然后你就可以在任何地方打电话了。

您可以简单地在 $.fn变量中添加函数:

(function ($) {


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


}(jQuery));

示例用法:

$().getList();

这是在为 jQuery 创建 基本插件时通常要做的事情。