Как я могу сделать функцию, определенную в jQuery.ready доступной по всему миру?

У меня есть функция, которая удаляет идентификатор youtube с URL-адреса. Затем я хочу использовать эту функцию 10 раз на странице (в цепочке wordpress).

Эта функция отлично работает, когда я кормлю ее URL-адресом в теге функции script, но когда я запускаю новый набор тегов 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 не определен, что имеет смысл, потому что его нет. Могу ли я "глобально" объявить эту функцию?

Ответ 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;  

};  

Вы также можете прочитать этот вопрос об использовании var functionName = function () {} vs function functionName() {} и в этой статье о переменной области.

Ответ 2

Еще один вариант - повесить функцию непосредственно из объекта jQuery. Таким образом, вы избегаете загрязнения глобального пространства имен:

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

Затем вы можете получить его с помощью "$.getlist(url, key)"

Ответ 3

объявить getList() вне функции ready().

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

Просто определите его как регулярную функцию в верхней части вашего script:

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

Ответ 5

Вы можете просто добавить свою функцию в переменную $.fn:

function ($) {

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

}(jQuery));

Пример использования:

$.getList();

Это то, что вы обычно делаете, создавая Основной плагин для jQuery.

Ответ 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;
}

И тогда вы сможете называть его из любого места.