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

wes*_*bos 65 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"));


      });
Run Code Online (Sandbox Code Playgroud)

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

 <script type="text/javascript"> 

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

Firebug给我getList没有定义哪个有意义,因为它没有.我可以'全局'宣布这个功能吗?

And*_*y E 101

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

window.getList = function(url, gkey){ 
    // etc...
}
Run Code Online (Sandbox Code Playgroud)

或者将它从文档就绪事件处理程序内部移动到全局范围:

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

};  
Run Code Online (Sandbox Code Playgroud)

您可能还想阅读有关使用vs的这个问题,以及有关变量范围的本文.var functionName = function () {}function functionName() {}


Poi*_*nty 44

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

jQuery.getlist = function getlist(url, gkey) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

然后你可以用"$ .getlist(url,key)"来获取它


小智 8

在ready()函数之外声明getList()..

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

现在,getList可以在代码中的任何位置工作:

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

问题是,getList(.)函数的范围.


mil*_*sky 5

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

(function ($) {

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

}(jQuery));
Run Code Online (Sandbox Code Playgroud)

用法示例:

$().getList();
Run Code Online (Sandbox Code Playgroud)

这是您在为 jQuery 创建基本插件时通常会执行的操作。