【问题标题】:How can I make a function defined in jQuery.ready available globally?如何使 jQuery.ready 中定义的函数在全球范围内可用?
【发布时间】:2010-02-08 16:58:09
【问题描述】:

我有一个函数可以将 youtube id 从 url 中剥离出来。然后我想每页使用这个函数 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 is not defined 这是有道理的,因为它没有。我可以“全局”声明这个函数吗?

【问题讨论】:

  • 很抱歉格式不好,每次我编辑代码时,结果都很奇怪。代码有效。
  • 顺便说一句 - 在 document.ready 中声明它意味着它仅在文档准备好(加载页面后)时定义,因此您应该在确定它已定义时调用该函数。如果声明本身在您尝试使用它之后运行,则将其声明为全局对象可能还不够。

标签: javascript jquery


【解决方案1】:

您有两个选择,将其添加到 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 () {}function functionName() {}this article 了解变量范围。

【讨论】:

    【解决方案2】:

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

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

    然后你可以用 "$.getlist(url, key)" 得到它

    【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      示例用法:

      $().getList();
      

      这是您在为 jQuery 创建 Basic Plugin 时通常会做的事情。

      【讨论】:

      • 回答好,但错过了括号@Andrew
      【解决方案5】:

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

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

      【讨论】:

      • 不管这是真的,但这不是一个好的解决方案,例如在这种情况下,您在其他页眉中定义了 jQuery 函数,并且您想在 img 元素中使用它作为 onclick="$.Function()" ,其他答案一定更好。
      • 不确定我是否理解您的评论(并投反对票)。这段代码回答了如何在全局命名空间中创建函数的问题 - 在 jQuery 处理程序之外。
      • Globally word point 的意思是[Globally]。我假设可以从每个 java 脚本部分访问全局函数,但是当您仅在脚本顶部定义时,情况并非如此。我提到了 {inside img element as onclick="$.Function()"} 的示例。毕竟,否决票只是为了帮助用户确定最佳答案。真诚的。
      【解决方案6】:

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

      然后你应该可以从任何地方调用它。

      【讨论】:

      • 这毫无意义。如果他使用 jQuery,那是有原因的,为什么不再使用它呢?更重要的是 - 在 $(document).ready 事件中声明某些内容可确保您加载整个页面,这有时是必不可少的。当然,将 document.ready 声明与此范围之外的调用函数混合可能很糟糕,但简单地删除 jQuery 调用并不是一个解决方案。您至少应该解释为什么删除 jquery 是好的。
      • 更新:好的,我被抬高了,你的回答其实还不错。但它缺乏的是解释将它移到 document.ready 范围之外的好处和危险是什么,vetween var x = function(...) 和 function x(...) 声明的区别等等。没有它,它就像魔术一样 - 解决了一个特定问题,但不知道它为什么起作用。
      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 2021-06-07
      • 2016-09-30
      • 2019-05-05
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多