Как я могу сделать функцию, определенную в 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;
}
И тогда вы сможете называть его из любого места.