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

Javascript 如何使jQuery.ready中定义的函数全局可用?,javascript,jquery,Javascript,Jquery,我有一个功能,可以从url中删除youtube id。然后我希望每页使用这个函数10次(在wordpress循环中) 当我在函数脚本标记中向它提供url时,该函数工作得很好,但是当我在循环中启动一组新的脚本标记时,它就不工作了 我需要知道如何使用我的函数而不首先声明它 这是我在标题中的代码: <script type="text/javascript"> $(document).ready(function() { var getList = function(url, gkey

我有一个功能,可以从url中删除youtube id。然后我希望每页使用这个函数10次(在wordpress循环中)

当我在函数脚本标记中向它提供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"));


      });

$(文档).ready(函数(){
var getList=函数(url,gkey){
返回的var=null;
if(url.indexOf(“?”)=-1){
var list=url.split(“?”[1]。split(&”),
获取=[];
for(列表中的变量ind){
var kv=列表[ind]。拆分(“”);
如果(千伏长度>0)
获取[kv[0]]=kv[1];
}
返回=获取;
if(gkey的类型!=“未定义”)
if(typeof get[gkey]!=“未定义”)
returned=获取[gkey];
}
返回;
};
//这很有效
警报(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>

$(文档).ready(函数(){
警报(getList('http://www.youtube.com/watch?v=dm4J5dAUnR4","v"),;
};

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

只需在脚本顶部将其定义为常规函数:

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

函数getlist(url,gkey){
...
}

您有两个选项,将其添加到
窗口
对象以使其成为全局对象:

window.getList = function(url, gkey){ 
    // etc...
}
或者将其从document ready事件处理程序内部移动到全局范围:

$(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(){}
vs
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();

这是创建for jQuery时通常会执行的操作。

很抱歉格式设置不好,每次我编辑代码时,结果都很奇怪。代码是有效的。顺便说一句,在document.ready中声明它意味着只有在文档准备就绪(页面加载后)时才定义它因此,您应该在确定函数已定义的情况下调用该函数。如果在您尝试使用该函数之后运行声明本身,则将其声明为全局对象可能是不够的。这没有任何意义。如果他使用jQuery,这是有原因的,所以为什么不再使用它?更重要的是,在$(文档)中声明某些内容.ready事件可确保加载整个页面,这有时是必要的。当然,将document.ready声明与此范围外的调用函数混合使用可能不好,但简单地删除jQuery调用并不完全是一个解决方案。您至少应该解释为什么删除jQuery是好的。更新:好的,我开始了,您的答案是实际上没那么糟糕。但它缺少的是一个解释,即将它移出document.ready范围的好处和危险是什么。var x=函数(…)和函数x(…)之间的区别声明等等。如果没有它,它就像魔术一样——解决了一个特定的问题,但不知道它为什么工作。多亏了你,我刚刚制作了我的第一个jQuery函数,棒极了!如果有更全面的资源来制作你自己的jQuery函数,请让我知道,但这对我有帮助,不管这是真的,但它不是一个好的解决方案例如,在这种情况下,您在其他页面标题中定义了jQuery函数,并希望在img元素中使用它作为onclick=“$.function()”,其他答案必须更好。我不确定是否理解您的评论(和向下投票)。这段代码回答了如何在全局命名空间中创建函数的问题-在jQuery处理程序之外。全局词指向它的含义[全局]。我假设全局函数可以从每个java脚本节访问,但当您仅在脚本顶部定义时,情况并非如此。我提到了一个{inside img element作为onclick的示例=“$.Function()”}。毕竟,否决票只是为了帮助用户确定最佳答案。真诚地说。答案是肯定的,但缺少括号@Andrew