如何在全局提供jQuery.ready中定义的函数?

时间:2010-02-08 16:58:10

标签: javascript jquery

我有一个功能可以从网址中删除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"));


      });

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

 <script type="text/javascript"> 

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

Firebug给了我 getList未定义这是有道理的,因为它没有。我可以'全局'声明这个功能吗?

6 个答案:

答案 0 :(得分:101)

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

};  

您可能还想阅读this question关于使用var functionName = function () {} vs function functionName() {}this article关于变量范围的信息。

答案 1 :(得分:44)

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

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

然后你可以用“$ .getlist(url,key)”

来获得它

答案 2 :(得分:8)

在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(。)函数的范围。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

您只需在$.fn变量中添加您的功能:

(function ($) {

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

}(jQuery));

使用示例:

$().getList();

这是您在为jQuery创建Basic Plugin时通常会执行的操作。

答案 5 :(得分:-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;
}

然后你应该可以从任何地方打电话。